2 for y in range(1, 4) if y 2: for y in range(1, 4): if y ? ? 生成器 如果要?jiǎng)?chuàng)建一個(gè)100萬(wàn)個(gè)元素的列表,你使用上面的方式無(wú)疑非常占用內(nèi)存,這時(shí)候就用到了生成器,它其實(shí)是保存一個(gè)你定義的規(guī)則,在需要用到元素的時(shí)" />

在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

Python中的迭代器與生成器

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2025-02-20 10:43 ? 次閱讀

Python迭代器與生成器

列表生成式

列表生成式也叫做列表推導(dǎo)式,它本身還是列表,只不過(guò)它是根據(jù)我們定義的規(guī)則來(lái)生成一個(gè)真實(shí)的列表。

list2 = [x for x in range(10)]
print(list2)

下面是一個(gè)復(fù)雜的列子:

list1 = [x * y for x in range(1, 5) if x > 2 for y in range(1, 4) if y < 3]

# 上面的列表生成式等同于下面的代碼
list4 = []
for x in range(1, 5):
    if x > 2:
        for y in range(1, 4):
            if y < 3:
                list4.append(x * y)

生成器

如果要?jiǎng)?chuàng)建一個(gè)100萬(wàn)個(gè)元素的列表,你使用上面的方式無(wú)疑非常占用內(nèi)存,這時(shí)候就用到了生成器,它其實(shí)是保存一個(gè)你定義的規(guī)則,在需要用到元素的時(shí)候按照規(guī)則去生成一個(gè),而不是保存好一大堆元素,這樣就減少內(nèi)存占用。不過(guò)生成器的元素只能順序依次獲取不能像真正列表那樣可以按位置獲取而且不能回退。

創(chuàng)建一個(gè)生成器,生成器保存的是一個(gè)算法,而不是具體的內(nèi)容。可以看到和列表生成式的區(qū)別是就是把[]換成(),generator = (x for x in range(10))。

其實(shí)生成器就是一個(gè)迭代器,只不過(guò)它是一種特殊的迭代器:

print("generator是否是迭代器:", isinstance(generator, Iterator))  # 結(jié)果為 True
print("generator是否是可迭代對(duì)象:", isinstance(generator, Iterable))  # 結(jié)果為 True

如果要想獲取生成器元素就只能通過(guò)next來(lái)獲取下一個(gè)元素,必須順序獲取,當(dāng)沒(méi)有元素的時(shí)候拋出 StopIteration 異常。print(generator.__next__()) # 也可以這樣來(lái)使用 next(generator)。

用生成器實(shí)現(xiàn)斐波那契數(shù)列:

def fib(length):
    """
    生成器定義一個(gè)斐波那契數(shù)列,生成器本身就是yield +  next實(shí)現(xiàn)。外部調(diào)用next來(lái)觸發(fā)一次計(jì)算
    函數(shù)遇到y(tǒng)ield返回,然后下一次next則繼續(xù)從上一次yield的地方向下執(zhí)行,直到遇到某個(gè)結(jié)束條件
    :param length:
    
    """
    n, a, b = 0, 0, 1
    while n < length:
        yield b
        """
        a, b = b, a + b 等于 t = (b, a + b) a=t[0]  b=t[1]  當(dāng)計(jì)算b = a + b的時(shí)候,
        這里的a并不是之前 a = b 之后a值,而是之前的a值,所以它是先做 = 右邊的計(jì)算,然后賦值給左邊的
        """
        a, b = b, a + b
        n = n + 1
    return 'done'


for i in fib(10):
print(i)

迭代器

可以用next()函數(shù)調(diào)用來(lái)獲取下一個(gè)元素的對(duì)象叫做迭代器。生成器就可以,但是普通集合類比如list、dict、str就不可以。集合類的對(duì)象比如list、dict、set、str;還有生成器都是可迭代對(duì)象,也就是可以遍歷的。但是它們并不一定都是迭代器。list、dict、str等數(shù)據(jù)類型不是Iterator。

list1 = [1, 2, 3, 4, 5, 6]
print("list1是否是迭代器:", isinstance(list1, Iterator))  # 結(jié)果為 False
print("list1是否是可迭代對(duì)象:", isinstance(list1, Iterable))  # 結(jié)果為 True
print("list1的長(zhǎng)度:", len(list1))  # 結(jié)果為具體長(zhǎng)度

if hasattr(list1, "__next__"):
    print("list1是迭代器")

把list1變成迭代器:

interObj = iter(list1)
print("list1是否是迭代器:", isinstance(interObj, Iterator))  # 結(jié)果為 True
print("list1是否是可迭代對(duì)象:", isinstance(interObj, Iterable))  # 結(jié)果為 False
# print("interObj的長(zhǎng)度:", len(interObj))  # 無(wú)法獲取長(zhǎng)度

if hasattr(interObj, "__next__"):
    print("interObj是迭代器")

可遍歷的對(duì)象不一定是迭代器,但是肯定是可迭代對(duì)象。

迭代器同時(shí)一定也是可迭代對(duì)象。生成器是一種特殊的迭代器,所以也是可迭代對(duì)象。

可迭代對(duì)象和迭代器最大的區(qū)別就是前者可以通過(guò)len()獲取長(zhǎng)度而后者不能

且迭代器一定可以通過(guò)next()函數(shù)(說(shuō)明該對(duì)象包含__next__內(nèi)置方法)獲取下一個(gè)元素,而可迭代對(duì)象不一定。

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

    關(guān)注

    7

    文章

    321

    瀏覽量

    21195
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4812

    瀏覽量

    85146
  • 迭代器
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    4360

