迭代器是乙個可以記住遍歷位置的物件
迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束
第一種集合資料型別:列表,元組,字典,集合,字串等
第二種:生成器
統稱為可迭代物件
from collections import iterable
new_set =
print
(new_set)
print
(isinstance
(new_set,iterable)
)print
(isinstance
(123
,iterable)
)print
(isinstance
((i for i in
range(10
)),iterable)
)
判斷是否迭代器或者是可迭代物件例子:
from _collections_abc import iterable,iterator
x =[1,
2,3,
'asd'
]# print(isinstance(x,iterable))
# print(isinstance(1000,iterable))
y =[x for x in
range(10
)]z =(x for x in
range(10
))# print(type(y))
# print(type(z))
# print(isinstance(z,iterable))
print
(iter
(z))
print
(iter
(y))
print
(isinstance
(iter
(y),iterable)
)print
(isinstance
(iter
(y),iterator)
)print
(isinstance
(y,iterator)
)print
('##########################################'
)# 以列表為例,列表是乙個可迭代物件,iter這個方法獲取的是列表內部的迭代器
print
(isinstance
(z,iterator)
)print
(isinstance
(z,iterable)
)# 生成器是乙個迭代器物件,但是列表或者集合等是可迭代的,但是都不是迭代器
輸出
at 0x000001dd0ca802e0
>
>
true
true
false
##########################################
true
true
例項:`
from _collections_abc import iterable,iterator
class
mylist
(object):
def__init__
(self)
: self.newlist =
list()
def(self,data)
:'''
該方法實現了增加乙個元素至列表的末尾
:param data:
:return:
'''def__iter__
(self)
:'''當前的類中,因為iter這個魔法方法獲取的是__iter__方法中的迭代器'''
# 初始化乙個迭代器
iterobj = myiterator(self.newlist)
return iterobj
class
myiterator
(object):
# 這個類實現的是迭代器類
def__init__
(self,newlist)
: self.newlist = newlist
# 記錄的是當前迭代的索引
self.current_index =
0def
__iter__
(self)
:return self
def__next__
(self)
:# 當前的魔法方法記錄遍歷的位置,第二個功能是記錄需要獲取的值
if self.current_index <
len(self.newlist)
: self.current_index +=
1return self.newlist[self.current_index-1]
else
:#為了實現停止。
raise stopiteration
list1 = mylist(
)print
(isinstance
(list1,iterable)
)print
(isinstance
(iter
(list1)
,iterator)
)print
('#################################'
)# obj= myiterator([1,1,23,424,54,363,63,346,36,36,3,6])
# for i in obj:
# print(i)
obj= myiterator([1
,1,23
,424,54
,363,63
,346,36
,36,3
,6])
while
true
:try
: value=
next
(obj)
print
(value)
except stopiteration:
print
('迭代成功'
)break
輸出:
true
true
#################################11
23424
54363
63346
363636
迭代成功
process finished with exit code 0
這裡我們可以看到多了乙個except stopiteration。目的是讓程式停止,自啟自關。否則會一直走下去或者報錯
由此可以輸出斐波拉切數列
class
fibonacci
:'''迭代器類'''
def__init__
(self,month)
: self.a =
0 self.b =
1 self.month = month
self.n =
0def
__iter__
(self)
:return self
def__next__
(self)
:if self.n < self.month:
self.a,self.b = self.b,self.a+self.b
# self.n = self.n +1
self.n +=
1return self.a
else
:raise stopiteration
fi = fibonacci(5)
print
(isinstance
(fi,iterable)
)print
(isinstance
(iter
(fi)
,iterator)
)for i in fi:
print
(i)
注意點:
1、iter()方法訪問的是迭代器內部的__iter__魔法方法,__iter__這個魔法方法,直接返回迭代器物件本身,也就是self
2、next()方法訪問的是迭代器內部的__next__魔法方法,需要記錄資料的位置以及丟擲資料,所以,丟擲資料的邏輯寫在當前的方法
3、注意:__next__一定要判斷如果資料已經完全取出的時候,要主動丟擲錯誤 raise stopiteration
iter next:
iter()獲取的是__iter__魔法方法內容,一般寫為return self
next()獲取的是__next__魔法方法的內容,__next__實現的是1、記錄了訪問位置2、將訪問的資料返回
41 求斐波拉切數列
41 求斐波拉切數列 問題描述 斐波拉切數列a1,a2,an的定義如下 a1 1 a2 1 an an 1 an 2 n 2 求出第n項an的值。輸入說明 你的程式需要從標準輸入裝置 通常為鍵盤 中讀入多組測試資料。每組輸入資料由一行組成,其中只有乙個正整數n 0 n 20 兩組輸入資料間無空行。輸...
基礎41 求斐波拉切數列
41 求斐波拉切數列 問題描述 斐波拉切數列a1,a2,an的定義如下 a1 1 a2 1 an an 1 an 2 n 2 求出第n項an的值。輸入說明 你的程式需要從標準輸入裝置 通常為鍵盤 中讀入多組測試資料。每組輸入資料由一行組成,其中只有乙個正整數n 0 n 20 兩組輸入資料間無空行。輸...
斐波那切數列
定義斐波那契數列的第1 2項是1,之後每一項等於前兩項的和。1,1,2,3,5,8,13,21,34,55,89 輸入乙個整數n,輸出第n個斐波那契數。保證答案在int範圍內。include intadd int a if a 3 return arr a else return arr i 2 m...