生成器是乙個函式,它並不執行並返回乙個單一值,而是按照順序返回乙個或多個值
生成器函式的特徵就是在函式內部有乙個或多個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 ...