原文標(biāo)題:Python迭代器與生成器

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    python生成器

    python生成器1. 什么是生成器生成器(英文名 Generator ),是一個(gè)可以像迭代
    發(fā)表于 02-24 15:56

    pim卡資料生成器

    pim卡資料生成器
    發(fā)表于 11-22 23:23 ?6次下載

    自制酸奶生成器

    自制酸奶生成器
    發(fā)表于 04-23 11:48 ?946次閱讀
    自制酸奶<b class='flag-5'>生成器</b>

    代碼生成器的應(yīng)用

    jeesite框架代碼生成器,可以很方便的生成代碼,挺不錯(cuò)的。
    發(fā)表于 01-14 15:19 ?0次下載

    STM32庫(kù)函數(shù)代碼自動(dòng)生成器正式版

    STM32庫(kù)函數(shù)代碼自動(dòng)生成器正式版 STM32庫(kù)函數(shù)代碼自動(dòng)生成器正式版
    發(fā)表于 07-25 18:52 ?0次下載

    了解Python數(shù)據(jù)結(jié)構(gòu)迭代對(duì)象、迭代生成器的概念

    在了解Python的數(shù)據(jù)結(jié)構(gòu)時(shí),容器(container)、可迭代對(duì)象(iterable)、迭代(iterator)、生成器(genera
    發(fā)表于 11-15 17:34 ?845次閱讀
    了解<b class='flag-5'>Python</b>數(shù)據(jù)結(jié)構(gòu)<b class='flag-5'>迭代</b>對(duì)象、<b class='flag-5'>迭代</b><b class='flag-5'>器</b>、<b class='flag-5'>生成器</b>的概念

    帶你一起學(xué)習(xí)徹底搞懂Python生成器

    在這說(shuō)「迭代」的原因是「生成器」自動(dòng)實(shí)現(xiàn)了「迭代協(xié)議」,所謂協(xié)議,就是一種約定。為了更好的理解生成器
    的頭像 發(fā)表于 02-25 09:13 ?2822次閱讀

    AN-113:精密坡道生成器

    AN-113:精密坡道生成器
    發(fā)表于 05-16 12:04 ?6次下載
    AN-113:精密坡道<b class='flag-5'>生成器</b>

    python生成器是什么

    python生成器 1. 什么是生成器生成器(英文名 Generator ),是一個(gè)可以像迭代
    的頭像 發(fā)表于 02-24 15:53 ?3748次閱讀

    Arduino贊美生成器

    電子發(fā)燒友網(wǎng)站提供《Arduino贊美生成器.zip》資料免費(fèi)下載
    發(fā)表于 11-09 14:22 ?1次下載
    Arduino贊美<b class='flag-5'>生成器</b>

    通用RFID生成器

    通用RFID生成器資料分享
    發(fā)表于 02-10 15:35 ?1次下載

    python迭代調(diào)用內(nèi)置函數(shù)計(jì)時(shí)比較(上)

    python迭代工具自動(dòng)調(diào)用迭代對(duì)象next方法,對(duì)迭代對(duì)象進(jìn)行遍歷。 python的for循環(huán)、列表解析、map方法、
    的頭像 發(fā)表于 02-21 14:56 ?688次閱讀

    python迭代調(diào)用內(nèi)置函數(shù)計(jì)時(shí)比較(下)

    python迭代工具自動(dòng)調(diào)用迭代對(duì)象next方法,對(duì)迭代對(duì)象進(jìn)行遍歷。 python的for循環(huán)、列表解析、map方法、
    的頭像 發(fā)表于 02-21 14:56 ?598次閱讀

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

    Python 是一種以靈活性和多功能性著稱的語(yǔ)言,它提供了一種稱為生成器的強(qiáng)大功能。
    發(fā)表于 07-19 14:33 ?530次閱讀

    Python生成器的使用方法

    舉一個(gè)例子,編寫(xiě)一個(gè)函數(shù)計(jì)算一串?dāng)?shù)字里所有偶數(shù)的個(gè)數(shù),其實(shí)是很簡(jiǎn)單的問(wèn)題,但是有些人是用生成器這么寫(xiě)的: In [ 66 ]: def f1 ( x ): ....: return sum ( c
    的頭像 發(fā)表于 11-03 15:41 ?536次閱讀
    主站蜘蛛池模板: 赛罗奥特曼银河帝国普通话免费版 | 国产高清片 | 天天操天天干天搞天天射 | 国产专区视频 | 欧美婷婷综合 | 国产精品你懂的在线播放 | 天堂资源在线 | 亚洲人成网站在线在线 | 美日韩毛片 | 久久成人国产精品免费 | 欧美无遮挡国产欧美另类 | 色播图片 | 最近视频在线播放免费观看 | 国产三级日本三级日产三级66 | 日日噜噜夜夜狠狠tv视频免费 | 播放毛片 | 清纯漂亮小美女准备啪啪 | 欧美一区中文字幕 | 三级色网站 | 亚洲国产成人久久 | 91p0rn永久备用地址二 | 五月婷婷六月丁香在线 | 丁香婷婷开心激情深爱五月 | 777色淫网站女女 | 免费色视频| 天天干夜夜操美女 | 日韩一级精品视频在线观看 | 性色视频在线 | 色吧在线视频 | 黄色精品 | 色天天综合色天天天天看大 | 色网站免费在线观看 | 欧美人与z0zoxxxx特 | 成人国产日本亚洲精品 | 国内一级特黄女人精品毛片 | 97视频hd| 男男gay污小黄文 | 亚洲香蕉久久一区二区三区四区 | 午夜毛片不卡高清免费 | 亚洲激情都市 | 亚洲综合黄色 |