python基礎 22 函式 迭代器

2021-10-08 23:06:02 字數 2437 閱讀 8917

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

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

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

這些可以直接作用於for迴圈的物件統稱為可迭代物件:iterable,可迭代的意思就是可遍歷、可迴圈

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

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

from collections import iterable

from collections import iterator

print

(isinstance([

], iterable)

)# true 是可迭代物件

print

(isinstance([

], iterator)

)# false 不是迭代器物件

print

(isinstance

((x for x in

range(10

)), iterable)

)# true

print

(isinstance

((x for x in

range(10

)), iterator)

)# true

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

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

print

(isinstance

(iter([

]), iterable)

)# true

print

(isinstance

(iter([

]), iterator)

)# true

# 示例

iterator =

iter([

1,2,

3,4,

5])print

(iterator.__next__())

for value in iterator:

print

(value, end=

"\t")-

---輸出---

-123

45

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

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

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

小結

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

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

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

Python基礎 迭代器

二 生成器 三 推導表示式 迭代器就是乙個容器,將可迭代物件通過iter包起來 li 1 2,3 4,5 a liter li 迭代器print next a 1print next a 2print next a 3 乙個個取值 1.訪問者不需要去關心內部結構,只需要通過next不斷去取下乙個內容...

Python基礎 迭代器

可以直接作用於for迴圈的資料型別有一下幾種 一類是集合資料型別 如list tuple dict set str等 一類是generator,包括生成器和帶yield的generator function 這些可以直接作用與for迴圈的物件統稱為可迭代物件 iterable 可以使用isinsta...

python基礎 迭代器

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