我們已經知道,可以直接作用於·for·迴圈的資料型別有以下幾種:
>>> 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
你可能會問,為什麼list
、dict
、str
等資料型別不是iterator
?
這是因為python
的iterator
物件表示的是乙個資料流,iterator
物件可以被next()
函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration
錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()
函式實現按需計算下乙個資料,所以iterator
的計算是惰性的,只有在需要返回下乙個資料時它才會計算。
iterator
甚至可以表示乙個無限大的資料流,例如全體自然數。而使用list
是永遠不可能儲存全體自然數
集合資料型別如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基礎知識之迭代器
我們已經知道,可以直接作用於 for 迴圈的資料型別有以下幾種 from collections import iterable isinstance iterable true isinstance iterable true isinstance abc iterable true isinst...
(五)Python基礎知識 迭代器
它是訪問集合元素的一種方式 它是乙個可以記住遍歷位置的物件 迭代器物件從集合的乙個元素開始訪問,直到所有元素被訪問結束,只能往前不會後退。包含兩個重要的方法 iter 和next 字串,列表,元組都可以用於建立迭代器。主要採用了for迴圈和while迴圈進行遍歷輸出 建立乙個列表 mylist 12...
Python基礎知識之裝飾器decorator
本質是函式,裝飾其他函式 為其他函式新增附加功能。不能修改被裝飾的函式的源 不能修改被裝飾的函式的呼叫方式 高階函式 巢狀函式 裝飾器 1.函式即 變數 定義乙個函式就相當於定義乙個變數,即將函式體賦值給乙個變數名。python的記憶體 機制規定 當儲存在記憶體中的內容沒有對應的變數名指定時,則當記...