Mengapa python menggunakan 'else' setelah untuk dan sementara loop?

481

Saya mengerti bagaimana konstruksi ini bekerja:

for i in range(10):
    print(i)

    if i == 9:
        print("Too big - I'm giving up!")
        break;
else:
    print("Completed successfully")

Tapi saya tidak mengerti mengapa elsedigunakan sebagai kata kunci di sini, karena itu menyarankan kode yang dimaksud hanya berjalan jika forblok tidak lengkap, yang merupakan kebalikan dari apa yang dilakukannya! Tidak peduli bagaimana saya memikirkannya, otak saya tidak dapat berkembang dengan mulus dari forpernyataan ke elseblok. Bagi saya, continueatau continuewithlebih masuk akal (dan saya mencoba melatih diri saya untuk membacanya seperti itu).

Saya bertanya-tanya bagaimana coders Python membaca konstruksi ini di kepala mereka (atau dengan keras, jika Anda suka). Mungkin saya melewatkan sesuatu yang akan membuat blok kode seperti itu lebih mudah diuraikan?

Kent Boogaart
sumber
26
Anda mungkin ingin menerjemahkannya ke "lalu" di kepala Anda.
Marcin
63
Jangan lupa baris kunci dalam Zen Python: "... seperti itu mungkin tidak jelas pada awalnya kecuali Anda orang Belanda."
Daniel Roseman
51
Di kepala saya, saya menerjemahkannya menjadi "jika tidak rusak" . Dan, karena breakbanyak digunakan dalam loop "Saya telah menemukannya" , Anda dapat menerjemahkannya ke "jika tidak ditemukan" , yang tidak jauh dari yang elseberbunyi
MestreLion
29
Saya pikir pertanyaan sebenarnya yang dimiliki banyak orang di sini adalah "Apa perbedaan antara for ... else foo()dan hanya foo()mencari loop for?" Dan jawabannya adalah mereka berperilaku berbeda hanya jika loop berisi break(seperti yang dijelaskan secara rinci di bawah).
Sam Kauffman
10
Sebuah titik koma di python ... mataku sakit .. meskipun secara sintaksis benar itu bukan praktik yang baik untuk melakukannya
DarkCygnus

Jawaban:

278

Ini adalah konstruksi yang aneh bahkan untuk coders Python berpengalaman. Ketika digunakan bersama dengan untuk-loop pada dasarnya berarti "menemukan beberapa item di iterable, kalau tidak ada yang ditemukan lakukan ...". Seperti dalam:

found_obj = None
for obj in objects:
    if obj.key == search_key:
        found_obj = obj
        break
else:
    print('No object found.')

Tetapi setiap kali Anda melihat konstruk ini, alternatif yang lebih baik adalah merangkum pencarian dalam suatu fungsi:

def find_obj(search_key):
    for obj in objects:
        if obj.key == search_key:
            return obj

Atau gunakan pemahaman daftar:

matching_objs = [o for o in objects if o.key == search_key]
if matching_objs:
    print('Found {}'.format(matching_objs[0]))
else:
    print('No object found.')

Secara semantik tidak setara dengan dua versi lainnya, tetapi berfungsi cukup baik dalam kode kritis non-kinerja di mana tidak masalah apakah Anda mengulangi seluruh daftar atau tidak. Orang lain mungkin tidak setuju, tetapi saya pribadi tidak akan pernah menggunakan blok for-else atau sementara-else dalam kode produksi.

Lihat juga [Ide Python] Ringkasan untuk ... utas lainnya

Björn Lindqvist
sumber
50
Pemahaman daftar adalah one-liner yang salah. Jika Anda mencari satu item, seperti dalam forcontoh loop, dan ingin menggunakan ekspresi generator / daftar pemahaman, maka Anda ingin next((o for o in objects if o.key == search_key), None)atau membungkusnya dalam try/ exceptdan tidak menggunakan nilai default sebagai ganti if/ else.
agf
4
dan seperti jawaban Lance Helsten, ada kasus aktual di mana lebih baik menggunakan for/elsekonstruk.
andrean
5
Bersulang. Saya memiliki file dengan indentasi buruk di mana file tersebut elsedipasangkan dengan fordan saya tidak tahu itu legal.
maxywb
3
Saya pikir for for loop adalah yang paling jelas dari konstruk di sana.
Miles Rout
14
Perlu disebutkan bahwa klausa lain akan berjalan bahkan jika loop for memiliki nilai kecuali breakpernyataan dijalankan dengan eksplisit seperti dalam contoh ini. Dari dokumen di atas: " elseKlausa memiliki masalah lain yang dirasakan: jika tidak ada breakdalam loop, elseklausa secara fungsional berlebihan." misfor x in [1, 2, 3]:\n print x\n else:\n print 'this executes due to no break'
dhackner
587

