最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python自定義迭代器的實現(xiàn)方法

 更新時間:2026年05月29日 09:38:36   作者:一天 24h  
自定義迭代器的核心是嚴格遵守 Python 迭代器協(xié)議,只要一個類實現(xiàn)了__iter__()和__next__()這兩個特殊方法,它的實例就是一個合法的迭代器,本文給大家介紹了Python自定義迭代器的實現(xiàn)方法,需要的朋友可以參考下

引言

自定義迭代器的核心是嚴格遵守 Python 迭代器協(xié)議。只要一個類實現(xiàn)了__iter__()__next__()這兩個特殊方法,它的實例就是一個合法的迭代器。

一、迭代器協(xié)議的核心要求

任何自定義迭代器都必須滿足以下兩個條件:

  1. __iter__(self):必須返回迭代器對象本身(return self)。這是為了讓迭代器可以直接用在for循環(huán)等接受可迭代對象的地方。
  2. __next__(self)
    • 返回序列中的下一個元素
    • 更新內部狀態(tài),指向下一個元素
    • 當沒有更多元素時,必須拋出StopIteration異常

二、第一個自定義迭代器:生成指定范圍的偶數(shù)

我們從最簡單的例子開始,實現(xiàn)一個能生成從startend之間所有偶數(shù)的迭代器:

class EvenIterator:
    def __init__(self, start, end):
        # 初始化迭代器的狀態(tài)
        self.current = start if start % 2 == 0 else start + 1  # 確保從偶數(shù)開始
        self.end = end

    def __iter__(self):
        # 迭代器必須返回自己
        return self

    def __next__(self):
        if self.current > self.end:
            # 沒有更多元素,拋出異常終止迭代
            raise StopIteration
        # 保存當前值
        result = self.current
        # 更新狀態(tài),指向下一個偶數(shù)
        self.current += 2
        # 返回當前值
        return result

使用這個迭代器

# 創(chuàng)建迭代器實例
even_iter = EvenIterator(1, 10)

# 1. 使用next()手動遍歷
print(next(even_iter))  # 輸出:2
print(next(even_iter))  # 輸出:4
print(next(even_iter))  # 輸出:6

# 2. 直接用for循環(huán)遍歷(自動處理next()和StopIteration)
for num in EvenIterator(1, 10):
    # end控制每個輸出的數(shù)用空格隔開,默認是換行‘\n'
    print(num, end=' ')  # 輸出:2 4 6 8 10

三、深入理解:迭代器的工作原理

1. 為什么__iter__()必須返回 self?

因為 Python 中所有接受 "可迭代對象" 的地方(for循環(huán)、list()、sum()等),都會先調用iter(對象)獲取迭代器。

如果__iter__()返回的不是 self,那么for循環(huán)拿到的就是另一個對象,而不是我們的迭代器本身,迭代邏輯就會失效。

2. 迭代器的 "一次性" 特性

迭代器的狀態(tài)是不可逆的,一旦遍歷到末尾,就無法再從頭開始:

even_iter = EvenIterator(1, 10)

# 第一次遍歷:正常輸出
print(list(even_iter))  # 輸出:[2, 4, 6, 8, 10]

# 第二次遍歷:空列表!
print(list(even_iter))  # 輸出:[]

這是因為第一次遍歷后,self.current已經變成了 12,再調用next()會直接拋出StopIteration

3. 如何實現(xiàn)可多次遍歷的 "可迭代對象"?

如果需要多次遍歷,應該將可迭代對象迭代器分開實現(xiàn):

  • 可迭代對象:實現(xiàn)__iter__(),每次返回一個新的迭代器實例
  • 迭代器:實現(xiàn)__iter__()__next__()
# 可迭代對象(可以多次遍歷)
class EvenNumbers:
    def __init__(self, start, end):
        self.start = start
        self.end = end

    def __iter__(self):
        # 每次調用iter()都返回一個新的迭代器
        return EvenIterator(self.start, self.end)

# 現(xiàn)在可以多次遍歷了
evens = EvenNumbers(1, 10)
print(list(evens))  # 輸出:[2, 4, 6, 8, 10]
print(list(evens))  # 輸出:[2, 4, 6, 8, 10]

四、實用自定義迭代器示例

示例 1:逆序遍歷列表的迭代器

class ReverseIterator:
    def __init__(self, data):
        self.data = data
        self.index = len(data)  # 從最后一個元素的下一個位置開始

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1
        return self.data[self.index]

