生成器介紹
在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。
生成器的功能:把函式結果做成迭代器(以一種優雅的方式封裝好iter,next)。提供了一種自己定義迭代器的方式。
使用生成器建立乙個迭代器:
def a():
print('a')
yield 11 # 使用yield,執行後返回,類似於return,但是直接執行函式會生成乙個迭代器
print('b')
yield 22
print('c')
yield '33'
g=a()
for i in g: # i=iter(g) g=next(i) #這裡只執行迭代過程,迭代的內容是乙個函式
pass
輸出結果:ab
c此處的i做為迭代器中的乙個元素,在執行之後會將yield的返回值,賦值給i,列印i就可以得到返回值:
def a():
print('a')
yield 11
print('b')
yield 22
print('c')
yield '33'
g=a()
for i in g: # i=iter(g) next(i)
print(i)
執行結果:ab
c生成器作用
使用生成器建立迭代器,在使用大容量列表或者對大檔案進行操作的時候為了避免記憶體被耗盡會使用迭代器的方式去實現。
建立迭代器:
def my_rang(start,stop):
while true:
if start == stop:
raise stopiteration # 主動丟擲乙個異常,結束迭代器。
yield start
start+=1
g=my_rang(1,10)
for i in g:
print(i)
yield與return的比較
都有返回值的功能,return只能返回一次值,yield能返回多次值。
yield的功能:
把函式的結果做成迭代器(以一種優雅的方式封裝好iter,next)
函式暫停與再繼續執行的狀態是由yield提供的。
生成器與迭代器的應用
讀取檔案,模擬linux 系統中的tail 功能。
import time
def tail(filename):
with open(filename,'r') as f:
f.seek(0,2)
while true:
line=f.readline()
if line:
yield (line)
else:
time.sleep(0.3)
for g in tail('a.txt'):
print(g)
當向檔案中追加內容時,會自動顯示追加的新內容。
同理,如果實現管道功能,使用grep類似的功能,只需新增乙個grep 函式即可:
import time
def tail(filename):
with open(filename,'r') as f:
f.seek(0,2)
while true:
line=f.readline()
if line:
yield (line)
else:
time.sleep(0.3)
def grep(patten,lines):
for line in lines:
if patten in line:
print(line,end='')
grep('error',tail('a.txt'))
這樣就避免了占用過大記憶體的情況,記憶體中只儲存一行資料.
python生成器好處 Python生成器筆記
python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...
python生成器函式 Python 生成器函式
一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...
python yield 生成器 的作用
編譯器 中最初級的模組是進行詞法分析,將源 轉化成 token流。可以 一次性將所有 字元轉換成token list 之後再處理 也可以每次獲取乙個 token,處理之後,接著再獲取下乙個token,即邊分析邊處理,這就需要token函式 記錄 當前分析的 狀態,一種是將狀態 由外部呼叫者 傳入,一...