Konstruk yang umum adalah menjalankan loop sampai sesuatu ditemukan dan kemudian keluar dari loop. Masalahnya adalah bahwa jika saya keluar dari loop atau loop berakhir saya harus menentukan kasus mana yang terjadi. Salah satu metode adalah membuat flag atau variabel toko yang akan membiarkan saya melakukan tes kedua untuk melihat bagaimana loop keluar.

Sebagai contoh, asumsikan bahwa saya perlu mencari melalui daftar dan memproses setiap item sampai item bendera ditemukan dan kemudian berhenti memproses. Jika item bendera hilang maka pengecualian perlu dinaikkan.

Menggunakan Python for... elsekonstruk yang Anda miliki

for i in mylist:
    if i == theflag:
        break
    process(i)
else:
    raise ValueError("List argument missing terminal flag.")

Bandingkan ini dengan metode yang tidak menggunakan gula sintaksis ini:

flagfound = False
for i in mylist:
    if i == theflag:
        flagfound = True
        break
    process(i)

if not flagfound:
    raise ValueError("List argument missing terminal flag.")

Dalam kasus pertama raiseterikat erat dengan for loop yang bekerja dengannya. Yang kedua mengikat tidak sekuat dan kesalahan dapat terjadi selama pemeliharaan.

Lance Helsten
sumber
69
Ini menjelaskannya lebih baik daripada jawaban yang dipilih di mana penulis tidak benar-benar mendapatkan untuk apa lagi tentang!
erikbwork
17
Saya harus mengatakan gula sintaksis ini dapat merusak gigi proyek Anda. Ini tidak akan membuat Python: the good partsbuku.
boatcoder
1
Bisakah Anda mengkonfirmasi bahwa dalam contoh Anda, process(i)terjadi untuk setiap item di mylistketat sebelumnya theflag, dan tidak untuk theflagdirinya sendiri? Apakah itu yang dimaksudkan?
bli
4
processakan mengeksekusi pada setiap iyang ada dalam daftar sebelum theflagtercapai, itu tidak akan dieksekusi pada elemen dalam daftar setelah theflag, dan itu tidak akan dieksekusi pada theflag.
Lance Helsten
1
pernyataan lain juga dieksekusi jika iterable tidak memiliki elemen
Lost Crotchet
173

Ada presentasi yang sangat baik oleh Raymond Hettinger, berjudul Transforming Code into Beautiful, Idiomatic Python , di mana ia secara singkat membahas sejarah for ... elsekonstruk. Bagian yang relevan adalah "Membedakan beberapa titik keluar dalam loop" mulai pukul 15:50 dan berlanjut selama sekitar tiga menit. Inilah poin-poin utamanya:

  • The for ... elsekonstruk ditemukan oleh Donald Knuth sebagai pengganti tertentu GOTOkasus penggunaan;
  • Menggunakan kembali elsekata kunci masuk akal karena "itulah yang digunakan Knuth, dan orang-orang tahu, pada saat itu, semua [ forpernyataan] telah menyematkan ifdan di GOTObawahnya, dan mereka mengharapkannya else;"
  • Kalau dipikir-pikir, itu seharusnya disebut "no break" (atau mungkin "nobreak"), dan kemudian itu tidak akan membingungkan. *

Jadi, jika pertanyaannya adalah, "Mengapa mereka tidak mengubah kata kunci ini?" maka Cat Plus Plus mungkin memberikan jawaban yang paling akurat - pada titik ini, akan terlalu merusak kode yang ada untuk menjadi praktis. Tetapi jika pertanyaan yang benar-benar Anda tanyakan adalah mengapa elsedigunakan kembali, pertama, sepertinya itu ide yang bagus pada saat itu.

