20函式 生成器(generator)

2022-06-18 04:00:11 字數 3910 閱讀 7010

生成器(generator)是迭代器()的一種,其本質上就是迭代器

分為生成器函式、生成器表示式

1、生成器函式

只要函式內部含有yield關鍵字,那麼函式名()的結果就是生成器,並且不會執行函式內部**

例1:

def

func():

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)

print

(next(g))

print

(next(g))

print

(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()

def

eater():

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對應生成器的初始化操作

def

init(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

')

def

init(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是函式的返回值

print

(food_list)

g = eater() #

這時候的 g 已經是裝飾器裡「初始化」後返回的 g 了

g.send('

aaa'

)g.send(

'bbbb')

g.close()

#結束迭代

5、最簡單的生產者消費者

import

time

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

print

(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...