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

一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

Python中的迭代器與生成器

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

Python迭代器與生成器

列表生成式

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

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

下面是一個復(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)

生成器

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

創(chuàng)建一個生成器,生成器保存的是一個算法,而不是具體的內(nèi)容??梢钥吹胶土斜砩墒降膮^(qū)別是就是把[]換成(),generator = (x for x in range(10))。

其實生成器就是一個迭代器,只不過它是一種特殊的迭代器:

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

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

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

def fib(length):
    """
    生成器定義一個斐波那契數(shù)列,生成器本身就是yield +  next實現(xiàn)。外部調(diào)用next來觸發(fā)一次計算
    函數(shù)遇到y(tǒng)ield返回,然后下一次next則繼續(xù)從上一次yield的地方向下執(zhí)行,直到遇到某個結(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)計算b = a + b的時候,
        這里的a并不是之前 a = b 之后a值,而是之前的a值,所以它是先做 = 右邊的計算,然后賦值給左邊的
        """
        a, b = b, a + b
        n = n + 1
    return 'done'


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

迭代器

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

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

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

把list1變成迭代器:

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

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

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

迭代器同時一定也是可迭代對象。生成器是一種特殊的迭代器,所以也是可迭代對象。

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

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

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

    關(guān)注

    7

    文章

    322

    瀏覽量

    21559
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4822

    瀏覽量

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

    關(guān)注

    0

    文章

    45

    瀏覽量

    4427

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    python生成器

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

    pim卡資料生成器

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

    自制酸奶生成器

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

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

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

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

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

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

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

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

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

    AN-113:精密坡道生成器

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

    python生成器是什么

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

    Arduino贊美生成器

    電子發(fā)燒友網(wǎng)站提供《Arduino贊美生成器.zip》資料免費下載
    發(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ù)計時比較(上)

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

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

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

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

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

    Python生成器的使用方法

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