Saya perlu meniru loop do-while dalam program Python. Sayangnya, kode langsung berikut ini tidak berfungsi:
list_of_ints = [ 1, 2, 3 ]
iterator = list_of_ints.__iter__()
element = None
while True:
if element:
print element
try:
element = iterator.next()
except StopIteration:
break
print "done"
Alih-alih "1,2,3, selesai", ia mencetak output berikut:
[stdout:]1
[stdout:]2
[stdout:]3
None['Traceback (most recent call last):
', ' File "test_python.py", line 8, in <module>
s = i.next()
', 'StopIteration
']
Apa yang bisa saya lakukan untuk menangkap pengecualian 'hentikan iterasi' dan putuskan loop sementara dengan benar?
Contoh mengapa hal seperti itu diperlukan ditunjukkan di bawah ini sebagai pseudocode.
Mesin negara:
s = ""
while True :
if state is STATE_CODE :
if "//" in s :
tokens.add( TOKEN_COMMENT, s.split( "//" )[1] )
state = STATE_COMMENT
else :
tokens.add( TOKEN_CODE, s )
if state is STATE_COMMENT :
if "//" in s :
tokens.append( TOKEN_COMMENT, s.split( "//" )[1] )
else
state = STATE_CODE
# Re-evaluate same line
continue
try :
s = i.next()
except StopIteration :
break
python
while-loop
do-while
grigoryvp
sumber
sumber
s=i.next()
daripada Tidak ada dan mungkin melakukan beberapa pekerjaan awal daripada hanya membuat melewati pertama Anda melalui loop tidak berguna sekalipun.Jawaban:
Saya tidak yakin apa yang Anda coba lakukan. Anda dapat menerapkan loop do-while seperti ini:
Atau:
Apa yang Anda lakukan dengan mencoba lakukan loop sementara untuk mencetak barang-barang dalam daftar? Mengapa tidak menggunakan saja:
Memperbarui:
Jadi, apakah Anda memiliki daftar garis? Dan Anda ingin terus mengulanginya? Bagaimana tentang:
Apakah itu tampak seperti sesuatu yang dekat dengan apa yang Anda inginkan? Dengan contoh kode Anda, itu akan menjadi:
sumber
Inilah cara yang sangat sederhana untuk meniru loop do-while:
Fitur utama dari loop do-while adalah bahwa loop body selalu dieksekusi setidaknya sekali, dan bahwa kondisi dievaluasi di bagian bawah loop body. Struktur kontrol yang ditampilkan di sini menyelesaikan kedua hal ini tanpa memerlukan pengecualian atau pernyataan break. Itu memang memperkenalkan satu variabel Boolean ekstra.
sumber
break
. Secara khusus, jika ada logika yang diperlukan SETELAHtest_loop_condition()
, yang tidak boleh dieksekusi setelah kita selesai, itu harus dibungkusif condition:
. BTW,condition
tidak jelas. Lebih deskriptif:more
ataunotDone
.break
dalam loop dan ketika saya menemukannya dalam kode yang saya pertahankan, saya menemukan bahwa loop, paling sering, bisa ditulis tanpa itu. Solusi yang disajikan adalah, IMO, cara paling jelas untuk merepresentasikan do sambil membangun dengan python.has_no_errors
atauend_reached
(dalam hal ini pengulangan akan dimulaiwhile not end_reached
Kode saya di bawah ini mungkin merupakan implementasi yang bermanfaat, menyoroti perbedaan utama di antaranya lakukan-sementara vs. sementara seperti yang saya mengerti.
Jadi dalam hal ini, Anda selalu melalui loop setidaknya sekali.
sumber
while condition or first_pass:
. Kemudiancondition
selalu dievaluasi terlebih dahulu dan keseluruhanfirst_pass
dievaluasi hanya dua kali (iterasi pertama dan terakhir). Jangan lupa untuk menginisialisasicondition
sebelum loop ke apa pun yang Anda inginkan.Pengecualian akan mematahkan loop, jadi Anda mungkin juga menanganinya di luar loop.
Saya kira masalah dengan kode Anda adalah bahwa perilaku orang
break
dalamexcept
tidak didefinisikan. Umumnyabreak
naik hanya satu tingkat, jadi misalnyabreak
di dalamtry
langsung kefinally
(jika ada) keluar daritry
, tetapi tidak keluar dari loop.PEP Terkait: http://www.python.org/dev/peps/pep-3136
Pertanyaan terkait: Keluar dari loop bersarang
sumber
->
Anda dapat melakukan fungsi:
Tapi 1) Ini jelek. 2) Kondisi harus merupakan fungsi dengan satu parameter, seharusnya diisi oleh barang (itu satu-satunya alasan untuk tidak menggunakan loop while klasik.)
sumber
while True: stuff(); if not condition(): break
adalah ide yang sangat bagus. Terima kasih!Berikut ini adalah solusi gila dari pola yang berbeda - menggunakan coroutine. Kode masih sangat mirip, tetapi dengan satu perbedaan penting; tidak ada kondisi keluar sama sekali! Coroutine (rantai coroutine benar-benar) hanya berhenti ketika Anda berhenti memberinya data.
Kode di atas mengumpulkan semua token sebagai tupel
tokens
dan saya menganggap tidak ada perbedaan antara.append()
dan.add()
dalam kode asli.sumber
Cara saya melakukan ini adalah sebagai berikut ...
Bagi saya ini adalah solusi sederhana, saya terkejut saya belum melihatnya di sini. Ini jelas juga dapat dibalik
dll.
sumber
untuk loop do - while berisi pernyataan try
sebagai alternatif, ketika tidak perlu untuk klausa 'akhirnya'
sumber
sumber
stuff
fungsi atau untuk kode tubuh diulang.while condition:
karenais True
tersirat.condition
tergantung pada beberapa variabel dalamstuff()
, karena variabel itu tidak didefinisikan pada saat itu.Retas cepat:
Gunakan seperti ini:
sumber
Kenapa tidak lakukan saja
?
sumber
Lihat apakah ini membantu:
Atur bendera di dalam handler pengecualian dan periksa sebelum bekerja di s.
sumber
while not flagBreak:
dan menghapusif (flagBreak) : break
.flag
- Saya tidak dapat menyimpulkan apa arti nilai Benar atau nilai Salah. Sebaliknya, gunakandone
atauendOfIteration
. Kode berubah menjadiwhile not done: ...
.Jika Anda berada dalam skenario di mana Anda mengulang sementara sumber daya tidak dapat dihindari atau sesuatu yang serupa yang melempar pengecualian, Anda bisa menggunakan sesuatu seperti
sumber
Bagi saya loop sementara yang khas akan menjadi sesuatu seperti ini:
Saya bisa memasukkan for..loop dalam loop sementara juga, jika situasinya menjamin, untuk looping melalui serangkaian kondisi lain.
sumber