Secara pribadi, saya suka kompromi komentar # no breakin-line di mana pun elsebisa keliru, sekilas, sebagai milik di dalam lingkaran. Cukup jelas dan ringkas. Opsi ini mendapat penyebutan singkat dalam ringkasan yang dihubungkan Bjorn di akhir jawabannya:

Untuk kelengkapan, saya harus menyebutkan bahwa dengan sedikit perubahan dalam sintaks, programmer yang menginginkan sintaks ini dapat memilikinya sekarang:

for item in sequence:
    process(item)
else:  # no break
    suite

* Kutipan bonus dari bagian video itu: "Sama seperti jika kita memanggil fungsi lambda , tidak ada yang akan bertanya, 'Apa yang lambda lakukan?'"

Udara
sumber
33

Karena mereka tidak ingin memperkenalkan kata kunci baru ke bahasa. Masing-masing mencuri pengidentifikasi dan menyebabkan masalah kompatibilitas ke belakang, jadi biasanya merupakan upaya terakhir.

Cat Plus Plus
sumber
2
Sepertinya finallyakan menjadi pilihan yang lebih baik dalam kasus itu. Apakah kata kunci akhirnya belum ada pada saat konstruksi ini diperkenalkan?
Ponkadoodle
26
@Wallacoloo finallytidak jauh lebih baik, karena itu menyiratkan blok akan selalu dieksekusi setelah loop, dan itu tidak (karena itu akan berlebihan dengan hanya meletakkan kode untuk dijalankan setelah loop).
Cat Plus Plus
Itu juga tidak bisa finallykarena klausa lain dieksekusi juga ketika continuedigunakan dalam for loop - yang mungkin berkali-kali dan tidak hanya di akhir.
pepr
6
Eksekusi @pepr elseklausa tidak terpengaruh oleh continue( dokumen dan kode pengujian )
Air
@AirThomas: +1. Kamu benar. Ini elsedieksekusi hanya ketika continueitu adalah satu untuk iterasi terakhir.
pepr
33

Untuk membuatnya sederhana, Anda bisa memikirkannya seperti itu;

  • Jika bertemu dengan breakperintah dalam forloop, elsebagian itu tidak akan dipanggil.
  • Jika tidak menemukan breakperintah dalam forloop, elsebagian itu akan dipanggil.

Dengan kata lain, jika untuk iterasi loop tidak "rusak" dengan break, elsebagian itu akan dipanggil.

Ad Infinitum
sumber
The elseblok juga tidak akan dijalankan jika tubuh loop menimbulkan pengecualian.
Amal K
17

Cara termudah yang saya temukan untuk 'mendapatkan' apa yang dilakukan oleh orang lain, dan yang lebih penting, kapan menggunakannya, adalah berkonsentrasi pada di mana pernyataan break melompat ke. Konstruksi For / else adalah blok tunggal. Istirahat melompat keluar dari blok, dan melompat 'di atas' klausa lain. Jika isi klausa lain hanya mengikuti klausa untuk, itu tidak akan pernah dilompati, dan logika yang setara harus disediakan dengan meletakkannya di if. Ini telah dikatakan sebelumnya, tetapi tidak cukup dengan kata-kata ini, sehingga dapat membantu orang lain. Coba jalankan fragmen kode berikut. Saya sepenuh hati mendukung komentar 'tanpa istirahat' untuk kejelasan.

for a in range(3):
    print(a)
    if a==4: # change value to force break or not
        break
else: #no break  +10 for whoever thought of this decoration
    print('for completed OK')

print('statement after for loop')
Neil_UK
sumber
"Istirahat melompat keluar dari blok, dan begitu melompat 'di atas' klausa yang lain" - sementara ini mungkin membantu sebagai cara "mendapatkan" for:/ else:, itu tidak benar-benar memberikan pembenaran untuk kata kunci yang sedang else. Mengingat framing yang diberikan di sini, then:sepertinya itu akan jauh lebih alami. (Ada yang alasan untuk elseterpilih, diberikan dalam jawaban lainnya - mereka hanya tidak disediakan di sini.)
Mark Amery
16

Saya pikir dokumentasi memiliki penjelasan yang bagus tentang yang lain , lanjutkan

