在 Python 中,迭代器和產生器是處理資料序列的強大工具。它們允許您迭代數據,而無需將整個序列儲存在記憶體中。本部落格將以簡單易懂的方式並結合實際範例來解釋迭代器和生成器。
定義: 迭代器是 Python 中的一種對象,它允許您一次遍歷集合(如列表或元組)的所有元素。它遵循迭代器協議,其中包括實作兩個方法: __iter__() 和 __next__()。
迭代器如何運作:
__iter__():此方法傳回迭代器物件本身。
__next__():此方法傳回集合中的下一個值。如果沒有更多項目可返回,則會引發 StopIteration 異常。
自訂迭代器範例:
class MyIterator: def __init__(self, data): self.data = data self.index = 0 def __iter__(self): return self def __next__(self): if self.index < len(self.data): result = self.data[self.index] self.index += 1 return result else: raise StopIteration my_iter = MyIterator([1, 2, 3]) for item in my_iter: print(item)
輸出:
1 2 3
說明: 在此範例中,MyIterator 是一個自訂迭代器類,用於迭代數字列表。 __next__() 方法傳回清單中的下一個項目,並在沒有更多項目可傳回時引發 StopIteration。
Python 為內建集合(例如列表、元組、字典和集合)提供預設迭代器。您可以使用 iter 函數從這些集合中取得迭代器,然後使用 next 迭代它們。
my_list = [1, 2, 3] my_iter = iter(my_list) print(next(my_iter)) # Output: 1 print(next(my_iter)) # Output: 2 print(next(my_iter)) # Output: 3 # print(next(my_iter)) # This will raise StopIteration
定義:生成器是Python中一種特殊類型的迭代器,使用函數和yield關鍵字定義。生成器允許您迭代一系列值,而無需將它們一次全部儲存在記憶體中,這使得它們比列表更節省記憶體。
發電機如何運作:
範例:
def my_generator(): yield 1 yield 2 yield 3 gen = my_generator() for item in gen: print(item)
輸出:
1 2 3
說明: 在此範例中,my_generator 是一個生成器函數,它一一產生三個值。每次呼叫 Yield 都會產生一個值並暫停函數,直到請求下一個值。
記憶體效率:產生器動態產生值,並且不會將整個序列儲存在記憶體中,這使得它們非常適合處理大型資料集或資料流。
範例:
def large_sequence(): for i in range(1, 1000001): yield i gen = large_sequence() print(next(gen)) # Output: 1 print(next(gen)) # Output: 2
說明:該生成器產生一百萬個數字的序列,而不將它們全部儲存在記憶體中,展示了其記憶體效率。
迭代器:
自訂可迭代物件:當您需要對迭代邏輯進行更多控制。
無限序列:產生無限序列的值,例如來自感測器的資料。
發電機:
惰性評估:一次處理一項大型資料集。
管道:建構以串流方式處理資料的資料處理管道。
定義: 生成器表達式提供了一種建立生成器的簡潔方法。它們與列表推導式類似,但使用括號而不是方括號。
範例:
gen_exp = (x * x for x in range(5)) for value in gen_exp: print(value)
輸出:
0 1 4 9 16
說明:此產生器運算式會建立產生器,產生 0 到 4 之間的數字的平方。
範例1:讀取大檔案
def read_large_file(file_path): with open(file_path, 'r') as file: for line in file: yield line for line in read_large_file('large_file.txt'): print(line.strip())
說明: 此生成器函數逐行讀取一個大文件,一次產生一行。它具有記憶體效率,因為它不會將整個文件載入到記憶體中。
範例 2:斐波那契數列
def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci() for _ in range(10): print(next(fib))
輸出:
0 1 1 2 3 5 8 13 21 34
解釋: 此生成器函數產生無限的斐波那契數列。它示範如何使用生成器來產生可能無限的值序列。
* An iterator is an object that allows you to traverse through all the elements of a collection one at a time, implementing the `__iter__()` and `__next__()` methods.
* A generator is a special type of iterator defined using a function and the `yield` keyword, allowing you to generate values on the fly without storing them all in memory.
* Generators are memory-efficient, as they generate values on the fly. They are useful for processing large datasets, building data pipelines, and working with potentially infinite sequences.
* Generator expressions use parentheses and produce values one at a time, whereas list comprehensions use square brackets and generate the entire list in memory.
以上是如何在 Python 中使用迭代器和生成器的詳細內容。更多資訊請關注PHP中文網其他相關文章!