iT邦幫忙

2023 iThome 鐵人賽

DAY 25
0
Software Development

Python 微進階系列 第 25

Python 微進階 Day25 - generator(產生器)

  • 分享至 

  • xImage
  •  

generator(產生器)

  • generator(產生器) 的函式可定義一個可走訪的 generator object
  • 相比 list 等,可以佔用比較小的記憶體,資料是動態產生的,每個只能呼叫一次,超過範圍就會跳錯
  • 函式內回傳資料需使用 yield,到 yield 後回傳,等到下次的呼叫才會繼續執行後續
  • 可使用迴圈來取出值,或是使用 next() 來取值,若使用 while 迴圈就會搭配一個判斷式避免無限迴圈
def a():
    yield 3
    print("now 3")
    yield 2
    print("now 2")

b = a()

print(b)
# generator object
# 一個產生器的物件

print(next(b))
3
# 利用 next() 到第一個 yield 後跳出

print(next(b))
now 3
2
# 繼續執行後續,印出 now 3
# 到第二個 yield 後跳出

c = a()
for i in c:
    print("i", i)
i 3
now 3
i 2
now 2
# 利用 for 迴圈把資料逐一印出
def g(max):
    n = 0
    a = 2
    while n<max:
        print("n", n)
        yield(a)
        a = a * 2
        n = n + 1

f = g(3)
print(f)
# generator object
# 一個產生器的物件
print(next(f))
# n 0
# 2
print(next(f))
# n 1
# 4
print(next(f))
# n 2
# 8
print(next(f))
# 跳錯,超過範圍
# most recent call last

yield from

  • Python 3.3 版本後,可以使用 yield from 來將多個產生器串在一起
def subgen(x):
    for i in range(x):
        print("sub", i)
        yield i

def gen(y):
    print("gen")
    yield from subgen(y)

for g in gen(3):
    print(g)

# gen
# 後續因 yield from 而進入 subgen()
# sub 0
# 0
# sub 1
# 1
# sub 2
# 2

參考資料

次回

來談談 lambda(匿名函式)


上一篇
Python 微進階 Day24 - decorator(修飾器)
下一篇
Python 微進階 Day26 - lambda(匿名函式)
系列文
Python 微進階31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言