日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python生成器与迭代器。

發布時間:2025/3/8 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python生成器与迭代器。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

生成器

在python 中一邊循環一邊計算的機制,叫做生成器(generator)。

通過列表生成式,我們可以直接創建一個列表。但是,收到內存的限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅占用很大的內存,如果我們只需要前面幾個元素,那么后面卻大多數的元素占用的內存就白白浪費掉了。所以,如果列表元素可以按照某種算法推算出來,就可以在循環過程中不斷推算出后續的元素。就不用創建完整的list,從而節省大量的空間。

生成器保存的是算法,每次調用 next(G) ,就計算出 G 的下一個元素的值,直到計算到最后一個元素,沒有更多的元素時,拋出 StopIteration 的異常。

?

資料參考:?https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317799226173f45ce40636141b6abc8424e12b5fb27000

      https://www.zhihu.com/question/20829330

創建生成器的方法

①要把一個列表生成式的 [ ] 改成 ( )

類似于列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表

a = (x for x in range(5)) print(a)
next(a)
next(a)
list(a)

②使用yieId

yieId 與 ruturn 一樣會返回一個值,但是這兩者是有區別的:

   yieId語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執

def gensquares(N):for i in range(N):yield i ** 2a = gensquares(5) b = gensquares(6)print(next(a)) print(next(b)) print(next(a)) print(next(b)) print(next(a)) print(next(b))print(list(a)) print(list(b))

?

總結

生成器是這樣一個函數,它記住上一次返回時在函數體中的位置。對生成器函數的第二次(或第 n 次)調用跳轉至該函數中間,而上次調用的所有局部變量都保持不變。

生成器不僅“記住”了它數據狀態;生成器還“記住”了它在流控制構造(在命令式編程中,這種構造不只是數據值)中的位置。

生成器的特點:

  • 節約內存
  • 迭代到下一次的調用時,所使用的參數都是第一次所保留下的,即是說,在整個所有函數調用的參數都是第一次所調用時保留的,而不是新創建的
  • ?

    ?迭代器

    迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的對象。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。

    可以被next()函數調用并不斷返回下一個值的對象稱為迭代器:Iterator。

    ?可迭代對象

    以直接作用于 for 循環的數據類型有以下幾種:

    一類是集合數據類型,如 list 、 tuple 、 dict 、 set 、 str 等;

    一類是 generator ,包括生成器和帶 yield 的generator function。

    這些可以直接作用于 for 循環的對象統稱為可迭代對象: Iterable 。

    ?

    iter()函數

    生成器都是 Iterator 對象,但 list 、 dict 、 str 雖然是 Iterable ,卻不是 Iterator 。

    把 list 、 dict 、 str 等 Iterable 變成 Iterator 可以使用 iter() 函數:

    ?

    ?總結

    • 凡是可作用于 for 循環的對象都是 Iterable 類型;
    • 凡是可作用于 next() 函數的對象都是 Iterator 類型
    • 集合數據類型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不過可以通過 iter() 函數獲得一個 Iterator 對象。

    迭代器與生成器的區別

    參考資料:http://blog.csdn.net/jinixin/article/details/72232604

    生成器是一種特殊的迭代器,但迭代器不一定是生成器。

    生成器是一種特殊的迭代器,生成器自動實現了“迭代器協議”(即__iter__和next方法),不需要再手動實現兩方法。

    生成器在迭代的過程中可以改變當前迭代值,而修改普通迭代器的當前迭代值往往會發生異常,影響程序的執行。

    ?

    轉載于:https://www.cnblogs.com/ksunone/p/8572088.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的python生成器与迭代器。的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。