python中生成器

2021-09-19 04:57:28 字數 3457 閱讀 8410

生成器

生成器generator

生成器函式generator

m=(i for i in range(5))  #定義乙個生成器

print(type(m)) #判斷m的型別,是乙個生成器

print(next(m)) #使用next函式

def inc():    # 定義乙個inc函式

for i in range(5):

yield i

print(type(inc)) #輸出inc函式的型別,是乙個功能模組

print(type(inc())) #輸出inc函式物件的型別,是乙個生成器

g=inc() #將函式物件賦給g,即將生成器賦給g

type(g) #輸出變數g的型別,是乙個生成器

next(g) #使用next函式輸出生成器的值,每次輸出乙個,都輸出完後,繼續執行報錯

for x in g: #使用迴圈能全部輸出

生成器的執行

def gen():

print('line 1')

yield 1

print('line 2')

yield 2

print('line 3')

return 3

yield 4

next(gen())   # 列印'line 1',在yield 1出暫停,輸出1

next(gen()) # 與上面結果相同,相當於重新呼叫gen函式

g=gen()    #相當於將生成器賦給g

print(next(g)) #引用生成器

print(next(g)) #引用生成器

print(next(g)) #stopiteration

print(next(g,'end')) #沒有元素給預設值

生成器函式

生成器應用

無限迴圈

def counter():

i=0while true:

i+=1

yield i

c=counter() #counter()是乙個生成器

計數器

def inc():

def counter():

i=0while true:

i+=1

yield i

c=counter()

return next(c)

print(inc()) #相當於一直重新執行inc()函式,counter一直被重新定義初始化

return next(c) #2 #1,2,3可以合併成return lambda :next(c)

return inner #3

foo=inc() #inc()是乙個生成器

斐波那契數列

生成器互動

python提供了乙個和生成器物件互動的方法send,該方法可以和生成器溝通。

#重置功能的計數器

def inc():

def counter():

i=0while true:

i+=1

response =yield i

if response is not none:

i=response

c=counter()

return lambda x=false: next(c) if not x else c.send(0)

協程 coroutine

有2個生成器a、b

next(a)後、a執行到了yield語句暫停,然後去執行next(b)、b執行到yield語句也暫停,然後再次呼叫next(a),再呼叫next(b)、周而復始,就實現了排程的效果

可以引入排程的策略來是實現切換的方式

yield from語法

從python 3.3開始增加了yield from語法,使得yield from iterable 等價於 for item in iterable : yield item

def inc():

for x in range(1000):

yield x

def inc():

yield from range(1000)

python中生成器yield

def yield demo for x in range 3 yield x print 生成器後一行 a yield demo print a 這裡的a是乙個生成器物件 可以用for迴圈來遍歷生成器物件裡的元素 for i in a print i 那麼yield的工作過程是怎麼樣的呢?可以通過...

python中生成器的使用

在python中我們常聽到迭代器和生成器,但是本人分開來介紹,只為告訴大家迭代器和生成器不是乙個東西,在上篇文章中我們詳細的介紹過迭代器和可迭代物件,本章重點介紹生成器。對於呼叫乙個普通的python函式,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式所有語句執行完畢。一旦函式...

python中生成器的應用

生成器的應用 實現多工 import time def task 1 while true print 1 time.sleep 0.1 yield def task 2 while true print 2 time.sleep 0.1 yield task 1 task 2 def main t...