我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種:
一類是集合資料型別,如list、tuple、dict、set、str等;
一類是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物件,但list、dict、str雖然是iterable,卻不是iterator。
把list、dict、str等iterable變成iterator可以使用iter()函式:
>>> isinstance(iter(), iterator)
true
>>> isinstance(iter('abc'), iterator)
true
python的iterator物件表示的是乙個資料流,iterator物件可以被next()函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實現按需計算下乙個資料,所以iterator的計算是惰性的,只有在需要返回下乙個資料時它才會計算。
iterator甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list是永遠不可能儲存全體自然數的。
凡是可作用於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
python筆記3高階特性
切片 閱讀 117822 取乙個list或tuple的部分元素是非常常見的操作。比如,乙個list如下 l michael sarah tracy bob jack 取前3個元素,應該怎麼做?笨辦法 l 0 l 1 l 2 michael sarah tracy 之所以是笨辦法是因為擴充套件一下,取...
python學習 高階特性
高階函式 可以使用函式作為引數的函式 def f func sorted 對列表排序,有乙個名為key的引數 指定key為abs,根據l的絕對值排序sorted l,key abs filter 對序列過濾 filter a,b a為函式,b為被處理的資料列表,a會對b中的每個元素判斷,結果為真擇保...
Python3(高階特性)
1.例題答案 小寫化含有數字的list l2 s.lower for s in l1 if isinstance s,str true l2.insert key,value for key,value in enumerate l1 if isinstance value,int true l2注...