迭代 可迭代物件 迭代器的bj
阿新 • • 發佈:2020-12-15
1.迭代的概念
迭代是重複反饋過程的活動,其目的通常是為了逼近所需目標或結果。每一次對過程的重複稱為一次“迭代”,而每一次迭代得到的結果會作為下一次迭代的初始值。
2.可迭代物件
- 可以被for迴圈遍歷獲取的物件為可迭代物件
- 具備__iter__方法的物件為可迭代物件
3.可迭代物件的判斷
- isinstance :提供判斷某個物件是否屬於某個類,如果屬於返回True,如果不屬於返回False
- for迴圈來判斷
- 如果物件中具備__iter__方法的話,就是可迭代物件
3.自定義類生成例項物件演示
# 匯入模組
from collections.abc import Iterable
# 什麼是可迭代物件
class Mylist:
def __init__(self):
self.items = list()
def add(self, item):
self.items.append(item)
m = Mylist()
# 如果是可迭代物件,返回True,否則返回False
print(isinstance(m, Iterable))
4.具備__iter__方法的類
# 什麼是可迭代物件
class Mylist:
def __init__(self):
self.items = list()
def add(self, item):
self.items.append(item)
def __iter__(self):
pass
m = Mylist()
# 如果是可迭代物件,返回True,否則返回False
print(isinstance(m, Iterable))
5.iter()函式和__next__()函式
- iter()函式:可以獲取可迭代物件的迭代器
- 呼叫iter函式會觸發__iter__魔法方法
- next()函式:對一個可迭代物件的迭代器呼叫該方法,可以返回該物件的下一條資料。
- 呼叫next函式會觸發__next__魔法方法
6.__iter__方法返回迭代器
# 匯入模組
from collections.abc import Iterable
# 什麼是可迭代物件
class Mylist:
def __init__(self):
self.items = list()
def add(self, item):
self.items.append(item)
def __iter__(self):
# 區域性iter方法此時該物件僅僅為可迭代物件,還不能進行for迴圈遍歷
# __iter__必須返回一個具備__iter__方法和__next__方法的物件
# 只要具備了__iter__方法和__next__方法,那麼這個物件叫做迭代器物件
return MyIterator
class MyIterator:
def __iter__(self):
pass
def __next__(self):
pass
mi = MyIterator()
m = Mylist()
# 如果是可迭代物件,返回True,否則返回False
# print(isinstance(m, Iterable))
m.add(1)
m.add(2)
m.add(3)
for i in m:
print(i)
# iter()函式 __iter__方法 iter(物件) --> 返回值
#
#
#
#
# next()函式 __next__方法 next(返回值)
7.迭代器的概念
- 具備了__iter__方法
- 具備了__next__方法
8.總結
- 可迭代物件:具備__iter__方法的物件為可迭代物件
- 如何能夠被for‘迴圈:__iter__具有返回值,返回的是一個迭代器
- 迭代器:具備__iter__方法和__next__方法的物件
- 只要是迭代器肯定是迭代物件 √
- 只要是可迭代物件就是迭代器 ×
1.程式碼實現
# 定義一個類
# 怎麼樣才能成為可迭代物件?
# __iter__方法需要返回什麼東西?
class MyList:
def __init__(self):
self.items = list()
def add(self, item):
self.items.append(item)
# 要想成為可迭代物件類,必須具備__iter__方法
def __iter__(self):
# 省略
# 需要在iter方法內返回個什麼東西
# iter方法到底需要返回一個什麼東西
# 這個物件是個什麼 --> 迭代器
return MyIterator(self.items)
class MyIterator:
def __init__(self, obj):
self.mes = obj
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
# 索引越界
if self.current_num < len(self.mes):
result = self.mes[self.current_num]
self.current_num += 1
return result
else:
raise StopIteration
# a = MyIterator()
# 通過類生成例項物件
m = MyList()
m.add(1)
m.add(2)
m.add(3)
m.add(4)
# m物件具備使用for迴圈的方法嗎?
# iter next
for i in m:
print(i)
2.斐波那契數列
n = int(input("請輸入:"))
class Mun:
def __init__(self):
self.num1 = list()
def fbnq(self):
a = 0
b = 1
i = 0
while i < n:
self.num1.append(a)
a, b = b, a+b
i += 1
def __iter__(self):
return DieDaiQi(self.num1)
class DieDaiQi:
def __init__(self,obj):
self.mes = obj
self.current_num = 0
def __iter__(self):
pass
def __next__(self):
if self.current_num < len(self.mes):
result = self.mes[self.current_num]
self.current_num += 1
return result
else:
raise StopIteration
m = Mun()
m.fbnq()
for i in m:
print(i)