Python中迭代器和生成器的區別?

2021-09-27 06:03:58 字數 1649 閱讀 1525

廢話不多說,開始今天的題目:

問:說說python中迭代器和生成器的區別?

答:python中生成器能做到迭代器能做的所有事,而且因為自動建立了__iter__()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表示式取代列表解析,同時節省記憶體。除了建立和保持程式狀態的自動生成,當發生器終結時,還會自動跑出stopiterration異常。

列表、元組、字典、字串都是可迭代物件。

數字、布林值都是不可迭代的。

下面分別來說說這兩者的具體區別:

1、迭代器

迭代器物件要求支援迭代器協議的物件。在python中,支援迭代器協議就是實現物件的__iter__()和next()方法。其中__iter__()方法返回迭代器物件本身;next()方法返回容器的下乙個元素,在結尾時引發stopiteration異常。

下面用個簡單的列表來說迭代器的用法:

list = [1,2,3,4] # list是可迭代物件

lterator = iter(list) # 通過iter()方法取得list的迭代器

print(next(lterator)) # 1 通過next()獲取下乙個位置的值

print(next(lterator)) # 2

print(next(lterator)) # 3

print(next(lterator)) # 4

輸出:123

4

2、生成器

生成器(generator)就是乙個函式,它提供了一種實現迭代器協議的便捷方式。生成器與普通函式的區別在於它包含 yield 表示式,並且不需要定義 __iter__()和__next__()。

生成器是一種惰性的序列,如果我們需要建立乙個 0~1000000000 的序列,這樣大的序列建立出來會占用比較多的記憶體,生成器就是為了解決這樣的問題 。

下面用個簡單的例子來說生成器的用法:

# 普通序列

>>> g =

>>>

deff

():for x in range(5):

yield x # 返回並記錄函式狀態

# next

f = f()

>>> next(f) # 每呼叫一次next,就執行一次yield | 依靠這種需要才生產的工作機制,大大的節省資源

0>>> next(f)

1>>> next(f)

2>>> next(f)

3>>> next(f)

4# for next

>>>

for x in range(5):

>>>  print(next(f))01

234

python中迭代器和生成器

迭代器 迭代器的實質是實現了next 方法的物件,常見的元組 列表 字典都是迭代器。迭代器中重點關注兩種方法 iter 方法 返回迭代器自身。可以通過python內建函式iter 呼叫。next 方法 當next方法被呼叫的時候,迭代器會返回它的下乙個值,如果next方法被呼叫,但迭代器沒有只可以返...

python中迭代器和生成器

1 迭代器 iterator 是乙個實現了迭代器協議的物件,python的一些內建資料型別 列表,陣列,字串,字典等 都可以通過for語句進行迭代,我們也可以自己建立乙個容器,實現了迭代器協議,可以通過for,next方法進行迭代,在迭代的末尾,會引發stopiteration異常。迭代器有兩個基本...

python中迭代器和生成器

這裡的迭代可以指for迴圈,在python中,對於像list,dict和檔案等而言,都可以使用for迴圈,但是它們並不是迭代器,它們屬於可迭代物件。1.1什麼可迭代物件 最簡單的解釋 可以使用for.in.語句進行迴圈的物件,就是可迭代物件 iterable 可以使用isinstance 方法進行判...