day10 生成器

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]

生成器表達式:

就是把[]改為()即可


分享到:


相關文章: