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

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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

Python中的迭代器與生成器

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2025-02-20 10:43 ? 次閱讀

Python迭代器與生成器

列表生成式

列表生成式也叫做列表推導式,它本身還是列表,只不過它是根據我們定義的規則來生成一個真實的列表。

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

下面是一個復雜的列子:

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)

生成器

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

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

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

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

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

用生成器實現斐波那契數列:

def fib(length):
    """
    生成器定義一個斐波那契數列,生成器本身就是yield +  next實現。外部調用next來觸發一次計算
    函數遇到yield返回,然后下一次next則繼續從上一次yield的地方向下執行,直到遇到某個結束條件
    :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]  當計算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()函數調用來獲取下一個元素的對象叫做迭代器。生成器就可以,但是普通集合類比如list、dict、str就不可以。集合類的對象比如list、dict、set、str;還有生成器都是可迭代對象,也就是可以遍歷的。但是它們并不一定都是迭代器。list、dict、str等數據類型不是Iterator。

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

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

把list1變成迭代器:

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

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

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

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

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

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

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

    關注

    7

    文章

    322

    瀏覽量

    21499
  • python
    +關注

    關注

    56

    文章

    4821

    瀏覽量

    85687
  • 迭代器
    +關注

    關注

    0

    文章

    45

    瀏覽量

    4418

原文標題:Python迭代器與生成器

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦

    python生成器

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

    pim卡資料生成器

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

    自制酸奶生成器

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

    代碼生成器的應用

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

    STM32庫函數代碼自動生成器正式版

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

    了解Python數據結構迭代對象、迭代生成器的概念

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

    帶你一起學習徹底搞懂Python生成器

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

    AN-113:精密坡道生成器

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

    python生成器是什么

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

    Arduino贊美生成器

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

    通用RFID生成器

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

    python迭代調用內置函數計時比較(上)

    python迭代工具自動調用迭代對象next方法,對迭代對象進行遍歷。 python的for循環、列表解析、map方法、
    的頭像 發表于 02-21 14:56 ?737次閱讀

    python迭代調用內置函數計時比較(下)

    python迭代工具自動調用迭代對象next方法,對迭代對象進行遍歷。 python的for循環、列表解析、map方法、
    的頭像 發表于 02-21 14:56 ?652次閱讀

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

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

    Python生成器的使用方法

    舉一個例子,編寫一個函數計算一串數字里所有偶數的個數,其實是很簡單的問題,但是有些人是用生成器這么寫的: In [ 66 ]: def f1 ( x ): ....: return sum ( c
    的頭像 發表于 11-03 15:41 ?595次閱讀
    主站蜘蛛池模板: 四虎国产精品永久地址51 | 国产美女久久久久 | 成人精品亚洲人成在线 | 色噜噜久久 | 天天看天天干 | 我爱操 | 国产精品虐乳在线播放 | 激情五月开心网 | 最近高清免费观看视频 | 欧美人与性另类 | 欧美ab在线 | 天天射夜夜骑 | 综合网天天操天天射 | www.黄黄黄| 日韩亚洲人成网站在线播放 | 欧美日韩国产另类一区二区三区 | 2022欧美高清中文字幕在线看 | 无人码一区二区三区视频 | 一级毛片视频在线 | 亚洲精品亚洲人成毛片不卡 | 午夜啪啪免费视频 | 在线播放免费人成毛片乱码 | 在线观看免费视频 | 波多野结衣的毛片 | 亚洲第一成人在线 | 久草亚洲视频 | 你懂的网址在线 | 9久久99久久久精品齐齐综合色圆 | 国产国产人免费人成免费视频 | 国产三级久久久精品三级 | 热re久久精品国产99热 | 性夜影院爽黄a爽免费视 | 国产gaysexchina男同men1068 | 国产大片黄在线看免费 | 女人本色高清在线观看wwwwww国产 | 青草午夜精品视频在线观看 | 四虎影院免费观看视频 | 欧美女同网站 | 性视频在线| 激情综合五月婷婷 | 天天翘夜夜洗澡天天做 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品