[...] itu dieksekusi ketika loop berakhir melalui kelelahan daftar (dengan untuk) atau ketika kondisi menjadi salah (dengan sementara), tetapi tidak ketika loop diakhiri oleh pernyataan istirahat. "

Sumber: Python 2 docs: Tutorial tentang aliran kontrol

Ayan
sumber
13

Saya membacanya seperti:

Jika masih pada kondisi untuk menjalankan loop, melakukan hal-hal, yang lain melakukan sesuatu yang lain.

pcalcao
sumber
Anda masih pada kondisi sangat membantu (+1) meskipun itu salah - itu manusia ;-)
Wolf
-1; pelafalan dari for:/ else:membuatnya terdengar seperti else:akan selalu berjalan setelah loop, yang tidak terjadi.
Mark Amery
11

Karena bagian teknis sudah cukup banyak dijawab, komentar saya hanya terkait dengan kebingungan yang menghasilkan kata kunci daur ulang ini .

Menjadi Python bahasa pemrograman yang sangat fasih , penyalahgunaan kata kunci lebih terkenal. Kata elsekunci tersebut dengan sempurna menggambarkan bagian dari aliran pohon keputusan, "jika Anda tidak dapat melakukan ini, (lain) lakukan itu". Itu tersirat dalam bahasa kita sendiri.

Sebaliknya, menggunakan kata kunci dengan whiledan forpernyataan ini menciptakan kebingungan. Alasannya, karier kita sebagai programmer telah mengajarkan kita bahwa elsepernyataan itu berada di dalam pohon keputusan; yang lingkup logis , pembungkus yang kondisional kembali jalan untuk diikuti. Sementara itu, pernyataan loop memiliki tujuan eksplisit figuratif untuk mencapai sesuatu. Sasaran ini dipenuhi setelah pengulangan proses yang berkelanjutan.

if / else menunjukkan jalan yang harus diikuti . Loop mengikuti jalur sampai "tujuan" selesai .

Masalahnya adalah itu elseadalah kata yang dengan jelas menentukan opsi terakhir dalam suatu kondisi. The semantik kata keduanya bersama oleh Python dan Bahasa Manusia. Tetapi kata lain dalam Bahasa Manusia tidak pernah digunakan untuk menunjukkan tindakan seseorang atau sesuatu akan dilakukan setelah sesuatu selesai. Ini akan digunakan jika, dalam proses menyelesaikannya, masalah muncul (lebih seperti pernyataan break ).

Pada akhirnya, kata kunci akan tetap dalam Python. Sudah jelas itu adalah kesalahan, semakin jelas ketika setiap programmer mencoba untuk membuat cerita untuk memahami penggunaannya seperti beberapa perangkat mnemonik. Saya akan senang jika mereka memilih kata kunci then. Saya percaya bahwa kata kunci ini sangat cocok dengan aliran berulang itu, hasil setelah loop.

Itu menyerupai situasi yang dimiliki beberapa anak setelah mengikuti setiap langkah dalam merakit mainan: Dan LALU apa Ayah?

3rdWorldCitizen
sumber
Saya pikir jawaban ini membahas masalah kebingungan yang saya pikir OP bicarakan. Kata kunci lain melakukan kebalikan dari apa yang Anda harapkan dari arti bahasa Inggris yang lain ketika dikaitkan dengan tindakan untuk. Secara teori, for ... else bisa bekerja secara berbeda karena Anda berakhir di bagian lain ketika loop terputus, Tapi masalahnya adalah menggunakannya untuk menemukan elemen x, dan menangani kasus di mana x adalah tidak ditemukan, Anda mungkin harus menggunakan bendera atau tes lain setelah keseluruhan untuk .. else
build
7

Saya membacanya seperti "Ketika iterablehabis sepenuhnya, dan eksekusi akan melanjutkan ke pernyataan berikutnya setelah menyelesaikan for, klausa lain akan dieksekusi." Jadi, ketika iterasi dilanggar oleh break, ini tidak akan dieksekusi.

0xc0de
sumber
6

Saya setuju, ini lebih seperti 'elif not [kondisi (s) menaikkan istirahat]'.

Saya tahu ini adalah utas lama, tetapi saya sedang melihat pertanyaan yang sama sekarang, dan saya tidak yakin ada yang menangkap jawaban atas pertanyaan ini dengan cara yang saya pahami.

