迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。**list、tuple等都是可迭代物件,我們可以通過iter()函式獲取這些可迭代物件的迭代器。然後我們可以對獲取到的迭代器不斷使用next()函式來獲取下一條資料。**iter()函式實際上就是呼叫了可迭代物件的
__iter__
方法。
>>
> li =[11
,22,33
,44,55
]>>
> li_iter =
iter
(li)
>>
>
next
(li_iter)
11>>
>
next
(li_iter)
22>>
>
next
(li_iter)
33>>
>
next
(li_iter)
44>>
>
next
(li_iter)
55>>
>
next
(li_iter)
traceback (most recent call last)
: file ""
, line 1,in
stopiteration
>>
>
注意,當我們已經迭代完最後乙個資料之後,再次呼叫next()函式會丟擲stopiteration的異常,來告訴我們所有資料都已迭代完成,不用再執行next()函式了。
迭代器是用來幫助我們記錄每次迭代訪問到的位置,當我們對迭代器使用next()函式的時候,迭代器會向我們返回它所記錄位置的下乙個位置的資料。實際上,在使用next()函式的時候,呼叫的就是迭代器物件的__next__
方法所以,我們要想構造乙個迭代器,就要實現它的__next__方法。但這還不夠,python要求迭代器本身也是可迭代的,所以我們還要為迭代器實現__iter__
方法,而__iter__
方法要返回乙個迭代器,迭代器自身正是乙個迭代器,所以迭代器的__iter__
方法返回自身即可。
乙個實現了__iter__方法和__next__方法的物件,就是迭代器。
class
fibiterator
(object):
"""斐波那契數列迭代器"""
def__init__
(self, n)
:"""
:param n: int, 指明生成數列的前n個數
"""self.n = n
# current用來儲存當前生成到數列中的第幾個數了
self.current =
0# num1用來儲存前前乙個數,初始值為數列中的第乙個數0
self.num1 =
0# num2用來儲存前乙個數,初始值為數列中的第二個數1
self.num2 =
1def
__next__
(self)
:"""被next()函式呼叫來獲取下乙個數"""
if self.current < self.n:
num = self.num1
self.num1, self.num2 = self.num2, self.num1+self.num2
self.current +=
1return num
else
:raise stopiteration
def__iter__
(self)
:"""迭代器的__iter__返回自身即可"""
return self
if __name__ ==
'__main__'
: fib = fibiterator(10)
for num in fib:
print
(num, end=
" ")
可以使用 isinstance() 判斷乙個物件是否是 iterable 物件:
in [50]
:from collections import iterable
in [51]
:isinstance([
], iterable)
out[51]
:true
簡述Python迭代器
物件必須提供乙個next方法,執行方法要麼返回迭代器的下一項,要麼就引起乙個stopiteration異常,以終止迭代。協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具 如for迴圈,sum min max函式等 使用迭代器協議訪問物件。實現了迭代器協議的物件叫可迭代物件,滿足以下...
迭代器,生成器,裝飾器簡述
它是指對函式執行過程,做一些擴充套件,甚至可以更改本身函式的執行,它就是在不改變原始碼的情況下,給它新增新的功能 python提供的內建裝飾器有?classmethod修飾類函式,可以由物件和類呼叫,在類函式中,有乙個 引數,如果使用類函式執行,引數指這個類。如果使用物件.類函式執行,函式指物件的型...
迭代器與生成器(python)簡述
迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和next 字串,列表或元組物件都可用於建立迭代器 在 python 中,使...