迭代器筆記及斐波拉切數列

2021-10-23 20:46:25 字數 4502 閱讀 4863

迭代器是乙個可以記住遍歷位置的物件

迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束

第一種集合資料型別:列表,元組,字典,集合,字串等

第二種:生成器

統稱為可迭代物件

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...