# 使用
for char in ReverseIterator('hello'):
    print(char, end=' ')  # 輸出:o l l e h

示例 2:無限斐波那契數(shù)列迭代器

這是迭代器最強大的應用之一 —— 生成無限序列

class FibonacciIterator:
    def __init__(self):
        self.a = 0
        self.b = 1

    def __iter__(self):
        return self

    def __next__(self):
        result = self.a
        self.a, self.b = self.b, self.a + self.b
        return result

# 使用:按需生成,永遠不會結束
fib = FibonacciIterator()
for _ in range(15):
    print(next(fib), end=' ')  # 輸出:0 1 1 2 3 5 8 13 21 34 55 89 144 233 377

示例 3:分批處理數(shù)據(jù)的迭代器

class BatchIterator:
    def __init__(self, data, batch_size):
        self.data = data
        self.batch_size = batch_size
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        # 計算當前批次的結束位置
        end = self.index + self.batch_size
        # 切片獲取當前批次
        batch = self.data[self.index:end]
        # 更新索引
        self.index = end
        return batch

# 使用
data = list(range(100))
for batch in BatchIterator(data, 10):
    print(f"處理批次:{batch}")
    # 在這里處理每一批數(shù)據(jù)

五、更簡單的方式:生成器(Generator)

手動實現(xiàn)__iter__()__next__()雖然清晰,但比較繁瑣。Python 提供了生成器,可以用更簡潔的語法創(chuàng)建迭代器。

生成器使用yield關鍵字,自動實現(xiàn)了迭代器協(xié)議:

# 生成器函數(shù):等價于上面的EvenIterator
def even_generator(start, end):
    current = start if start % 2 == 0 else start + 1
    while current <= end:
        yield current  # 暫停執(zhí)行,返回當前值
        current += 2

# 使用方式和迭代器完全一樣
for num in even_generator(1, 10):
    print(num, end=' ')  # 輸出:2 4 6 8 10

生成器的優(yōu)勢

  1. 代碼更簡潔:不需要定義類和兩個特殊方法
  2. 自動管理狀態(tài):Python 會自動保存函數(shù)的執(zhí)行狀態(tài)
  3. 可讀性更高:邏輯更直觀,更容易理解

生成器表達式

對于簡單的迭代邏輯,還可以使用生成器表達式,這是創(chuàng)建迭代器的最簡潔方式:

# 生成器表達式:等價于even_generator(1, 10)
even_gen = (x for x in range(1, 11) if x % 2 == 0)

print(list(even_gen))  # 輸出:[2, 4, 6, 8, 10]

六、手動實現(xiàn) vs 生成器:如何選擇?

實現(xiàn)方式優(yōu)點缺點適用場景
手動實現(xiàn)迭代器完全控制迭代邏輯,靈活性最高代碼繁瑣,容易出錯復雜的迭代邏輯、需要維護復雜狀態(tài)
生成器函數(shù)代碼簡潔,可讀性高,自動管理狀態(tài)靈活性稍低大多數(shù)場景,尤其是中等復雜度的迭代邏輯
生成器表達式最簡潔,一行代碼搞定只能實現(xiàn)簡單邏輯簡單的轉換、過濾操作

七、自定義迭代器的常見坑

  1. 忘記在__next__()中拋出StopIteration:會導致無限循環(huán)
  2. __iter__()沒有返回 self:迭代器無法用在 for 循環(huán)中
  3. 迭代器狀態(tài)沒有正確更新:會導致重復返回同一個元素或跳過元素
  4. 試圖多次遍歷同一個迭代器:第二次遍歷會得到空結果

八、總結:自定義迭代器的步驟

  1. 定義一個類
  2. __init__()方法中初始化迭代器的狀態(tài)
  3. 實現(xiàn)__iter__()方法,返回 self
  4. 實現(xiàn)__next__()方法:
    • 檢查是否還有更多元素
    • 如果沒有,拋出StopIteration
    • 如果有,計算并返回當前元素
    • 更新內部狀態(tài),指向下一個元素

總而言之:自定義迭代器是 Python 迭代機制的底層核心,通過遵守迭代器協(xié)議,我們可以實現(xiàn)高效、靈活的數(shù)據(jù)遍歷。生成器是簡化版的自定義迭代器,適用于大多數(shù)場景;而手動實現(xiàn)類則提供了最高的靈活性,滿足復雜的迭代需求。

以上就是Python自定義迭代器的實現(xiàn)方法的詳細內容,更多關于Python自定義迭代器實現(xiàn)的資料請關注腳本之家其它相關文章!