Bagi saya, ada tiga cara "membaca" elsedalam For... elseatau While... elsepernyataan, yang semuanya setara, adalah:

  1. else == if the loop completes normally (without a break or error)
  2. else == if the loop does not encounter a break
  3. else == else not (condition raising break) (mungkin ada kondisi seperti itu, atau Anda tidak akan memiliki loop)

Jadi, pada dasarnya, "lain" dalam satu lingkaran benar-benar merupakan "elif ..." di mana '...' adalah (1) tidak ada istirahat, yang setara dengan (2) BUKAN [kondisi (s) kenaikan istirahat).

Saya pikir kuncinya adalah bahwa elsetidak ada gunanya tanpa 'istirahat', jadi for...elsetermasuk:

for:
    do stuff
    conditional break # implied by else
else not break:
    do more stuff

Jadi, elemen-elemen penting dari sebuah for...elseloop adalah sebagai berikut, dan Anda akan membacanya dalam bahasa Inggris yang lebih jelas sebagai:

for:
    do stuff
    condition:
        break
else: # read as "else not break" or "else not condition"
    do more stuff

Seperti yang dikatakan poster lainnya, jeda umumnya dinaikkan ketika Anda dapat menemukan apa yang dicari lingkaran Anda, sehingga jeda else:menjadi "apa yang harus dilakukan jika item target tidak ditemukan".

Contoh

Anda juga dapat menggunakan penanganan eksepsi, istirahat, dan untuk loop secara bersamaan.

for x in range(0,3):
    print("x: {}".format(x))
    if x == 2:
        try:
            raise AssertionError("ASSERTION ERROR: x is {}".format(x))
        except:
            print(AssertionError("ASSERTION ERROR: x is {}".format(x)))
            break
else:
    print("X loop complete without error")

Hasil

x: 0
x: 1
x: 2
ASSERTION ERROR: x is 2
----------
# loop not completed (hit break), so else didn't run

Contoh

Contoh sederhana dengan istirahat dipukul.

for y in range(0,3):
    print("y: {}".format(y))
    if y == 2: # will be executed
        print("BREAK: y is {}\n----------".format(y))
        break
else: # not executed because break is hit
    print("y_loop completed without break----------\n")

Hasil

y: 0
y: 1
y: 2
BREAK: y is 2
----------
# loop not completed (hit break), so else didn't run

Contoh

Contoh sederhana di mana tidak ada istirahat, tidak ada kondisi meningkatkan istirahat, dan tidak ada kesalahan yang ditemui.

for z in range(0,3):
     print("z: {}".format(z))
     if z == 4: # will not be executed
         print("BREAK: z is {}\n".format(y))
         break
     if z == 4: # will not be executed
         raise AssertionError("ASSERTION ERROR: x is {}".format(x))
else:
     print("z_loop complete without break or error\n----------\n")

Hasil

z: 0
z: 1
z: 2
z_loop complete without break or error
----------
NotAnAmbiTurner
sumber
6

Kata elsekunci dapat membingungkan di sini, dan seperti yang ditunjukkan banyak orang, sesuatu seperti nobreak, notbreaklebih tepat.

Untuk memahami for ... else ...secara logis, bandingkan dengan try...except...else, tidak if...else..., sebagian besar pemrogram python terbiasa dengan kode berikut:

try:
    do_something()
except:
    print("Error happened.") # The try block threw an exception
else:
    print("Everything is find.") # The try block does things just find.

Demikian pula, anggap breaksebagai jenis khusus Exception:

for x in iterable:
    do_something(x)
except break:
    pass # Implied by Python's loop semantics
else:
    print('no break encountered')  # No break statement was encountered

Perbedaannya pythonmenyiratkan except breakdan Anda tidak dapat menuliskannya, sehingga menjadi:

for x in iterable:
    do_something(x)
else:
    print('no break encountered')  # No break statement was encountered

Ya, saya tahu perbandingan ini bisa sulit dan melelahkan, tetapi ini memperjelas kebingungan.

