1 生成器函數,yield與yield from的用法
2 生成器表達式與列表推導式
3 python內部提供的一些
生成器:實際上就是迭代器,唯一的不同之處在於生成器是自己定義的迭代器。
一 生成器函數
函數中有yield關鍵字,就說明該函數是一個生成器函數。具體的用法與return比較相似。下面是對比
def func():
print("start")
return 3
ret=func()
print(ret) //輸出3
def func1():
print("start")
yield 3
a=2
b=3
c=a+b
yield 4
ret=func1()
print(ret) //會輸出一個內存地址
print(next(ret)) //輸出3
這是因為函數中一旦有了yield,那麼就會返回一個生成器,並賦值給ret,此時函數並不會執行。需要在調用next的時候才會執行,執行到yield 3處,會把3作為返回值傳遞給調用者。當繼續執行next(ret)時就會從上次結束的地方繼續運行函數。一個next與一個yield一一對應。
return與yield的區別:
return:函數中只存在一個return結束函數,並且給函數的執行者返回值。
yield:只要函數中有yield那麼它就是生成器函數而不是函數了。生成器函數中可以存在多個yield,yield不會結束生成器函數,一個yield對應一個next。
一個更加直觀的比較
def func():
l1 = []
for i in range(1,5001):
l1.append(f'{i}號包子')
return l1
ret = func()
print(ret)
def gen_func():
for i in range(1,5001):
yield f'{i}號包子'
ret = gen_func()
# [3號包子.]
for i in range(200):
print(next(ret))
for i in range(200):
print(next(ret))
二 列表推導式與生成器表達式
列表推導式:
循環模式:
l1=[i for i in range(1,30)]
篩選模式:
l1=[i **3 for i in range(1,31) if i%3==0]
生成器表達式:
就是把[]改為()即可