python高階特性5 迭代器 Iterator

2021-10-25 05:17:04 字數 3188 閱讀 6713

python五個高階特性

切片

迭代列表生成式

生成器迭代器

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

一類是集合資料型別,如list、tuple、dict、set、str等;

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

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

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

from collections.abc import iterable

print

(isinstance([

], iterable)

)# true

print

(isinstance

(, iterable)

)# true

print

(isinstance

('abc'

, iterable)

)# true

print

(isinstance

((x for x in

range(10

)), iterable)

)# true

print

(isinstance

(100

, iterable)

)# false

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

from collections.abc import iterator

print

(isinstance

((x for x in

range(10

)), iterator)

)# true

print

(isinstance([

], iterator)

)# false

print

(isinstance

(, iterator)

)# false

print

(isinstance

('abc'

, iterator)

)# false

生成器都是iterator物件(迭代器),但list、dict、str雖然是iterable

(可迭代物件),卻不是iterator(迭代器)。

把list、dict、str等iterable(可迭代物件)變成iterator(迭代器)可以使用iter()函式:

from collections.abc import iterator

print

(isinstance

(iter([

]), iterator)

)# true

print

(isinstance

(iter

('abc'

), iterator)

)# true

你可能會問,為什麼list、dict、str等資料型別不是iterator?

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

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

注意區分可迭代物件,迭代器和生成器

可迭代物件iterable

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

迭代器iterator

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

生成器 generator

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

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

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

集合資料型別如list、dict、str等是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

# next() 返回迭代器的下乙個專案。

# next() 函式要和生成迭代器的iter() 函式一起使用。

# next 語法:

next

(iterable[

, default]

)# 引數說明:

# iterable -- 可迭代物件

# default -- 可選,用於設定在沒有下乙個元素時返回該預設值,如果不設定,又沒有下乙個元素則會觸發 stopiteration 異常。

# 返回值 返回物件幫助資訊。

# 當用next()函式讀取檔案時:如果只執行一次預設讀取第一行。

python高階特性 迭代器

本文 廖雪峰的官方 我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種 一類是集合資料型別,如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function。這些可以直接作用於for迴圈的物件統稱為可迭代物件 ite...

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,...