Python生成器generator用法示例
本文實(shí)例分析了Python生成器generator用法。分享給大家供大家參考,具體如下:
生成器generator本質(zhì)是一個(gè)函數(shù),它記住上一次在函數(shù)體中的位置,在生成器函數(shù)下一次調(diào)用,會(huì)自動(dòng)找到該位置,局部變量都保持不變
l = [x * 2 for x in range(10)] # 列表生成式 g = (x * 2 for x in range(10)) print(l,g) # l打印的是一個(gè)列表,g則是一個(gè)generator的內(nèi)存地址
一次性打印獲取generator的所有元素:
for index in g: print(index)
逐步獲取generator的元素:
print(g.__next__()) # 0 print(g.__next__()) # 2 print(g.__next__()) # 4 print(g.__next__()) # 6 print(g.__next__()) # 8
yield關(guān)鍵字
通常我們做一個(gè)打印0-50的數(shù)時(shí),會(huì)定義一個(gè)函數(shù),只要調(diào)用這個(gè)函數(shù),它就會(huì)自定打印0-50的數(shù)
def fib(num):
n = 0
while n < num:
print(n)
n+=1
fib(50)
其實(shí)我們只需要改動(dòng)那么一丟丟,就可以將上面那個(gè)函數(shù)改變成一個(gè)generator
def fib(num):
n = 0
while n < num:
yield n # 在使用yield關(guān)鍵字時(shí),需在前面先定義一個(gè)變量n
n+=1
g = fib(50) # 此時(shí)的g是一個(gè)generator
generator原理:通過某一種特定的算法,在一個(gè)特定的條件下,不斷向下推算,得出后續(xù)的元素。因?yàn)間enerator不必創(chuàng)建list,所以可以大大的節(jié)約內(nèi)存空間。舉個(gè)栗子:
def fib():
print("step 1")
yield 1
print("step 2")
yield 2
print("step 3")
yield 3
g = fib()
g.__next__() # 結(jié)果:step 1
g.__next__() # 結(jié)果:step 2
g.__next__() # 結(jié)果:step 3
根據(jù)結(jié)果可以看出,每次執(zhí)行next(),都會(huì)打印一句,而遇到yield就直接跳出,并記錄位置,再次執(zhí)行next()時(shí),會(huì)從記錄的那個(gè)位置開始往下執(zhí)行,再次遇到yield時(shí)跳出。
此時(shí)我們不經(jīng)會(huì)想,如果我們不斷的調(diào)用next(),該如何判斷是否已經(jīng)完畢,如果越界了,是否會(huì)報(bào)錯(cuò)?
# -* coding:utf-8 -*-
#! python3
'''
Created on 2018年8月10日
@author: Administrator
'''
def fib(num):
n = 0
while n < num :
yield n
n+=1
g = fib(10)
while True:
print(g.__next__())
執(zhí)行結(jié)果:

可以看出當(dāng)遍歷完畢之后,如果在此調(diào)用next()將會(huì)報(bào)錯(cuò),我們是無法獲取到遍歷的下標(biāo)的,那么我們?cè)撊绾我?guī)避這個(gè)錯(cuò)誤呢?對(duì)next()拋異常處理
def fib(num):
n = 0
while n < num :
yield n
n+=1
g = fib(10)
while True:
try:
print(g.__next__())
except StopIteration:
print("已經(jīng)完畢")
break
此時(shí)將不再報(bào)錯(cuò),當(dāng)越界的時(shí)候,系統(tǒng)會(huì)自動(dòng)捕捉該異常,并且打印你想要輸出的信息
send方法
在單線程下實(shí)現(xiàn)一個(gè)簡單的并行效果
# -*- coding:utf-8 -*-
#! python3
'''
Created on 2018年8月10日
@author: Administrator
'''
import time
def startEat(name):
print("%s準(zhǔn)備開始吃包子了"%name)
while True:
b = yield
print("%s被%s吃了"%(b,name))
def startMake():
laowang = startEat("laowang")
laowang.__next__()
for index in range(10):
time.sleep(1)
print("已經(jīng)做好了包子%d號(hào)"%index)
laowang.send("包子%d號(hào)"%index)
startMake()
執(zhí)行結(jié)果:

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python列表(list)操作技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python干貨實(shí)戰(zhàn)之八音符醬小游戲全過程詳解
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Python實(shí)現(xiàn)一個(gè)八音符醬小游戲,大家可以在過程中查缺補(bǔ)漏,提升水平2021-10-10
Python使用random.shuffle()打亂列表順序的方法
今天小編就為大家分享一篇Python使用random.shuffle()打亂列表順序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
解決Python報(bào)錯(cuò)問題[SSL:?SSLV3_ALERT_HANDSHAKE_FAILURE]
這篇文章主要介紹了解決Python報(bào)錯(cuò)問題[SSL:?SSLV3_ALERT_HANDSHAKE_FAILURE],具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
python繪制風(fēng)場(chǎng)方向和大小quiver問題
這篇文章主要介紹了python繪制風(fēng)場(chǎng)方向和大小quiver問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

