生成器 迭代器

2021-08-15 18:52:27 字數 1558 閱讀 8497

最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。

想深入具體學習廖大部落格請移步廖雪峰的官方**

有時候用迴圈生成列表太過繁瑣,就可用列表生成式代替。

l = [ x for x in range(1, 4)]    #此時與應用迴圈區別不大

>>> l = [1, 2, 3]

l = [x*y for x in range(1, 4) for y in range(1, 4)]    #一行**即可實現雙重迴圈

>>> l = [1, 2, 3, 2, 4, 6, 3, 6, 9]

l = [x*y for x in range(1, 4) for y in range(1, 4) if x*y % 2 != 0]    # 也可加條件 

>>> l = [1, 3, 3, 9]

通過列表生成式可以建立乙個列表,但受記憶體限制,此種方法建立的列表長度有限,且一次性生成整個列表也是不划算的,因為列表內後面的資料短時間內可能用不到。那有沒有方法可以實現動態生成資料呢,即需要使用時再生成資料,不使用之前不生成。

在python中,這種邊迴圈邊計算的機制,稱為生成器,即generator。

建立生成器的方法:

將列表生成式的改為()即可。例:g = (x*x for x in range(1, 10)),即是乙個生成器。可通過next(g)函式逐個生成資料。每呼叫一次next(g)即可生成乙個資料:1,4,9……。也可利用for迴圈生成資料:for n in g: print(n)

使用yield關鍵字,當函式中出現yield關鍵字後,該函式就不再是普通函式,而是乙個生成器。普通函式按順序執行,遇到return或最後一行就返回,下次呼叫再從頭開始重複執行;生成器遇到yield關鍵字即返回資料,下次呼叫繼續執行yield後面的程式。

例:def odd():

print ('step 1')

yield 1

print ('step 2')

yield 3

print ('step 3')

yield 5

呼叫該生成器時,先生成乙個generator物件,然後用next()不斷獲得返回值

>>> g = odd()

>>> next(g)

step 1

1>>>next(g)

step 2

可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器。

generator都是迭代器。可使用isinstance(, itarator)來判斷乙個物件是否是迭代器。

list、dict、str等都不是迭代器,可用iter()將其轉換為迭代器,iter(list)。

迭代器表示乙個資料流,可被看作乙個未知長度的有序序列,只有當需要返回下乙個數值時才計算。

迭代器,生成器

迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...

迭代器 生成器

迭代器 iter 可迭代物件 下乙個元素的值 next 可迭代物件 類中實現 iter 方法 提供迭代器 實現迭代器 import time class mylistiter object 迭代器類 def init self,data self.data data self.index 0 def...

迭代器生成器

迭代器 iterator 概述 迭代器是訪問集合內元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素都被訪問一遍後結束。迭代器不能回退,只能往前進行迭代。這並不是什麼很大的缺點,因為人們幾乎不需要在迭代途中進行回退操作。迭代器也不是執行緒安全的,在多執行緒環境中對可變集合使用迭代器...