<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

python生成器是什么

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-02-24 15:53 ? 次閱讀

python生成器

1. 什么是生成器?

生成器(英文名 Generator ),是一個可以像迭代器那樣使用for循環來獲取元素的函數。

生成器的出現(Python 2.2 +),實現了延時計算,從而緩解了在大量數據下內存消耗過猛的問題。

當你在 Python Shell 中敲入一個生成器對象,會直接輸出 generator object 提示你這是一個生成器對象

>>> gen = (i for i in range(5))
>>> gen
 at 0x10cae50b0>

2. 如何創建生成器?

使用列表推導式

在上面已經演示過,正常我們使用列表推導式時是下面這樣子,使用 [] ,此時生成的是列表。

>>> mylist = [i for i in range(5)]
>>> mylist
[0, 1, 2, 3, 4]

而當你把 [] 換成 () ,返回的就不是列表了,而是一個生成器

>>> gen = (i for i in range(5))
>>> gen
 at 0x10cae50b0>

使用 yield

yield 是什么東西呢? 它相當于我們函數里的 return,但與 return 又有所不同。

當一個函數運行到 yield 后,函數的運行會暫停,并且會把 yield 后的值返回出去。

若 yield 沒有接任何值,則返回 None

yield 雖然返回了,但是函數并沒有結束

請看如下代碼,我定義了一個 generator_factory 函數,當我執行 gen = generator_factory() 時,gen 就是一個生成器對象

>>> def generator_factory(top=5):
...     index = 0
...     while index < top:
...         print("index 值為: " + str(index))
...         index = index + 1
...         yield index
...     raise StopIteration
...
>>> gen = generator_factory()
>>> gen

3. 生成器的使用

從一個生成器對象中取出元素,和我們前面學過的通過切片訪問列表中的元素不一樣,它沒有那么直觀。

想要從生成器對象中取出元素,只有兩種方法:

第一種方法:使用 next 方法一個一個地把元素取出來,如果元素全部取完了,生成器會拋出 StopIteration 的異常。

>>> gen = (x for x in range(3))
>>> gen
 at 0x1072400b0>
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

第二種方法:使用 for 循環一個一個地迭代出來

>>> gen = (x for x in range(3))
>>> for i in gen:
...     print(i)
...
0
1
2

4. 生成器的激活

生成器對象,在創建后,并不會執行任何的代碼邏輯。

想要從生成器對象中獲取元素,那么第一步要觸發其運行,在這里稱之為激活。

方法有兩種:

使用next() :上面已經講過

使用generator.send(None)

還以下面這段代碼為例,可以看到 gen.send(None) 相當于執行了 next(gen)

>>> def generator_factory(top=5):
...     index = 0
...     while index < top:
...         print("index 值為: " + str(index))
...         index = index + 1
...         yield index
...     raise StopIteration
...
>>>
>>> gen = generator_factory()
>>> gen.send(None)
index 值為: 0
1
>>> gen.send(None)
index 值為: 1
2

5. 生成器的狀態

生成器在其生命周期中,會有如下四個狀態

GEN_CREATED # 生成器已創建,還未被激活

GEN_RUNNING # 解釋器正在執行(只有在多線程應用中才能看到這個狀態)

GEN_SUSPENDED # 在 yield 表達式處暫停

GEN_CLOSED # 生成器執行結束

通過下面的示例可以很輕松地理解這一過程(GEN_RUNNING 這個狀態只有在多線程中才能觀察到,這里就不演示啦)

>>> gen = (x for x in range(2))
>>> from inspect import getgeneratorstate
>>> gen = (x for x in range(3))
>>> getgeneratorstate(gen)
'GEN_CREATED'
>>>
>>> next(gen)
0
>>> getgeneratorstate(gen)
'GEN_SUSPENDED'
>>> next(gen)
1
>>> next(gen)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
>>> getgeneratorstate(gen)
'GEN_CLOSED'

6. 生成器的異常

在最前面,我有定義了一個生成器函數。

def generator_factory(top=2):
    index = 0
    while index < top:
        index = index + 1
        yield index
    raise StopIteration

在沒有元素可返回時,我最后拋出了 StopIteration 異常,這是為了滿足生成器的協議。

實際上,如果你不手動拋出 StopIteration,在生成器遇到函數 return 時,會我自動拋出 StopIteration。

請看下面代碼,我將 raise StopIteration 去掉后,仍然會拋出異常。

>>> def generator_factory(top=2):
...     index = 0
...     while index < top:
...         index = index + 1
...         yield index
...
>>> gen = generator_factory()
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 生成器
    +關注

    關注

    7

    文章

    304

    瀏覽量

    20309
  • python
    +關注

    關注

    52

    文章

    4691

    瀏覽量

    83526
