chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

python生成器是什么

python爬蟲知識(shí)分享 ? 來源:python爬蟲知識(shí)分享 ? 作者:python爬蟲知識(shí)分享 ? 2022-02-24 15:53 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

python生成器

1. 什么是生成器?

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

生成器的出現(xiàn)(Python 2.2 +),實(shí)現(xiàn)了延時(shí)計(jì)算,從而緩解了在大量數(shù)據(jù)下內(nèi)存消耗過猛的問題。

當(dāng)你在 Python Shell 中敲入一個(gè)生成器對(duì)象,會(huì)直接輸出 generator object 提示你這是一個(gè)生成器對(duì)象

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

2. 如何創(chuàng)建生成器?

使用列表推導(dǎo)式

在上面已經(jīng)演示過,正常我們使用列表推導(dǎo)式時(shí)是下面這樣子,使用 [] ,此時(shí)生成的是列表。

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

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

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

使用 yield

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

當(dāng)一個(gè)函數(shù)運(yùn)行到 yield 后,函數(shù)的運(yùn)行會(huì)暫停,并且會(huì)把 yield 后的值返回出去。

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

yield 雖然返回了,但是函數(shù)并沒有結(jié)束

請(qǐng)看如下代碼,我定義了一個(gè) generator_factory 函數(shù),當(dāng)我執(zhí)行 gen = generator_factory() 時(shí),gen 就是一個(gè)生成器對(duì)象

>>> 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. 生成器的使用

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

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

第一種方法:使用 next 方法一個(gè)一個(gè)地把元素取出來,如果元素全部取完了,生成器會(huì)拋出 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 循環(huán)一個(gè)一個(gè)地迭代出來

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

4. 生成器的激活

生成器對(duì)象,在創(chuàng)建后,并不會(huì)執(zhí)行任何的代碼邏輯。

想要從生成器對(duì)象中獲取元素,那么第一步要觸發(fā)其運(yùn)行,在這里稱之為激活。

方法有兩種:

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

使用generator.send(None)

還以下面這段代碼為例,可以看到 gen.send(None) 相當(dāng)于執(zhí)行了 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. 生成器的狀態(tài)

生成器在其生命周期中,會(huì)有如下四個(gè)狀態(tài)

GEN_CREATED # 生成器已創(chuàng)建,還未被激活

GEN_RUNNING # 解釋器正在執(zhí)行(只有在多線程應(yīng)用中才能看到這個(gè)狀態(tài))

GEN_SUSPENDED # 在 yield 表達(dá)式處暫停

GEN_CLOSED # 生成器執(zhí)行結(jié)束

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

>>> 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. 生成器的異常

在最前面,我有定義了一個(gè)生成器函數(shù)。

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

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

實(shí)際上,如果你不手動(dòng)拋出 StopIteration,在生成器遇到函數(shù) return 時(shí),會(huì)我自動(dòng)拋出 StopIteration。

請(qǐng)看下面代碼,我將 raise StopIteration 去掉后,仍然會(huì)拋出異常。

