Dalam Python, iterator dan penjana ialah alatan berkuasa untuk bekerja dengan jujukan data. Mereka membenarkan anda mengulangi data tanpa perlu menyimpan keseluruhan urutan dalam ingatan. Blog ini akan menerangkan iterator dan penjana dengan cara yang mudah dan boleh difahami, dengan contoh yang praktikal.
Definisi: Iterator ialah objek dalam Python yang membolehkan anda merentasi semua elemen koleksi (seperti senarai atau tuple) satu demi satu. Ia mengikut protokol lelaran, yang termasuk melaksanakan dua kaedah: __iter__() dan __next__().
Cara Iterator Berfungsi:
__iter__(): Kaedah ini mengembalikan objek iterator itu sendiri.
__next__(): Kaedah ini mengembalikan nilai seterusnya daripada koleksi. Jika tiada lagi item untuk dipulangkan, ini akan menimbulkan pengecualian StopIteration.
Contoh Iterator Tersuai:
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)
Output:
1 2 3
Penjelasan: Dalam contoh ini, MyIterator ialah kelas iterator tersuai yang berulang pada senarai nombor. Kaedah __next__() mengembalikan item seterusnya dalam senarai dan menaikkan StopIteration apabila tiada lagi item untuk dikembalikan.
Python menyediakan iterator lalai untuk koleksi terbina dalam seperti senarai, tupel, kamus dan set. Anda boleh menggunakan fungsi iter untuk mendapatkan iterator daripada koleksi ini dan kemudian gunakan seterusnya untuk lelaran melaluinya.
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
Definisi: Penjana ialah jenis lelaran khas dalam Python, ditakrifkan menggunakan fungsi dan kata kunci hasil. Penjana membenarkan anda mengulangi urutan nilai tanpa menyimpan kesemuanya dalam ingatan sekaligus, menjadikannya lebih cekap ingatan daripada senarai.
Cara Penjana Berfungsi:
Contoh:
def my_generator(): yield 1 yield 2 yield 3 gen = my_generator() for item in gen: print(item)
Output:
1 2 3
Penjelasan: Dalam contoh ini, my_generator ialah fungsi penjana yang menghasilkan tiga nilai satu demi satu. Setiap panggilan untuk menghasilkan menghasilkan nilai dan menjeda fungsi sehingga nilai seterusnya diminta.
Kecekapan Memori: Penjana menjana nilai dengan pantas dan tidak menyimpan keseluruhan jujukan dalam ingatan, menjadikannya sesuai untuk bekerja dengan set data atau aliran data yang besar.
Contoh:
def large_sequence(): for i in range(1, 1000001): yield i gen = large_sequence() print(next(gen)) # Output: 1 print(next(gen)) # Output: 2
Penjelasan: Penjana ini menghasilkan urutan satu juta nombor tanpa menyimpan kesemuanya dalam ingatan, menunjukkan kecekapan ingatannya.
Iterators:
Objek boleh lelar tersuai: Apabila anda memerlukan lebih kawalan ke atas logik lelaran.
Jujukan tak terhingga: Menjana jujukan nilai yang tidak berkesudahan, seperti data daripada penderia.
Penjana:
Penilaian malas: Memproses set data yang besar satu item pada satu masa.
Saluran Paip: Membina saluran paip pemprosesan data yang mengendalikan data secara penstriman.
Definisi: Ungkapan penjana menyediakan cara ringkas untuk mencipta penjana. Ia serupa dengan pemahaman senarai tetapi gunakan kurungan dan bukannya kurungan segi empat sama.
Contoh:
gen_exp = (x * x for x in range(5)) for value in gen_exp: print(value)
Output:
0 1 4 9 16
Penjelasan: Ungkapan penjana ini mencipta penjana yang menghasilkan kuasa dua nombor dari 0 hingga 4.
Contoh 1: Membaca Fail Besar
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())
Penjelasan: Fungsi penjana ini membaca fail besar baris demi baris, menghasilkan satu baris pada satu masa. Ia adalah cekap memori kerana ia tidak memuatkan keseluruhan fail ke dalam memori.
Contoh 2: Jujukan Fibonacci
def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b fib = fibonacci() for _ in range(10): print(next(fib))
Output:
0 1 1 2 3 5 8 13 21 34
Penjelasan: Fungsi penjana ini menghasilkan jujukan nombor Fibonacci yang tidak terhingga. Ia menunjukkan cara penjana boleh digunakan untuk menjana jujukan nilai yang berkemungkinan tidak terhingga.
* 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.
Atas ialah kandungan terperinci Cara Bekerja dengan Iterator dan Penjana dalam Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!