收藏 人收藏

    評論

    相關推薦

    飛凌嵌入式ElfBoard ELF 1板卡-在線二維碼生成器

    在線二維碼生成器允許用戶將文本、網址、圖片或其他數據轉換為二維碼形式。二維碼是一種特殊類型的條形碼,它可以通過掃描來快速識別和讀取信息。在線二維碼生成器使用特定的算法將這些信息編碼成二維碼,用戶可以
    發表于 04-24 17:00

    Minitab 交互式表格生成器

    生成器
    MinitabUG
    發布于 :2024年04月03日 15:58:54

    RL78的代碼生成器發布說明

    電子發燒友網站提供《RL78的代碼生成器發布說明.pdf》資料免費下載
    發表于 01-30 09:48 ?0次下載
    RL78的代碼<b class='flag-5'>生成器</b>發布說明

    TSMaster報文發送的信號生成器操作說明

    信號生成器功能是TSMaster分析中的報文發送模塊。信號生成器用于發送和配置每個CAN/LIN信號的值變化行為,簡而言之,這是一個可以控制和調整CAN/LIN信號值的功能。我們可選擇的信號生成器
    的頭像 發表于 12-23 08:21 ?387次閱讀
    TSMaster報文發送的信號<b class='flag-5'>生成器</b>操作說明

    真隨機數生成器TRNG外設模塊應用要點

    國產車規微控制器原廠云途半導體設計和發售的YTM32ME微控制器上集成的真隨機數生成器TRNG(True Random Number Generator)外設模塊
    的頭像 發表于 11-08 14:52 ?1014次閱讀
    真隨機數<b class='flag-5'>生成器</b>TRNG外設模塊應用要點

    Python生成器的使用方法

    舉一個例子,編寫一個函數計算一串數字里所有偶數的個數,其實是很簡單的問題,但是有些人是用生成器這么寫的: In [ 66 ]: def f1 ( x ): ....: return sum
    的頭像 發表于 11-03 15:41 ?273次閱讀

    STM32MP1系列密鑰生成器軟件說明

    電子發燒友網站提供《STM32MP1系列密鑰生成器軟件說明.pdf》資料免費下載
    發表于 09-20 10:36 ?0次下載
    STM32MP1系列密鑰<b class='flag-5'>生成器</b>軟件說明

    python語言表推導式和生成器表達式特性

    今天我想向你介紹python語言的兩個非常有用的特性:列表推導式和生成器表達式。這兩個特性都可以讓你用一行簡潔的代碼來創建一個序列,而不需要寫循環或者函數。但是它們之間也有一些重要的區別,我們一起
    的頭像 發表于 07-20 09:51 ?656次閱讀
    <b class='flag-5'>python</b>語言表推導式和<b class='flag-5'>生成器</b>表達式特性

    Python中的生成器是什么?它們的效率和可用性如何?

    Python 是一種以靈活性和多功能性著稱的語言,它提供了一種稱為生成器的強大功能。
    發表于 07-19 14:33 ?344次閱讀

    Versal GTY/GTYP:使用PRBS生成器和檢查器

    本文涵蓋了在 Versal GTY 和 GTYP 中使用模式生成器和檢查器時對以下操作的限制
    的頭像 發表于 07-10 17:18 ?735次閱讀

    e2 studio 代碼生成器用戶手冊:RZ API 參考 Rev.1.02

    e2 studio 代碼生成器用戶手冊:RZ API 參考 Rev.1.02
    發表于 07-05 18:52 ?0次下載
    e2 studio 代碼<b class='flag-5'>生成器</b>用戶手冊:RZ API 參考 Rev.1.02

    IzoT 資源報告生成器用戶指南

    IzoT 資源報告生成器用戶指南
    發表于 07-04 20:46 ?0次下載
    IzoT 資源報告<b class='flag-5'>生成器</b>用戶指南

    代碼生成器用戶手冊:RL78 API 參考

    代碼生成器用戶手冊:RL78 API 參考
    發表于 07-03 20:08 ?0次下載
    代碼<b class='flag-5'>生成器</b>用戶手冊:RL78 API 參考

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目

    將使用代碼生成器生成的項目移植到與智能配置器一起使用的項目
    發表于 06-30 20:54 ?0次下載
    將使用代碼<b class='flag-5'>生成器</b><b class='flag-5'>生成</b>的項目移植到與智能配置器一起使用的項目

    i.MX8QM真隨機數生成器符合什么要求?

    大家好, 我們的客戶要求我們指定一個真正的隨機數生成器。 i.MX8QM 真隨機數生成器符合什么要求? 以下是對 SE050 中的隨機數生成器的描述。除此之外,請告訴我 i.MX8 中的真正隨機數
    發表于 05-18 06:13
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>