>>> 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

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    322

    瀏覽量

    22387
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4848

    瀏覽量

    88901
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    非對(duì)稱密鑰生成和轉(zhuǎn)換規(guī)格詳解

    生成 以字符串參數(shù)生成RSA密鑰,具體的“字符串參數(shù)”由“RSA密鑰類型”和“素?cái)?shù)個(gè)數(shù)”使用符號(hào)“|”拼接而成,用于在創(chuàng)建非對(duì)稱密鑰生成器時(shí),指定密鑰規(guī)格。 說明:生成RSA非對(duì)稱密
    發(fā)表于 09-01 07:50

    PanDao:實(shí)際約束條件下成像系統(tǒng)的初始結(jié)構(gòu)的生成

    的平均RMS光斑尺寸約為55 μm,色差校正效果中等。基于同等規(guī)格與約束,我們采用自主研發(fā)的FTR初始透鏡生成器,在數(shù)分鐘內(nèi)即創(chuàng)建出多個(gè)更加優(yōu)質(zhì)的設(shè)計(jì)方案。圖1展示了由FTR程序生成的五類不同透鏡系統(tǒng)
    發(fā)表于 05-07 08:57

    EB Tresos驗(yàn)證步驟失敗是什么原因?

    我正在嘗試集成 MCAL 包,但在生成過程中收到如下驗(yàn)證錯(cuò)誤:“無法為模塊”Dio_TS_T40D2M20I0R0“運(yùn)行生成器
    發(fā)表于 04-10 06:36

    使用s32ds軟件時(shí),無法生成是怎么回事?

    使用s32ds軟件時(shí),無法生成,并顯示以下錯(cuò)誤消息。 請(qǐng)幫忙。 生成器:錯(cuò)誤:錯(cuò)誤:LinStackCfg.npf 行:5 “bus_clock” - 語法錯(cuò)誤
    發(fā)表于 04-04 08:04

    “Quantum Origin”成首個(gè)獲NIST驗(yàn)證的軟件量子隨機(jī)數(shù)生成器

    -Quantinuum的“Quantum Origin”成為首個(gè)通過NIST驗(yàn)證的軟件量子隨機(jī)數(shù)生成器 Quantum Origin獲得NIST SP 800-90B對(duì)其驗(yàn)證熵源的批準(zhǔn) 增強(qiáng)了聯(lián)邦
    的頭像 發(fā)表于 04-03 15:22 ?531次閱讀

    EB Tresos狀態(tài)顯示無法運(yùn)行生成器是什么原因?qū)е碌模?/a>

    我正在嘗試集成 MCAL 包,但在生成過程中收到如下驗(yàn)證錯(cuò)誤:“無法為模塊”Dio_TS_T40D2M20I0R0“運(yùn)行生成器
    發(fā)表于 04-02 08:06

    DS855調(diào)相直接數(shù)字合成器適合哪些場(chǎng)景?

    :DS855可作為射頻信號(hào)源生成器,廣泛應(yīng)用于各種射頻測(cè)試與應(yīng)用場(chǎng)景。其精確的頻率與相位控制能力使其能夠生成高質(zhì)量的射頻信號(hào),滿足射頻測(cè)試與應(yīng)用的多樣化需求。儀器與半導(dǎo)體測(cè)試儀:在儀器與半導(dǎo)體測(cè)試儀中
    發(fā)表于 03-21 09:28

    敏捷合成器的技術(shù)原理和應(yīng)用場(chǎng)景

    和幅度等特點(diǎn)。通過內(nèi)部的正弦波源和外部調(diào)制輸入,敏捷合成器能夠生成各種復(fù)雜波形,并對(duì)其進(jìn)行精確的調(diào)控。具體來說,敏捷合成器可能采用以下技術(shù)原理: 頻率合成技術(shù):利用鎖相環(huán)(PLL)、直接數(shù)字合成
    發(fā)表于 02-20 15:25

    Python中的迭代器與生成器

    Python迭代器與生成器 列表生成式 列表生成式也叫做列表推導(dǎo)式,它本身還是列表,只不過它是根據(jù)我們定義的規(guī)則來生成一個(gè)真實(shí)的列表。 ?
    的頭像 發(fā)表于 02-20 10:43 ?566次閱讀

    開源隨機(jī)數(shù)生成器庫OpenRNG助力實(shí)現(xiàn)移植到Arm平臺(tái)時(shí)的最佳性能

    OpenRNG 實(shí)現(xiàn)了多種生成器和分布方式。生成器算法可生成“看似隨機(jī)”并具有某些統(tǒng)計(jì)特性的序列,我們將在下文進(jìn)行討論。分布方式會(huì)將序列映射到常見的概率分布概念,如高斯分布或二項(xiàng)分布
    的頭像 發(fā)表于 02-08 09:24 ?1634次閱讀
    開源隨機(jī)數(shù)<b class='flag-5'>生成器</b>庫OpenRNG助力實(shí)現(xiàn)移植到Arm平臺(tái)時(shí)的最佳性能

    labview正版購買

    學(xué)生時(shí)期做項(xiàng)目用的是學(xué)生版的Labview2015,現(xiàn)在工程上需要用正版了, 具體用到了下面的模塊(需要生成可執(zhí)行文件,用到了modbus通訊模塊) 請(qǐng)問需要買什么版本的?(能否買一個(gè)永久的Labview基礎(chǔ)款+Labview應(yīng)用生成器
    發(fā)表于 01-20 08:59

    超詳細(xì)!FMU生成器用戶手冊(cè)來啦~

    FMU生成器是TSMaster中用于將模型打包生成FMU文件的一個(gè)工具,目前支持FMI3.0和FMI2.0版本,F(xiàn)MU類型僅支持Co-Simulation(CS),即聯(lián)合仿真FMU。本文將介紹FMU
    的頭像 發(fā)表于 01-17 20:02 ?1372次閱讀
    超詳細(xì)!FMU<b class='flag-5'>生成器</b>用戶手冊(cè)來啦~

    EE-322:面向SHARC處理器的專家代碼生成器

    電子發(fā)燒友網(wǎng)站提供《EE-322:面向SHARC處理器的專家代碼生成器.pdf》資料免費(fèi)下載
    發(fā)表于 01-07 14:04 ?0次下載
    EE-322:面向SHARC處理器的專家代碼<b class='flag-5'>生成器</b>

    NVIDIA Edify幫助開發(fā)者創(chuàng)建自定義模型

    內(nèi)容生成器 — 無論是生成語言、2D 圖像、3D 模型還是視頻 — 為創(chuàng)意社區(qū)提供了各種工具,可更快將想象變?yōu)楝F(xiàn)實(shí)。
    的頭像 發(fā)表于 11-20 09:24 ?731次閱讀

    藍(lán)牙AES+RNG如何保障物聯(lián)網(wǎng)信息安全

    功能可通過軟件實(shí)現(xiàn),也可以通過硬件實(shí)現(xiàn)。主要優(yōu)勢(shì)體現(xiàn)在:在保障通信安全方面,隨機(jī)數(shù)生成器能夠輸出非重復(fù)且隨機(jī)變化的數(shù)值。這些數(shù)值是構(gòu)建多種安全機(jī)制的基礎(chǔ),例如鑒權(quán)與加密過程,從而顯著提升藍(lán)牙通信
    發(fā)表于 11-08 15:38