91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

深入淺析Python中的yield關鍵字

發布時間:2020-10-20 06:08:39 來源:腳本之家 閱讀:153 作者:震靈 欄目:開發技術

前言

python中有一個非常有用的語法叫做生成器,所利用到的關鍵字就是yield。有效利用生成器這個工具可以有效地節約系統資源,避免不必要的內存占用。

一段代碼

def fun():
for i in range(20):
 x=yield i
 print('good',x)
if __name__ == '__main__':
a=fun()
a.__next__()
x=a.send(5)
print(x)

這段代碼很短,但是詮釋了yield關鍵字的核心用法,即逐個生成。在這里獲取了兩個生成器產生的值,即0和1。分別由next函數和send()函數獲得,這兩個函數的區別我們后面會詳細闡述。

關于__next__函數,這里先說明一下,我們可以利用__next__()這個函數持續獲取符合fun函數規則的數,直到19結束。這段代碼如下所示:

def fun():
for i in range(20):
 x=yield i
if __name__ == '__main__':
for x in fun():
 print(x)

這段代碼的效果和下面這段代碼是完全相同的

if __name__ == '__main__':
for i in range(20):
 x=yield i

for..in調用生成器算是生成器的基礎用法,不過只會用for..in意義是不大的。生成器中最重要的函數是sent和__next__這兩個函數,下面就針對這兩個函數進行詳細的闡述。

sent函數

這里特別強調了sent函數,因為sent函數沒有那么直觀。__next__函數很好理解,就是從上一個終止點開始,到下一個yield結束,返回值就是yield表達式的值。

例如在初始的那段代碼里:

def fun():
for i in range(20):
 x=yield i
 print('good',x)

第一次調用__next__函數的時候,我們從fun的起點開始,然后在yield處結束,需要注意的是,賦值語句不會調用,此處yield i和含義和return差不多。

但是第二次調用__next__函數的時候,就會直接從上一個yield的結束處開始,也就是先執行賦值語句,然后輸出字符串,進入下一個循環,直到下一個yield或者生成器結束

再次看初始的那段代碼,可以發現第二次調用的時候沒有選擇使用__next__函數,而是使用了一個sent()函數。這里就需要注意,sent()函數的用法和__next__函數不太一樣。sent()函數只能從yield之后開始,到下一個yield結束。這也就意味著第一次調用必須使用__next__函數。

sent()函數最重要的作用在于它可以給yield對應的賦值語句賦值,比如上面那一段代碼中的

x=yield i

如果調用__next()__函數,那么x=None。但是如果調用sent(5),那么x=5。除了上述將的兩個特征以外,sent和next并沒有什么區別,sent函數也會返回yield表達式對應的值

next函數調用次可能有限

需要特別注意的是,盡管是生成器。但是next函數的調用次數可能是有限的。比如下面這段代碼

def fun():
for i in range(20):
 x=yield i
 print('good',x)
if __name__ == '__main__':
a=fun()
for i in range(30):
 x=a.__next__()
 print(x)

生成器里的函數只循環了20次,但是next函數卻調用了30次,這時候就會觸發StopIteration異常。

總結

以上所述是小編給大家介紹的Python中的yield關鍵字,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

满城县| 阳高县| 临沭县| 阳曲县| 扎赉特旗| 乡宁县| 麟游县| 曲靖市| 含山县| 土默特左旗| 新巴尔虎右旗| 泸溪县| 呼伦贝尔市| 石泉县| 上饶县| 理塘县| 万山特区| 博爱县| 佛山市| 西青区| 新民市| 中方县| 麻城市| 辛集市| 屯昌县| 荃湾区| 乐昌市| 朝阳区| 甘德县| 广东省| 子长县| 延安市| 阿巴嘎旗| 九寨沟县| 方正县| 遵义市| 丹东市| 肃北| 壤塘县| 宜阳县| 库车县|