我們已經知道,可以直接作用於for
迴圈的資料型別有以下幾種:
一類是集合資料型別,如list
、tuple
、dict
、set
、str
等;
一類是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
物件,但list
、dict
、str
雖然是iterable
,卻不是iterator
。
把list
、dict
、str
等iterable
變成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
你可能會問,為什麼list
、dict
、str
等資料型別不是iterator
?
這是因為python的iterator
物件表示的是乙個資料流,iterator物件可以被next()
函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration
錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函式實現按需計算下乙個資料,所以iterator
的計算是惰性的,只有在需要返回下乙個資料時它才會計算。
iterator
甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
小結凡是可作用於
for
迴圈的物件都是iterable
型別;凡是可作用於
next()
函式的物件都是iterator
型別,它們表示乙個惰性計算的序列;集合資料型別如
list
、dict
、str
等是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。可以使用...