日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[译]yield关键字都做了什么?

發布時間:2025/4/16 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [译]yield关键字都做了什么? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文:https://stackoverflow.com/que...

我的微信公眾號:python每日一練

要理解什么是 yield,必須理解什么是生成器(generator)。在理解生成器之前,讓我們先了解迭代。

迭代

當你建立了一個列表,你可以逐個地訪問這個列表的元素,而這個訪問的過程叫做迭代(iteration)

>>> mylist = [1, 2, 3] >>> for i in mylist: ... print(i) 1 2 3

代碼中的mylist就是一個可迭代對象(iterable),當你使用列表生成式時,你就創建了一個list,同時也創建了一個可迭代對象:

>>> mylist = [x*x for x in range(3)] >>> for i in mylist: ... print(i) 0 1 4

凡是能使用for...in...語句的對象,都叫做可迭代對象,例如:list、string、文件等等

這些可迭代對象非常方便,因為你可以根據自己的需要來訪問它們。但是同時也需要將所有的值存入內存當中,無論你是不是需要所有的值,可能對于一個列表[x for x in range(100000)],你僅僅想拿到里面的素數,但當這個列表生成式被執行的時候,已經將所有100000個數字存入了內存中。

生成器

生成器是一種只能迭代一次的迭代器,生成器不會一次將所有的元素存入內存中,而是一邊迭代一邊運算:

>>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator: ... print(i) 0 1 4

這份代碼看起來和上面的代碼沒有什么區別。但是你不能再次執行for i in mygenerator,因為生成器只能使用一次:

>>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator: ... print(i) ... 0 1 4 >>> for i in mygenerator: ... print(i) ... >>>

Yield

yield的使用和return的使用沒什么區別,只是yield會返回一個生成器

>>> def createGenerator(): ... mylist = range(3) ... for i in mylist: ... yield i*i ... >>> mygenerator = createGenerator() # 創建一個生成器 >>> print(mygenerator) # mygenerator是一個對象! <generator object createGenerator at 0xb7555c34> >>> for i in mygenerator: ... print(i) 0 1 4

當你的函數需要返回一個很大的元素集合,并且每個元素只需要用到一次的時候,使用yield會非常方便

要想理解yield,你必須理解當你調用一個包含yield的函數的時候,函數體代碼并不會執行,這個函數僅僅是返回一個生成器而已

>>> def createGenerator(): ... print('head') ... for i in range(5): ... yield i*i ... print('tail') ... >>> createGenerator() <generator object createGenerator at 0x0000023454FB5990>

當你第一次向后迭代(用next或for...in...語句時)這個生成器時,函數體才會從最開始執行到yield處然后返回yield的值,隨后再次向后迭代,會執行剩余的代碼然后再次遇到yield停止并返回值。直到運行到函數結尾處停止,此時如果是用next()則會拋出StopIteration異常,如果是用for...in...則會結束循環并且不會有異常

>>> def createGenerator(): ... print('head') ... for i in range(5): ... yield i*i ... print('tail') ... >>> g = createGenerator() >>> next(g) head 0 >>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g) tail Traceback (most recent call last):File "<stdin>", line 1, in <module> StopIteration

總結

以上是生活随笔為你收集整理的[译]yield关键字都做了什么?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。