7.ジェネレータ、リストが導出される式

19.1ジェネレータの知人
  • ジェネレータは、基本的にイテレータです。PythonのコミュニティBuilderはイテレータです。ジェネレータとイテレータの唯一の違い:Builderは、私たち自身の使用のPythonコードのビルドです。
19.2ジェネレータ機能
def func():
    print(111)
    return 2
ret=func()
print(ret)
#执行此函数,遇到return结束函数。
将数字2返回给ret.
def func():
    print(111)
    yield 2
ret=func()#生成器对象
print(ret)#<generator object func at 0x0000005D8A538468>
'''
类比
l1 = [2,]  [2,3,4,5]
obj = iter(l1)

'''
只要函数中出现了yield那么他就不是函数,它是生成器函数。
一个next对应一个yield
print(next(ret))
'''
111
2
'''

降伏関数を直接構築することができる、あなたは、反復イテレータに発電機にオブジェクトをイテレータのメモリを占有する必要があります。

19.3リターン収量の比較:

端部リターン機能、実行機能の戻り値(タプルの複数の形で返される値)

ストール機能を得、次に対応する戻り値(値は、タプルの複数の形で返されます)

例えば:

産出

def eat_baozi():
    list1 = []
    for i in range(1,2001):
        list1.append(f'{i}号包子')
    return list1

print(eat_baozi())

def eat_baozi_gen():
    for i in range(1,2001):
        # print(11)
        yield f'{i}号包子'
ret = eat_baozi_gen()

for i in range(200):
    print(next(ret))

for i in range(200):
    print(next(ret))
'''
1号包子
2号包子
3号包子
4号包子
5号包子
6号包子
7号包子
8号包子
9号包子
10号包子
11号包子
'''
400号包子

'''
def func():
    l1 = [1, 2, 3]
    yield l1
ret = func()
'''
[1, 2, 3]

'''
から19.4収量
def func():
    l1 = [1, 2, 3]
    yield from l1

    '''
    yield 1
    yield 2
    yield 3
    '''
ret = func()
print(next(ret))
print(next(ret))
print(next(ret))
'''
1
2
3
'''
yield : 对应next给next返回值
yield from 将一个可迭代对象的每一个元素返回给next
yield from 节省代码,提升效率(代替了for循环)

20.リストの内包表記

l1 = [1,2,3......100]
l1 = []
for i in range(1,101):
    l1.append(i)
print(l1)
列表推导式:
l1=[i for i in range(1,101)]
print(l1)
两种构建方式:
1.循环模式:[变量(加工后的变量) for 变量 in interable]
2.筛选模式:[变量(加工后的变量) for 变量 in interable if 条件] 

例:

循环模式:
将10以内所有整数的平方写入列表。
print([i**2 for i in range(1, 11)])
100以内所有的偶数写入列表.
print([i for i in range(2, 101, 2)])
从python1期到python100期写入列表list
print([f'python{i}期' for i in range(1, 101)])
2.筛选模式:
print([i for i in range(1, 101) if i > 49])
三十以内可以被三整除的数。
print([i for i in range(1, 31) if i % 3 == 0])
过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
l1 = ['barry', 'fdsaf', 'alex', 'sb', 'ab']
print([i.upper() for i in l1 if len(i) > 3])

找到嵌套列表中名字含有两个‘e’的所有名字(有难度)
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
l1 = []
for i in names:
    for j in i:
        if j.count('e') > 1:
            l1.append(j)
print(l1)
print([j for i in names for j in i if j.count('e') > 1])
列表推导式的优缺点:
优点:    
1, 简单,快捷,装b。
缺点:  
2. 可读性不高,不好排错。慎用,不要入迷。

21.ジェネレータ式。

そして、リストはほとんど同じ内包します。
ループモード、フィルタモード。

``のpython
OBJ =(I iに対して範囲内で(1、11))
プリント(OBJ)
プリント(次(OBJ))
プリント(次(OBJ))
プリント(次(OBJ))
プリント(次(OBJ))
プリント(次(OBJ))
プリント(次(OBJ))
プリント(次(OBJ))
プリント(次(OBJ))
プリント(次(OBJ))
プリント(次(OBJ))
プリント(次(OBJ))
如何触发生成器(迭代器)取值?

  1. 次の(OBJ)
  2. 循环用
    I OBJ内用:
    プリント(I)
  3. データ
    の印刷(リスト(OBJ))
    ジェネレータ式:Builderは、メモリを節約

おすすめ

転載: www.cnblogs.com/pythonblogs/p/11085016.html