一、迭代器介紹
在 Python 中,迭代器是一種用於迭代各種容器對象的對象。對於容器(例如列表、元組或字元串)的每個元素,它可以返回一個元素,直到沒有更多元素可以返回為止。在 Python 中,迭代器是一種工具,非常適合遍歷大型和複雜的容器對象。
在 python 中,一個對象要成為迭代器,必須同時滿足以下兩個條件:
第一,該對象必須滿足可迭代的協議,即實現了 “__iter__()“ 方法,這個方法返回一個迭代器對象。
第二,該對象必須滿足迭代器的協議,即實現了 “__next__()“ 方法,這個方法返回下一個元素,如果沒有下一個元素,則拋出 “StopIteration“ 異常。
class MyIterator: def __init__(self, n): self.i = 0 self.n = n def __iter__(self): return self def __next__(self): if self.i < self.n: i = self.i self.i += 1 return i else: raise StopIteration()
二、內置迭代器函數
1、`map()`
`map()` 函數將一個函數應用於一個序列的每個元素,並返回一個由結果組成的列表。
def square(x): return x ** 2 lst = [1, 2, 3, 4, 5] result = list(map(square, lst)) print(result) # [1, 4, 9, 16, 25]
2、`filter()`
`filter()` 函數返回一個由滿足指定條件的元素組成的迭代器對象,條件是由一個函數指定的。
def is_even(x): return x % 2 == 0 lst = [1, 2, 3, 4, 5] result = list(filter(is_even, lst)) print(result) # [2, 4]
3、`zip()`
`zip()` 函數返回一個由元組組成的迭代器對象,每個元組由傳遞給 `zip()` 函數的每個序列的相應元素組成。
lst1 = [1, 2, 3] lst2 = ['a', 'b', 'c'] result = list(zip(lst1, lst2)) print(result) # [(1, 'a'), (2, 'b'), (3, 'c')]
4、`enumerate()`
`enumerate()` 函數返回一個由元組組成的迭代器對象,每個元組包含一個索引和一個序列元素。
lst = ['apple', 'banana', 'orange'] result = list(enumerate(lst)) print(result) # [(0, 'apple'), (1, 'banana'), (2, 'orange')]
三、自定義迭代器函數
自定義迭代器的主要目的是將一組數據轉換為迭代器對象。以下是一個實現自定義迭代器的基本方法。
1、定義一個類,並實現 “__iter__()“ 和 “__next__()“ 方法。
2、在 “__iter__()“ 方法中,返回當前對象。
3、在 “__next__()“ 中,返回一些數據,並不斷迭代直到結束。
class MyIterator: def __init__(self, n): self.i = 0 self.n = n def __iter__(self): return self def __next__(self): if self.i < self.n: i = self.i self.i += 1 return i else: raise StopIteration() my_iter = MyIterator(5) for i in my_iter: print(i)
四、迭代器和生成器的區別
生成器和迭代器實現的功能有重合,但它們之間還是有很大的區別。生成器是迭代器的一種實現,它們都是用於迭代的,但是生成器是一種更為方便的實現方式,因為你完全不用擔心狀態和下一次要返回的值,這些狀態都被自動地處理了。
生成器函數與普通函數的唯一區別是它們在執行後會暫停,並且在下一次調用時從它們離開的地方繼續運行。
def my_generator(): yield 0 yield 1 yield 2 for i in my_generator(): print(i)
五、總結
在 Python 中,迭代器是處理、遍歷序列和數據集合的一種方式。標準庫中有許多強大的迭代器函數,同時我們還可以通過自定義迭代器來處理數據集。
生成器是迭代器更為方便的實現方式,因為它們會在運行時自動處理狀態和返回值。
通過使用迭代器和生成器,我們可以輕鬆處理大型和複雜的數據集,提高程序效率。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/279190.html