cizixs
sumber
Anda harus membuat tautan ke sumber daya saat Anda menyalinnya: Catatan Python Nick Coghlan .
godaygo
@godaygo terima kasih atas tautannya. Saya membaca dan menerima konsep ketika pertama kali belajar python, tidak menghafal sumbernya ketika menulis jawabannya.
cizixs
@cizixs Anda "tidak menghafal sumbernya" tetapi kebetulan memasukkan seluruh kalimat komentar yang identik dengan aslinya? Ooookaaaay.
Mark Amery
5

Kode dalam elseblok pernyataan akan dieksekusi ketika forloop tidak terputus.

for x in xrange(1,5):
    if x == 5:
        print 'find 5'
        break
else:
    print 'can not find 5!'
#can not find 5!

Dari dokumen: hancurkan dan lanjutkan Pernyataan, dan klausa lain tentang Loops

Pernyataan loop mungkin memiliki klausa lain; itu dieksekusi ketika loop berakhir melalui kelelahan daftar (dengan untuk) atau ketika kondisi menjadi salah (dengan sementara), tetapi tidak ketika loop diakhiri oleh pernyataan istirahat. Ini dicontohkan oleh loop berikut, yang mencari bilangan prima:

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

(Ya, ini adalah kode yang benar. Perhatikan baik-baik: klausa lain milik loop for, bukan pernyataan if.)

Ketika digunakan dengan loop, klausa lain memiliki lebih banyak kesamaan dengan klausa lain dari pernyataan try daripada pernyataan if: pernyataan klausa try statement berjalan ketika tidak ada pengecualian, dan klausa loop lain berjalan ketika tidak ada break terjadi . Untuk lebih lanjut tentang pernyataan dan pengecualian coba, lihat Menangani Pengecualian.

Pernyataan lanjutan, juga dipinjam dari C, berlanjut dengan iterasi loop berikutnya:

>>> for num in range(2, 10):
...     if num % 2 == 0:
...         print("Found an even number", num)
...         continue
...     print("Found a number", num)
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9
GoingMyWay
sumber
1
Ini tidak menambahkan apa-apa dan tidak menjawab pertanyaan, yang bukan bagaimana tetapi mengapa .
Air
5

Inilah cara untuk memikirkannya yang belum pernah saya lihat orang lain sebutkan di atas:

Pertama, ingat bahwa for-loop pada dasarnya hanya gula sintaksis di sekitar while-loop. Misalnya, loop

for item in sequence:
    do_something(item)

dapat ditulis ulang (kira-kira) sebagai

item = None
while sequence.hasnext():
    item = sequence.next()
    do_something(item)

Kedua, ingat bahwa while-loop pada dasarnya hanya diulangi jika-blok! Anda selalu dapat membaca while-loop sebagai "jika kondisi ini benar, jalankan tubuh, lalu kembali dan periksa lagi".

Jadi sementara / else masuk akal: Ini adalah struktur yang sama persis seperti jika / selain itu, dengan fungsi perulangan yang ditambahkan hingga kondisi menjadi salah, bukan hanya memeriksa kondisi satu kali.

Dan kemudian untuk / selain itu masuk akal juga: karena semua untuk-loop hanya gula sintaksis di atas sementara-loop, Anda hanya perlu mencari tahu apa kondisional implisit while-loop yang mendasarinya, dan kemudian sesuai dengan kapan kondisi menjadi False.

Aaron Gable
sumber
4

Jawaban yang bagus adalah:

  • ini yang menjelaskan sejarah, dan
  • ini memberikan kutipan yang tepat untuk memudahkan terjemahan / pemahaman Anda.

Catatan saya di sini berasal dari apa yang pernah dikatakan Donald Knuth (maaf tidak dapat menemukan referensi) bahwa ada konstruk di mana sementara-yang lain tidak dapat dibedakan dari if-else, yaitu (dengan Python):

x = 2
while x > 3:
    print("foo")
    break
else:
    print("boo")

memiliki aliran yang sama (tidak termasuk perbedaan level rendah) seperti:

x = 2
if x > 3:
    print("foo")
else:
    print("boo")

Intinya adalah jika-selain itu dapat dianggap sebagai gula sintaksis untuk sementara-lain yang telah tersirat breakpada akhir ifbloknya. Implikasi sebaliknya, whileloop itu adalah ekstensi if, lebih umum (itu hanya pemeriksaan bersyarat berulang / berulang), karena ifsering diajarkan sebelumnya while. Namun itu tidak benar karena itu berarti elsememblokir sementara-lain akan dieksekusi setiap kali ketika kondisinya salah.

