python高階特性 迭代器

2021-08-21 14:30:53 字數 2715 閱讀 5549

本文**:廖雪峰的官方**

我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種:

一類是集合資料型別,如listtupledictsetstr等;

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

這些可以直接作用於for迴圈的物件統稱為可迭代物件:iterable

可以使用isinstance()判斷乙個物件是否是iterable物件:

>>> from collections import iterable

>>> isinstance(, iterable)

true

>>> isinstance({}, iterable)

true

>>> isinstance('abc', iterable)

true

>>> isinstance((x for x in range(10)), iterable)

true

>>> isinstance(100, iterable)

false

而生成器不但可以作用於for迴圈,還可以被next()函式不斷呼叫並返回下乙個值,直到最後丟擲stopiteration錯誤表示無法繼續返回下乙個值了。

可以使用isinstance()判斷乙個物件是否是iterator物件:

>>> from collections import iterator

>>> isinstance((x for x in range(10)), iterator)

true

>>> isinstance(, iterator)

false

>>> isinstance({}, iterator)

false

>>> isinstance('abc', iterator)

false

生成器都是iterator物件,但listdictstr雖然是iterable,卻不是iterator

listdictstriterable變成iterator可以使用iter()函式:

>>> isinstance(iter(), iterator)

true

>>> isinstance(iter('abc'), iterator)

true

你可能會問,為什麼listdictstr等資料型別不是iterator

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

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

凡是可作用於for迴圈的物件都是iterable型別;

凡是可作用於next()函式的物件都是iterator型別,它們表示乙個惰性計算的序列;

集合資料型別如listdictstr等是iterable但不是iterator,不過可以通過iter()函式獲得乙個iterator物件。

python的for迴圈本質上就是通過不斷呼叫next()函式實現的,例如:

for x in [1, 2, 3, 4, 5]:

pass

實際上完全等價於:

# 首先獲得iterator物件:

it = iter([1, 2, 3, 4, 5])

# 迴圈:

while true:

try:

# 獲得下乙個值:

x = next(it)

except stopiteration:

# 遇到stopiteration就退出迴圈

break

python高階特性 迭代

直接通過 進行學習 python基礎知識 高階特性 迭代 迭代語法 for x in y 任何可迭代物件都可迭代,常見的可迭代物件有 list和tuple t 1,2,3,false for x in l print x print for x in t print x dict和set,儲存是無序...

python高階特性 迭代

for v in d.values for k,v in d.items for a in adfa 判斷物件是否可迭代 from collections import iterable isinstance abc iterable 新增下標 for x,y in enumerate 1,1 2,...

python高階特性 迭代

for v in d.values for k,v in d.items for a in adfa 判斷物件是否可迭代 from collections import iterable isinstance abc iterable 新增下標 for x,y in enumerate 1,1 2,...