python之yield和Generator深入解析
首先我們從一個小程序?qū)?,各定一個list,找出其中的素?cái)?shù),我們會這樣寫
import math
def is_Prims(number):
if number == 2:
return True
//除2以外的所有偶數(shù)都不是素?cái)?shù)
elif number % 2 == 0:
return False
//如果一個數(shù)能被除1和本身之外的數(shù)整除,則為合數(shù)。其實(shí)我們的判定范圍到根號n就可以
for cur in range(2,int(math.sqrt(number))+1,2):
if number % cur == 0:
return False
else:
return True
def get_Prims(input_list):
result_list = list()
for element in input_list:
if is_Prims(element):
result_list.append(element)
return result_list
aa = get_Prims([1,2,3,4,5,6,7,8,9])
print (aa)
但如果我們想給定一個數(shù),然后列出比這個數(shù)大的所有素?cái)?shù)呢?我們可能這樣寫:
def get_Prims(number):
if is_Prims(number):
return number
但是一旦return函數(shù)將控制權(quán)交給調(diào)用者后徹底結(jié)束,任何局部變量和函數(shù)工作都被丟棄,下一次調(diào)用又會從頭開始。因此我們就可以用一下寫法:
def get_Prims(number):
while(True):
if is_Prims(number):
yield number
number += 1
def get_numbers():
total = list()
for next_prim in get_Prims(2):
if next_prim < 100:
total.append(next_prim)
else:
print(total)
return
get_numbers()
下面解釋一下generator函數(shù),一個函數(shù)的def代碼里包含了yield,函數(shù)就自動成為了一個generator函數(shù)(及時(shí)仍包含有return),generator函數(shù)創(chuàng)建generator(一種特殊形式的迭代器,這個迭代器有一個內(nèi)置__next__()方法),當(dāng)需要一個值的時(shí)候通過yield來產(chǎn)生而不是直接return,因此與一般函數(shù)不同的是,此時(shí)控制權(quán)并未交出。
for循環(huán)會隱式的調(diào)用next()函數(shù),next()函數(shù)負(fù)責(zé)調(diào)用generator中的__next__()方法,此時(shí)generator負(fù)責(zé)返回一個值給任何調(diào)用next()的方法,利用yield將此值傳回去,相當(dāng)于return語句。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
keras訓(xùn)練淺層卷積網(wǎng)絡(luò)并保存和加載模型實(shí)例
這篇文章主要介紹了keras訓(xùn)練淺層卷積網(wǎng)絡(luò)并保存和加載模型實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
python實(shí)現(xiàn)圖像隨機(jī)裁剪的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)圖像隨機(jī)裁剪的示例代碼,幫助大家更好的理解和使用python處理圖片,感興趣的朋友可以了解下2020-12-12
淺談django開發(fā)者模式中的autoreload是如何實(shí)現(xiàn)的
下面小編就為大家?guī)硪黄獪\談django開發(fā)者模式中的autoreload是如何實(shí)現(xiàn)的。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08
基于python實(shí)現(xiàn)對文件進(jìn)行切分行
這篇文章主要介紹了基于python實(shí)現(xiàn)對文件進(jìn)行切分行,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
python使用xlrd模塊讀取excel的方法實(shí)例
Python讀取Excel表格,相比xlwt來說,xlrd提供的接口比較多,下面這篇文章主要給大家介紹了關(guān)于python使用xlrd模塊讀取excel的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Python bisect_left 函數(shù)使用場景詳解
在Python的編程世界中,數(shù)據(jù)處理和搜索操作是非常常見的任務(wù),bisect_left函數(shù)是Python標(biāo)準(zhǔn)庫bisect模塊中的一個強(qiáng)大工具,接下來,我們將詳細(xì)探討bisect_left函數(shù)的使用場景,需要的朋友可以參考下2024-11-11
python BlockingScheduler定時(shí)任務(wù)及其他方式的實(shí)現(xiàn)
這篇文章主要介紹了python BlockingScheduler定時(shí)任務(wù)及其他方式的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