Untuk memudahkan pemahaman Anda, pikirkan seperti itu:

Tanpa break,, returndll., Loop berakhir hanya ketika kondisi tidak lagi benar dan dalam kasus seperti itu elseblok juga akan dieksekusi sekali. Dalam kasus Python forAnda harus mempertimbangkan forloop gaya-C (dengan ketentuan) atau menerjemahkannya while.

Catatan lain:

Premature break,, returndll. Di dalam loop membuat kondisi tidak mungkin menjadi salah karena eksekusi melompat keluar dari loop sementara kondisinya benar dan tidak akan pernah kembali untuk memeriksanya lagi.

WloHu
sumber
3

Anda bisa memikirkannya seperti, elseseperti pada sisa barang, atau hal lainnya, yang tidak dilakukan dalam lingkaran.

jamylak
sumber
3
for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
else:
    print("Completed successfully")

"lain" di sini sangat sederhana, kejam

1, "jika for clausesudah selesai"

for i in range(3):
    print(i)

    if i == 2:
        print("Too big - I'm giving up!")
        break;
if "for clause is completed":
    print("Completed successfully")

Adalah penting untuk menulis pernyataan panjang seperti "untuk klausa selesai", jadi mereka memperkenalkan "lain".

else di sini adalah jika dalam sifatnya.

2, Namun, Bagaimana for clause is not run at all

In [331]: for i in range(0):
     ...:     print(i)
     ...: 
     ...:     if i == 9:
     ...:         print("Too big - I'm giving up!")
     ...:         break
     ...: else:
     ...:     print("Completed successfully")
     ...:     
Completed successfully

Jadi pernyataan itu sepenuhnya adalah kombinasi logika:

if "for clause is completed" or "not run at all":
     do else stuff

atau begini:

if "for clause is not partially run":
    do else stuff

atau dengan cara ini:

if "for clause not encounter a break":
    do else stuff
Kalkulus
sumber
lain bertindak sebagai "transaksi" dalam SQL.
Kalkulus
2

Berikut ini adalah kasus penggunaan khusus selain mencari. Katakanlah Anda ingin menunggu suatu kondisi menjadi benar, misalnya port terbuka pada server jauh, bersama dengan beberapa timeout. Maka Anda bisa memanfaatkan while...elsekonstruk seperti:

import socket
import time

sock = socket.socket()
timeout = time.time() + 15
while time.time() < timeout:
    if sock.connect_ex(('127.0.0.1', 80)) is 0:
        print('Port is open now!')
        break
    print('Still waiting...')
else:
    raise TimeoutError()
Jonathan Sudiaman
sumber
1

Saya sendiri hanya mencoba untuk memahaminya. Saya menemukan bahwa berikut ini membantu!

• Pikirkan elsesebagai berpasangan dengan bagian ifdalam loop (bukan dengan for) - jika kondisi terpenuhi kemudian hentikan loop, kalau tidak lakukan ini - kecuali itu elsedipasangkan dengan beberapa ifs!
• Jika tidak ada ifyang puas sama sekali, maka lakukan else.
• Beberapa ifs juga dapat dianggap sebagai if- elifs!

Germaine Goh
sumber
-2

Saya menganggap struktur untuk (jika) A lain B, dan untuk (jika) -selain khusus jika-lain , kira-kira . Mungkin membantu untuk memahami hal lain .

A dan B dieksekusi paling banyak sekali, yang sama dengan struktur if-else.

untuk (jika) dapat dianggap sebagai khusus jika, yang melakukan loop untuk mencoba memenuhi kondisi if. Setelah kondisi if terpenuhi, A dan break ; Lain , B.

Jie Zhang
sumber
-2

Python menggunakan yang lain setelah dan untuk loop sehingga jika tidak ada yang berlaku untuk loop, sesuatu yang lain terjadi. Sebagai contoh:

test = 3
while test == 4:
     print("Hello")
else:
     print("Hi")

Outputnya akan menjadi 'Hai' berulang-ulang (jika saya benar).

Mrmongoose64
sumber