《Python高階程式設計》(三)生成器

2021-09-07 19:43:24 字數 3520 閱讀 5553

生成器是乙個函式,它並不執行並返回乙個單一值,而是按照順序返回乙個或多個值

生成器函式的特徵就是在函式內部有乙個或多個yield語句。

python 2中,yield和return不能共存;python 3中可同時存在。

yield語句:命令函式返回乙個值給呼叫者,但不會終止函式的執行。執行會暫時停頓直到呼叫**重新恢復生成器,在停止的地方再次開始執行。

import time

def fib():

numbers =

while true:

if len(numbers) < 2:

else:

numbers.pop(0)

yield numbers[-1]

f = fib()

for i in f:

print i

time.sleep(1)

乙個求平凡的生成器

def squares():

cursor = 1

while true:

yield cursor ** 2

cursor += 1

sq = squares()

print sq.next() # 1

print sq.next() # 4

該生成器是單向的,send方法允許生成器反向溝通

def squares1(cursor=1):

while true:

response = yield cursor ** 2

if response:

cursor = int(response)

else:

cursor += 1

sq = squares1()

print sq.next() # 1

print sq.next() # 4

print sq.send(7) # 49;值7傳送給生成器,賦給cursor變數

print sq.next() # 64

print next(range(5)) #是迭代器,但不是生成器

typeerror: list object is not an iterator

print range(5).__iter__()

dictionary = 

iterator = iter(dictionary.items())

print next(iterator)

print next(iterator)

執行結果:

(『foo』, 『bar』)

(『baz』, 『bacon』)

>>> z = zip(['a','b','c','d'], ['x','y','z'])

>>> next(z)

('a', 'x')

>>> next(z)

('b', 'y')

>>> next(z)

('c', 'z')

>>> next(z)

traceback (most recent call last):

file "", line 1, in next(z)

stopiteration

>>> m = map(lambda x,y: max([x,y]), [4,1,7], [3,4,5]) 

>>> m

>>> next(m)

4>>> next(m)

4>>> next(m)

7>>> next(m)

traceback (most recent call last):

file "", line 1, in next(m)

stopiteration

>>> f = open('aa.txt') #open函式返回的結果物件除了其他身份外,還是個生成器

>>> next(f)

'one line\n'

>>> next(f)

'two line\n'

>>> next(f)

traceback (most recent call last):

file "", line 1, in next(f)

stopiteration

很多生成器是單例模式;簡單的生成器函式不是單例模式

class fabonacci(object):

def __init__(self):

self.numbers =

def __iter__(self):

return self

def __next__(self):

if len(self.numbers) < 2:

else:

self.numbers.pop(0)

return self.numbers[-1]

def send(self, value):

pass

# for python2 compatibility

next = __next__

f = fabonacci()

i1 = iter(f)

print next(i1)

print next(i1)

i2 = iter(f)

print next(i2)

執行結果:11

2

>>> def gen1():

yield 'foo'

yield 'bar'

>>> def gen2():

yield 'spam'

yield 'eggs'

>>> def full_gen():

for word in gen1():

yield word

for word in gen2():

yield word

>>> def fuu_gen2(): #僅python3.3以上版本支援

yield from gen1() #生成器委託

yield from gen2()

>>> f =full_gen()

>>> for i in f:

print i

syntaxerror: missing parentheses in call to 'print'. did you mean print(i)?

>>> for i in f:

print (i)

foobar

spam

eggs

>>> f = fuu_gen2()

>>> for i in f:

print (i)

foobar

spam

eggs

python高階(11)生成器

利用迭代器,我們可以在每次迭代獲取資料 通過next 方法 時按照特定的規律進行生成。但是我們在實現乙個迭代器時,關於當前迭代到的狀態需要我們自己記錄,進而才能根據當前狀態生成下乙個資料。為了達到記錄當前狀態,並配合next 函式進行迭代使用,我們可以採用更簡便的語法,即生成器 generator ...

python3生成器 Python3 生成器

python3 生成器 閱讀 125 發布於 2020 05 19 14 29 25 在python中,一邊迴圈一邊計算出元素的機制,稱為生成器 generator。生成器的優點 一次返回乙個結果,延遲計算。這對於大資料量處理,是個非常有用的優勢。占用記憶體量是工程師必須考慮的乙個問題。提高 可讀性...

Python(九)生成器

該系列文章用來記錄一下自己在b站學習python時,進行上機練習用的 使用 pycharm 2020.3.3 慕課 python語言基礎與應用 北京大學 陳斌 字幕校對 編寫程式,輸入兩個數,輸出它們的商,採用例外處理來處理兩種錯誤,給出使用者友好的提示資訊 1 除數為0 2 輸入了非數值 try ...