Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapakah Saya Tidak Boleh Mengulang Ulang Berbilang Kali?

Mengapakah Saya Tidak Boleh Mengulang Ulang Berbilang Kali?

Barbara Streisand
Barbara Streisandasal
2024-12-20 16:31:10739semak imbas

Why Can't I Iterate Over an Iterator Multiple Times?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn