Mengapa Iterator Tidak Boleh Diulang Berbilang Kali? Penerokaan dan Penyelesaian Komprehensif
Pertimbangkan kod berikut:
def test(data): for row in data: print("first loop") for row in data: print("second loop")
Apabila data ialah lelaran, seperti lelaran senarai atau ungkapan penjana, mengulanginya dua kali menghasilkan hasil yang tidak dijangka :
>>> test(iter([1, 2])) first loop first loop >>> test((_ for _ in [1, 2])) first loop first loop
Contoh ini mencetak "gelung pertama" beberapa kali, tetapi "gelung kedua" tidak pernah dicetak. Tingkah laku ini menimbulkan persoalan: mengapa lelaran berfungsi pada kali pertama tetapi bukan kali kedua? Dan bagaimanakah kita boleh menangani had ini?
Memahami Iterator dan Penggunaan
Lelaran ialah objek yang menghasilkan satu nilai pada satu masa. Selepas lelaran, iterator digunakan, bermakna apabila dilalui, mereka tidak boleh diulang lagi. Perkara yang sama berlaku untuk penjana, objek fail dan banyak objek boleh lelar lain.
Tingkah laku penggunaan ini ditunjukkan dalam coretan kod berikut:
data = [1, 2, 3] it = iter(data) next(it) # => 1 next(it) # => 2 next(it) # => 3 next(it) # => StopIteration
Apabila lelaran digunakan, ia menimbulkan pengecualian StopIteration apabila tiada lagi elemen untuk dihasilkan. Dalam konteks gelung for, pengecualian ini menyebabkan gelung ditamatkan buat kali pertama.
Penyelesaian dan Pendekatan Alternatif
Jika anda perlu mengulangi data yang sama beberapa kali, beberapa penyelesaian tersedia:
1. Cipta Senarai:
Anda boleh menyimpan unsur-unsur iterator dalam senarai, yang kemudiannya boleh diulang sebanyak yang diingini:
data = list(it)
2 . Gunakan tee() untuk Independent Iterator:
Jika iterator anda memproses sejumlah besar elemen, mencipta senarai boleh menjadi tidak cekap. Fungsi itertools.tee() membolehkan anda mencipta berbilang iterator bebas daripada satu sumber:
import itertools it1, it2 = itertools.tee(data, 2) # create as many as needed
Setiap iterator ini boleh dilalui secara berasingan tanpa menjejaskan yang lain.
3. Tukar kepada Jujukan:
Sesetengah iterator, seperti set, boleh ditukar kepada jujukan menggunakan fungsi seperti list() atau tuple(). Penukaran ini mencipta objek baharu yang boleh diulang beberapa kali:
data = list(sorted(my_set))
Dengan memahami gelagat penggunaan iterator dan melaksanakan penyelesaian yang sesuai, anda boleh memperoleh manfaat objek boleh lelar sambil memastikan anda mempunyai data yang anda memerlukan berbilang lelaran.
Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Mengulang Ulang Berbilang Kali?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!