相關文章

  • Python使用OCR實現(xiàn)提取掃描PDF的文本

    Python使用OCR實現(xiàn)提取掃描PDF的文本

    從 PDF 中提取文本一直是很多人的需求,本文將帶你了解如何借助 Python + OCR 技術,從掃描 PDF 中提取可編輯文本,希望對大家有所幫助
    2025-09-09
  • 使用Python腳本批量搞定所有文件重命名

    使用Python腳本批量搞定所有文件重命名

    日常工作中你是不是也遇到過這種場景:整理旅行照片時,一堆?IMG_001.jpg、IMG_002.jpg看得眼花繚亂,其實根本不用這么費勁,今天就教你寫一個超實用的Python小腳本,30行代碼實現(xiàn)文件批量重命名,需要的朋友可以參考下
    2026-01-01
  • python十進制和二進制的轉換方法(含浮點數(shù))

    python十進制和二進制的轉換方法(含浮點數(shù))

    這篇文章主要介紹了python十進制和二進制的轉換方法(含浮點數(shù)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Python將字符串轉換為小寫字母的幾種常用方法

    Python將字符串轉換為小寫字母的幾種常用方法

    這篇文章主要介紹了Python中將字符串大寫字母轉小寫的四種方法:lower()方法簡潔高效,手動ASCII轉換靈活可控,str.translate()性能優(yōu)化適合大數(shù)據(jù)處理,列表推導式實現(xiàn)代碼簡潔,總結方法優(yōu)缺點及適用場景,需要的朋友可以參考下
    2025-05-05
  • 請不要重復犯我在學習Python和Linux系統(tǒng)上的錯誤

    請不要重復犯我在學習Python和Linux系統(tǒng)上的錯誤

    本人已經在運維行業(yè)工作了將近十年,我最早接觸Linux是在大二的樣子,那時候只追求易懂,所以就選擇了Ubuntu作為學習、使用的對象,它簡單、易用、好操作、界面絢麗,對于想接觸Linux的新手來說是非常不錯的
    2016-12-12
  • Python發(fā)送郵件測試報告操作實例詳解

    Python發(fā)送郵件測試報告操作實例詳解

    這篇文章主要介紹了Python發(fā)送郵件測試報告操作,結合實例形式較為詳細的分析了Python郵件發(fā)送相關模塊使用及操作注意事項,需要的朋友可以參考下
    2018-12-12
  • Pyramid將models.py文件的內容分布到多個文件的方法

    Pyramid將models.py文件的內容分布到多個文件的方法

    默認的Pyramid代碼結構中,就只有一個models.py文件,在實際項目中,如果需要對models進行分類,放到不同文件下,應該怎么辦
    2013-11-11
  • Python中pandas庫sort_values()方法的使用

    Python中pandas庫sort_values()方法的使用

    最后去看了有關于 sort_values 的文檔,成功解決先把單詞出現(xiàn)頻次由高往低依次排序,再把頻次相同的情況下的單詞按照 MD5 值排序這個問題,下面通過本文講解下Python中pandas庫sort_values()方法的使用,感興趣的朋友一起看看吧
    2023-07-07
  • 帶你一文讀懂Python垃圾回收機制

    帶你一文讀懂Python垃圾回收機制

    這篇文章主要介紹了帶你一文讀懂Python垃圾回收機制,如果對其垃圾回收機制不了解,很多時候寫出的 Python 代碼會非常低效,需要的朋友可以參考下
    2023-04-04
  • Python使用re模塊正則提取字符串中括號內的內容示例

    Python使用re模塊正則提取字符串中括號內的內容示例

    這篇文章主要介紹了Python使用re模塊正則提取字符串中括號內的內容,結合實例形式分析了Python使用re模塊進行針對括號內容的正則匹配操作,并簡單解釋了相關修正符與正則語句的用法,需要的朋友可以參考下
    2018-06-06

最新評論

施秉县| 茶陵县| 油尖旺区| 同仁县| 金沙县| 临朐县| 新宁县| 连城县| 定州市| 德兴市| 边坝县| 芜湖市| 镇康县| 长岭县| 长丰县| 武隆县| 舟曲县| 东辽县| 宁德市| 依兰县| 铁岭县| 扶余县| 天气| 新兴县| 崇州市| 舞阳县| 惠安县| 西华县| 紫云| 南木林县| 定西市| 盐边县| 通河县| 门源| 宁南县| 青冈县| 孟村| 江津市| 贵定县| 余江县| 伊吾县|