Python中的迭代器和生成器詳解
可迭代對(duì)象(Iterable)
任何實(shí)現(xiàn)了 __iter__ 方法的對(duì)象都可以稱為可迭代對(duì)象。
class Fib:
def __init__(self, n):
self.prev = 0
self.cur = 1
self.n = n
def __iter__(self):
return self
fib = Fib(5)
import collections
print('fib is Iterable? ', isinstance(fib, collections.Iterable))
print('fib is Iterator? ', isinstance(fib, collections.Iterator))
print(next(fib))fib is Iterable? True
fib is Iterator? False
Traceback (most recent call last):
File "D:/MyProject/Python/insight-tools-rest/test.py", line 27, in <module>
print(next(fib))
TypeError: 'Fib' object is not an iterator迭代器(Iterator)
迭代器是用于進(jìn)行迭代操作的對(duì)象,它可以像列表一樣使用 for 迭代獲取其中的每一個(gè)元素。當(dāng)然,列表、字典屬于可迭代對(duì)象,但并不是迭代器。
要將列表、字典等常見的可迭代對(duì)象變成迭代器,需要使用 iter 或者 __iter__() 進(jìn)行作用:
l = [1, 2, 3]
d = {'a': 1, 'b': 2, 'c': 3}
print(type(l))
print(type(d))
l = l.__iter__()
d = iter(d)
print(type(l))
print(type(d))<class 'list'> <class 'dict'> <class 'list_iterator'> <class 'dict_keyiterator'>
迭代器與列表的區(qū)別在于,列表是一次性把所有的元素加載到內(nèi)存,迭代器則是使用延遲計(jì)算的方式返回元素,只有在調(diào)用 next 方法的時(shí)候才去計(jì)算并返回該元素,也即 call by need 的方式,for 循環(huán)本質(zhì)上也是不斷調(diào)用迭代器的 next 方法來進(jìn)行遍歷。
如果要將一個(gè)可迭代對(duì)象變成迭代器的話,還需要實(shí)現(xiàn)一個(gè) __next__ 方法:
class Fib:
def __init__(self, n):
self.prev = 0
self.cur = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
if self.n > 0:
value = self.cur
self.cur += self.prev
self.prev = value
self.n -= 1
return value
else:
raise StopIteration()
fib = Fib(5)
import collections
print('fib is Iterable? ', isinstance(fib, collections.Iterable))
print('fib is Iterator? ', isinstance(fib, collections.Iterator))
print([i for i in fib])fib is Iterable? True
fib is Iterator? True
[1, 1, 2, 3, 5]
生成器(Generator)
普通函數(shù)一般使用 return 返回一個(gè)值,但在 Python 中還有一種函數(shù),用關(guān)鍵字 yield 來返回值,這種函數(shù)叫生成器。函數(shù)被調(diào)用時(shí)會(huì)返回一個(gè)生成器對(duì)象,生成器本質(zhì)上還是一個(gè)迭代器(特殊的迭代器,實(shí)現(xiàn)方式不一樣),因此在迭代操作中,生成器對(duì)象的行為和迭代器非常相似。下面是使用生成器實(shí)現(xiàn)的斐波那契數(shù)列:
def fib(n):
prev = 0
cur = 1
while n > 0:
yield cur
n -= 1
prev, cur = cur, cur + prev
# tmp = prev
# prev = cur
# cur = cur + tmp
print([i for i in fib(5)])[1, 1, 2, 3, 5]
當(dāng)然也可以使用 next 不斷去遍歷:
fib = fib(5) print(next(fib)) print(next(fib)) print(next(fib)) print(next(fib)) print(next(fib))
1
1
2
3
5
到此這篇關(guān)于Python中的迭代器和生成器詳解的文章就介紹到這了,更多相關(guān)迭代器和生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python對(duì)XML文件實(shí)現(xiàn)增刪改查操作
這篇文章主要為大家詳細(xì)介紹了Python對(duì)XML文件進(jìn)行實(shí)現(xiàn)增刪改查操作的方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下2022-11-11
關(guān)于pip install uwsgi安裝失敗問題的解決方案
這篇文章主要介紹了關(guān)于pip install uwsgi安裝失敗問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Python自動(dòng)化實(shí)現(xiàn)將PDF文檔高效轉(zhuǎn)換為HTML文件
PDF作為一種廣泛使用的文檔格式,以其版面固定、跨平臺(tái)兼容的特性,在商務(wù)和學(xué)術(shù)領(lǐng)域占據(jù)主導(dǎo)地位,本文將深入探討如何利用Python,高效精準(zhǔn)地將PDF文檔轉(zhuǎn)換為HTML文件,感興趣的可以了解下2025-10-10
Python小游戲?qū)崿F(xiàn)實(shí)例之接蘋果
其實(shí)利用Python編寫的小游戲很簡(jiǎn)單,下面這篇文章主要給大家介紹了關(guān)于Python小游戲?qū)崿F(xiàn)實(shí)例之接蘋果的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
Pytest測(cè)試報(bào)告工具Allure的高級(jí)用法
這篇文章介紹了Pytest測(cè)試報(bào)告工具Allure的高級(jí)用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Python獲取當(dāng)前路徑實(shí)現(xiàn)代碼
這篇文章主要介紹了 Python獲取當(dāng)前路徑實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05

