生成器(generator)是迭代器()的一種,其本質上就是迭代器
分為生成器函式、生成器表示式
1、生成器函式
只要函式內部含有yield關鍵字,那麼函式名()的結果就是生成器,並且不會執行函式內部**
例1:
deffunc():
print('
--------first')
yield 1 #
相當於return,是第一次__next__()的返回值,會儲存函式的執行狀態掛起函式
print('
---------second')
yield 2
print('
---------third')
yield 3
print('
end'
)g = func() #
不會執行**
print(g) #
## 生成器內含__iter__()、__next__()方法,所以生成器就是迭代器。接上面函式,得到函式結果
print(g.__next__
())print(g.__next__
())#
或者用for迴圈迭代
for i in
g:
print(i)
2、模擬實現range()
def my_range(start, stop, setp=1):while start yield
start
start +=setp
g = my_range(1,8,2)
(next(g))
(next(g))
(next(g))
print(next(g))
3、模擬實現 tail -f | grep '404'
#tail 命令可用於檢視檔案的內容,引數 -f 常用於查閱正在改變的日誌檔案。
#grep 命令用於查詢檔案裡符合條件的字串
import
time
deftail(filepath):
with open(filepath,'rb
') as f:
f.seek(0, 2) #
使用seek()方法,則檔案開啟方式必須是'rb'(這句話錯了。。。),0為偏移量, 2表示從檔案末尾算起
while
true:
line =f.readline()
ifline:
yield
line
else
: time.sleep(2)
defgrep(pattern, lines):
for line in
lines:
line = line.decode('
utf-8')
if pattern in
line:
yield
line
for line in grep('
404', tail('
data.txt
')):
print(line)
4、send()
defeater():
print('
ready to eat')
while true: #
感覺這裡一般都要有乙個死迴圈,用來持續接收g.send()
food = yield
#1 yield相當於函式的return 2、food = yield,接受send()傳過來的值,賦值給food,並讓生成器繼續向下執行
print('
eat the food:【{}】...
'.format(food))
g =eater()
next(g)
#需要事先「初始化」一次,讓函式掛起在food=yield,等待呼叫g.send()方法為其傳值
g.send('包子'
)g.send(''
)g.send(
'orange
')
可以用裝飾器來完成為所有表示式形式yield對應生成器的初始化操作
definit(func):
g = func(*args, **kwargs)
next(g)
#完成首次的「初始化」
return
g
return
@init
#eater=init(eater)
defeater():
print('
ready to eat')
while
true:
food = yield
print('
eat the food:【{}】...
'.format(food))
g =eater()
g.send(
'ccccc')
g.send(
'hhhhh
')
definit(func):
g = func(*args, **kwargs)
next(g)
#完成首次的「初始化」
return
g
return
@init
defeater():
print('
ready to eat...')
food_list =
while
true:
food = yield food_list #
後面g.send('aaa')的值傳送給yield=food,後面的food_list是函式的返回值
(food_list)
g = eater() #
這時候的 g 已經是裝飾器裡「初始化」後返回的 g 了
g.send('
aaa'
)g.send(
'bbbb')
g.close()
#結束迭代
5、最簡單的生產者消費者
importtime
definit(func):
g = func(*args, **kwargs)
next(g)
#完成首次的「初始化」
return
g
return
@init
defconsumer(name):
print('
i am {}, ready to eat....
'.format(name))
while
true:
food = yield
(food)
print('
{} eating...
'.format(name))
defproducer():
c1 = consumer('cc'
)#這裡就是執行了consumer(),函式掛起在food=yield,等待呼叫g.send()方法為其傳值
c2 = consumer('dd'
)
for i in range(10):
c1.send(
'生產了包子{}
'.format(i))
c2.send(
'生產了包子{}
'.format(i))
time.sleep(2)
producer()
ES6新特性之生成器函式 generator
一 什麼是生成器函式?生成器函式是es6的新特性之一,它是乙個在執行時能中途暫時退出,後面重新呼叫又能重新進入繼續執行的一種函式。並且在函式內定義的變數的所有狀態不受中途退出的影響。二 語法 宣告方式 function 函式名 引數1 引數2 引數n 呼叫說明 1 呼叫生成器物件時會返回乙個生成器的...
python生成器函式 Python 生成器函式
一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...
生成器函式
pyhon優雅的魔力使生成器函式很特殊,它們像定格相機一樣工作。當乙個標準函式遇到return語句時,它會返回值,然後函式會丟棄內部的所有資料。當下次呼叫時,一切從頭開始。yield語句會做不同的事情。它像return一樣返回乙個值,但是它不會使函式丟棄資料,相反所有資料都被儲存起來。usr bin...