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í)" />

91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(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ì)象叫做迭代器。生成器就可以,但是普通集合類(lèi)比如list、dict、str就不可以。集合類(lèi)的對(duì)象比如list、dict、set、str;還有生成器都是可迭代對(duì)象,也就是可以遍歷的。但是它們并不一定都是迭代器。list、dict、str等數(shù)據(jù)類(lèi)型不是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

    文章

    322

    瀏覽量

    22712
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4876

    瀏覽量

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

    關(guān)注

    0

    文章

    45

    瀏覽量

    4623

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    python生成器

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

    pim卡資料生成器

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

    自制酸奶生成器

    自制酸奶生成器
    發(fā)表于 04-23 11:48 ?1047次閱讀
    自制酸奶<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 ?1372次閱讀
    了解<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 ?3401次閱讀

    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 ?4500次閱讀

    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 ?1168次閱讀

    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 ?1047次閱讀

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

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

    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 ?1038次閱讀