Python迭代器 生成器

2022-07-16 21:18:17 字數 2268 閱讀 4838

python中經常用到迭代,但是對於迭代器、生成器一直處於模糊的理解,檢視了不少資料,感覺有些清晰了。

通過for迴圈不斷的拿到list中的值就是迭代,迭代就是迴圈做重複的事情。

for i in range(10):

print(i)

可以通過for迴圈進行迭代的物件稱為可迭代物件(iterable),如何判斷是否是可迭代物件,可以用collection模組中的iterable來判斷

>>> from collections import iterable

>>> isinstance(,iterable)

true

>>> isinstance("",iterable)

true

>>> isinstance({},iterable)

true

>>> isinstance(123,iterable)

false

>>> isinstance((),iterable)

true

可迭代物件內部都實現了_iter_方法,例如list,通過help(list)檢視

|  __iter__(self, /)

| implement iter(self).

可迭代物件可以通過迴圈拿到值,但是可迭代物件不是迭代器。

為什麼list、dict、str等資料型別不是iterator?這是因為python的迭代器(iterator)物件表示的是乙個資料流,迭代器(iterator)物件可以被next() 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下乙個資料,所以iterator的計算是惰性的,只有在需要返回下乙個資料時它才會計算。

迭代器(iterator)甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。

迭代器可以通過next函式不斷計算下乙個資料。

>>> c=iter(b)

>>> c

>>> next(b)

traceback (most recent call last):

file "", line 1, in typeerror: 'list' object is not an iterator

>>> next(c)

0

可以看到list是可迭代物件,但是無法使用next函式,因為它不是迭代器,而c則可以

建立迭代器的方法

可以通過 iter(list/set..) 來把乙個可迭代物件建立為迭代器。

生成器可以理解為特殊的迭代器,它也實現了iter和next方法,也是基於計算的迭代,一邊計算一邊迭代的機制稱為generator

建立生成器的方法

1. 通過列表推導式,把列表生成式的改為()

>>> g=(x for x in range(10))

>>> type(g)

2.通過生成器函式得到乙個生成器,定義乙個包含yield的函式,普通函式中通過return返回值,返回後整個函式已經結束,而生成器函式中通過yield返回值,返回後會記錄yield的位置,然後下次再呼叫會從yield的位置繼續執行

def func(n):

a=1for i in range(n):

yield a

a+=i

a=func(5)

print(a)

print(a.__next__())

print(a.__next__())

print(a.__next__())

print(a.__next__())

print(a.__next__())

print(a.__next__())

print(a.__next__())

print(a.__next__())

看下結果,返回的是乙個生成器,可以通過next函式不斷拿到值,直到丟擲stopiteration

1. 可迭代物件不一定是迭代器

2.迭代器一定是可迭代物件

3.實現了__next__函式(或可以通過next函式取值),__iter__函式的是迭代器

4.生成器是特殊的迭代器,可以通過列表推導式或者函式中使用yield來獲得生成器

Python 迭代器 生成器

可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...

python 迭代器,生成器

什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...

python 迭代器 生成器

知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...