1. 程式人生 > 實用技巧 >迭代 可迭代物件 迭代器的bj

迭代 可迭代物件 迭代器的bj

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)