Saya ingin tahu apakah ada cara built-in untuk melanjutkan iterasi berikutnya di loop luar dengan python. Misalnya, perhatikan kodenya:
for ii in range(200):
for jj in range(200, 400):
...block0...
if something:
continue
...block1...
Saya ingin ini melanjutkan pernyataan untuk keluar dari jj loop dan kebagian item berikutnya dalam ii loop. Saya dapat mengimplementasikan logika ini dengan cara lain (dengan menetapkan variabel flag), tetapi apakah ada cara mudah untuk melakukan ini, atau apakah ini seperti meminta terlalu banyak?
Jawaban:
Dalam kasus umum, ketika Anda memiliki beberapa tingkat perulangan dan
break
tidak bekerja untuk Anda (karena Anda ingin melanjutkan salah satu loop atas, bukan yang tepat di atas yang sekarang), Anda dapat melakukan salah satu dari yang berikut iniPerbaiki kembali loop yang ingin Anda hindari dari fungsi
Kerugiannya adalah bahwa Anda mungkin perlu beralih ke fungsi baru itu beberapa variabel, yang sebelumnya dalam cakupan. Anda bisa meneruskannya sebagai parameter, menjadikannya variabel instan pada objek (buat objek baru hanya untuk fungsi ini, jika masuk akal), atau variabel global, lajang, apa pun (ehm, ehm).
Atau Anda dapat mendefinisikan
inner
sebagai fungsi bersarang dan membiarkannya menangkap apa yang dibutuhkannya (mungkin lebih lambat?)Gunakan pengecualian
Secara filosofis, inilah pengecualian untuk, memutus aliran program melalui blok bangunan pemrograman terstruktur (jika, untuk, sementara) bila perlu.
Keuntungannya adalah Anda tidak perlu memecah satu bagian kode menjadi beberapa bagian. Ini bagus jika ini semacam perhitungan yang Anda rancang saat menulisnya dengan Python. Memperkenalkan abstraksi pada titik awal ini dapat memperlambat Anda.
Hal buruk dengan pendekatan ini adalah bahwa penulis interpreter / kompiler biasanya berasumsi bahwa pengecualian adalah pengecualian dan mengoptimalkannya.
Buat kelas pengecualian khusus untuk ini, sehingga Anda tidak mengambil risiko secara tidak sengaja membungkam beberapa pengecualian lain.
Sesuatu yang sama sekali berbeda
Saya yakin masih ada solusi lain.
sumber
Break
akan merusak loop dalam, dan block1 tidak akan dieksekusi (itu hanya akan berjalan jika loop dalam keluar secara normal)sumber
for...else
seringkali merupakan konstruk yang bermanfaat, meskipun bisa membingungkan. Ingat saja ituelse
berarti "tidak ada istirahat" dalam konteks ini.Dalam bahasa lain Anda bisa memberi label loop dan keluar dari loop berlabel. Python Enhancement Proposal (PEP) 3136 menyarankan untuk menambahkan ini ke Python tetapi Guido menolaknya :
Jadi jika itu yang Anda harapkan, Anda kurang beruntung, tetapi perhatikan salah satu jawaban lain karena ada pilihan bagus di sana.
sumber
for-else
lebih rumit, lebih sulit dibaca, dan mungkin lebih banyak disalahgunakan (jika bukan kesalahan langsung) daripada loop bernama. Saya pikir saya akan menggunakan kata kunci yang berbeda darielse
- mungkin sesuatu sepertiresume
itu baik? Andabreak
dalam lingkaran danresume
tepat setelah itu?Saya pikir Anda bisa melakukan sesuatu seperti ini:
sumber
for
,else
sebelum (dan saya pikir bahkan sebagian besar orang yang memiliki tidak ingat dari atas kepala mereka cara kerjanya).Saya pikir salah satu cara termudah untuk mencapai ini adalah mengganti pernyataan "lanjutkan" dengan "istirahat", yaitu
Sebagai contoh, ini adalah kode mudah untuk melihat bagaimana tepatnyanya:
sumber
Cara lain untuk menangani masalah seperti ini adalah dengan menggunakan Exception ().
Sebagai contoh:
hasil:
Dengan asumsi kita ingin melompat ke loop n luar dari m loop jika m = 3:
hasil:
Tautan referensi: http://www.programming-idioms.org/idiom/42/continue-outer-loop/1264/python
sumber
Kami ingin menemukan sesuatu dan kemudian menghentikan iterasi batin. Saya menggunakan sistem bendera.
sumber
False:continue
masalahnya adalah ... format yang tidak biasa. Seperti yang sering terjadi dalam sistem "alami" di mana eksponensial adalah norma, Anda hanya perlu beruntung beberapa kali di SO untuk mengumpulkan sejumlah besar poin reputasi. Bagaimanapun, jawaban "terbaik" saya biasanya yang paling tidak populer.Saya hanya melakukan sesuatu seperti ini. Solusi saya untuk ini adalah mengganti interior untuk loop dengan pemahaman daftar.
di mana op adalah beberapa operator boolean yang bekerja pada kombinasi ii dan jj. Dalam kasus saya, jika salah satu operasi kembali benar, saya selesai.
Ini benar-benar tidak jauh berbeda dari memecah kode menjadi fungsi, tetapi saya berpikir bahwa menggunakan operator "apa pun" untuk melakukan logika ATAU pada daftar boolean dan melakukan logika semua dalam satu baris itu menarik. Ini juga menghindari pemanggilan fungsi.
sumber