容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in
,not in
關鍵字判斷元素是否包含在容器中。通常這類資料結構把所有的元素儲存在記憶體中(也有一些特例,並不是所有的元素都放在記憶體,比如迭代器和生成器物件)在python中,常見的容器物件有:
從技術角度來說,當它可以用來詢問某個元素是否包含在其中時,那麼這個物件就可以認為是乙個容器,比如列表、集合、元組都是容器物件。
一般容器都是可迭代物件,但並非所有容器都可迭代。
實現了__iter()__方法並呼叫該方法能返回迭代器的物件,稱為可迭代物件。
迭代器協議是:物件必須提供乙個next方法,執行該方法要麼返回迭代的下一項,要麼就引起乙個 stopiteration異常,以終止迭代(只能往後走 不能往前推)。
協議是一種約定,可迭代物件 實現了迭代器協議,python的內部工具(如for迴圈, sum , min max函式)使用迭代器協議訪問物件
實現了__next__()
方法並呼叫__next()__
方法的時候返回容器中的下乙個值的物件,可稱為迭代器,
classfib:
def __init__(self):
self.prev = 0
self.curr = 1
def __iter__(self):
return
self
def __next__(self):
value =self.curr
self.curr +=self.prev
self.prev =value
if value > 500:
raise(stopiteration) #引起乙個 stopiteration異常
return
value
>>> f =fib()
>>>for i in f:
if i<20:
print(i)
#---------------
112fib是可迭代物件(實現了__iter()__方法),也是迭代器(實現了__next()__方法)。35813
21
生成器是一種特殊的迭代器(可呼叫__next__()方法),生成器通過yiled返回數值,用生成器來實現斐波那契數列的例子是:
def生成器表示式是列表推倒式的生成器版本,看起來像列表推導式,但是它返回的是乙個生成器物件而不是列表物件。fib():
prev, curr = 0, 1
while
true:
yield
curr
prev, curr = curr, curr +prev
f = fib() #
生成生成器f
for i in
f:
(i)
if i>20:
break
#---------------11
2358
1321
a = (x**2 for x in range(6))(a)#
at 0x0000000002e3b200>
sum(a)#55
l=[x**2 for x in range(6)]
(l)#
[0, 1, 4, 9, 16, 25]
python之迭代器與生成器
迭代器是乙個可以記住遍歷的位置的物件.迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完,迭代器只能往前,不能退後。迭代器有兩個基本的方法 iter 和next 注意 1.迭代器只能往前取值,不會後退。2.用iter函式可以返回乙個可迭代物件的迭代器。如果乙個函式中包括yield關鍵字,那...
Python之迭代器與生成器
每一次對過程的重複稱為一次 迭代 而每一次迭代得到的結果會作為下一次迭代的初始值。例如 迴圈獲取容器中的元素。定義 具有 iter 函式的物件,可以返回迭代器物件。例如列表,元組 語法 建立 class 可迭代物件名稱 def iter self return 迭代器 使用 for 變數名 in 可...
Python之迭代器與生成器
可迭代物件 字面意思分析 可以重複的迭代的實實在在的東西。list,dict keys values items tuple,str,set,range,檔案控制代碼 待定 專業角度 內部含有 iter 方法的物件,就是可迭代物件。內建函式 dir print dir str 判斷乙個物件是否是可迭...