1. 程式人生 > >Python學習筆記__3.4章 生成器

Python學習筆記__3.4章 生成器

編程語言 Python

# 這是學習廖雪峰老師python教程的學習筆記

1、概覽

列表元素按照某種算法推算出來,在循環的過程中不斷推算出後續的元素。這種一邊循環一邊計算的機制,稱為生成器:generator

1.1、創建 generator

1)方法一

只要把一個列表生成式的[]改成(),就創建了一個generator

L = [x * x for x in range(10)] # 這是列表生成式

g = (x * x for x in range(10)) # 這是generator

>>> g

<generator object <genexpr> at 0x1022ef630>

generator

的值不能直接打印,需要用 next()函數獲得,或者通過for循環打印

  • next(g)

每調用一次,返回一個generator的值,當所有值返回完畢後,再調用會報錯StopIteration

  • for 循環

>>> for n in g:

... print(n)

2)方法二

在函數體中,有 yield。當然,generator的函數,也可以用 next() 或者 for 循環獲取返回值

函數是順序執行,遇到return語句或者最後一行函數語句就返回

generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行

def odd():

print('step 1')

yield 1

print('step 2')

yield(3)

print('step 3')

yield(5)

>>> o = odd()

>>> next(o) # next(odd()) 調用效果一樣。for循環調用見例題

step 1

1

>>> next(o)

step 2

3

>>> next(o)

step 3

5

2、例題

1、編寫一個生成斐波那契數列的 generator 函數

# 函數編寫

def fib(max):

n, a, b = 0, 0, 1

while n < max:

yield b

a, b = b, a + b

n = n + 1

return 'done'

# for循環獲取返回值,但獲取不到generator 執行完的報錯返回

f=fib(6) # 定義一個generator對象 f

for n in f:

print(n)

# 獲取值得同時,獲取generator的報錯返回

g=fib(6)

while True:

try:

x=next(g)

print('g',x)

except StopIteration as e: # 捕捉錯誤

print('Generator return value:',e.value) # 輸入錯誤的返回值

break

2、編寫一個楊輝三角的generator函數

# -*- coding: utf-8 -*-

def triangles():

N=[1]

while True:

yield N #generator函數與普通函數的差別:在執行過程中,遇到yield就中斷,下次又繼續執行

N.append(0)

N=[N[i-1] + N[i] for i in range(len(N))] #楊輝三角的生成式

if __name__ == '__main__': # 如果是運行的.py文件,就執行下面的命令。調試用

n=0

for t in triangles():

print(t)

n=n+1

if n == 10:

break


Python學習筆記__3.4章 生成器