İfade ederken Python'da başka bir madde


321

Aşağıdaki kod Python yasal olduğunu fark ettim. Sorum neden? Belirli bir nedeni var mı?

n = 5
while n != 0:
    print n
    n -= 1
else:
    print "what the..."

5
@detly: Çünkü çoğu insan bu yapıdan kaçınır. :) Guido'nun Py3k sürecinde en azından elsebu kullanım için kelime seçiminin oldukça kötü bir fikir olduğunu ve bunların daha fazlasını yapmayacaklarını söylediğine inanıyorum.
Nicholas Knight

5
@Nicholas Knight - evet, olsa da cazip, muhtemelen ilk bakışta anladığım bir şey olurdu. Başka bir fakir sap gitmek ve dil spec bakmak veya zaman içinde geri dönün ve burada
Staheeeeeey

8
'Else' seçiminin ardındaki fikir, bu yapının genellikle while döngüsü içinde bir 'if X: break' ile birlikte kullanıldığı düşünülmektedir. Döngüden çıkmazsak 'else' deyimi yürütüldüğünden, 'if' için bir tür sorta 'else' oluşturur.
Jonathan Hartley

12
Yeniden adlandırmalılar after:.
Naught101

Yanıtlar:


388

Yan elsetümce yalnızca whiledurumunuz yanlış olduğunda yürütülür . Eğer varsa breakbir özel duruma neden olmadığını döngünün ya, bu yürütülmez.

Bunu düşünmenin bir yolu, koşulla ilgili bir if / else yapısı olarak:

if condition:
    handle_true()
else:
    handle_false()

döngü yapısına benzer:

while condition:
    handle_true()
else:
    # condition is false now, handle and go on with the rest of the program
    handle_false()

Örnek olarak şunlar verilebilir:

while value < threshold:
    if not process_acceptable_value(value):
        # something went wrong, exit the loop; don't pass go, don't collect 200
        break
    value = update(value)
else:
    # value >= threshold; pass go, collect 200
    handle_threshold_reached()

42
"Else yan tümcesi yalnızca while durumunuz yanlış olduğunda yürütülür." Buradaki ifade, while durumunuzun true durumundan false durumuna geçtiğini ve diğerinin yürütüleceğine işaret eder. Ancak eğer süre asla doğru olmazsa, diğer fıkra yine de uygulanır.
user597608

pseudocode yanılıyorsam Yani düzeltin ama bu tam olarak aynı olduğunu while {} something haricinde olduğunu somethingeğer atlanır breakiçinde whiledöngü.
Daniel Kaplan

2
Belki de en kesin sahte kod şöyle olur: while (True) {if (cond) {handle_true (); } başka {handle_false (); break; }}
VinGarcia

2
"geçme, 200 toplama" haha, bunun nereden geldiğini bilen herkesin iyi bir çocukluğu vardı
Stefan Octavian

102

elseEğer bir try bloğu alt döngü koşulunu isabet veya düşme ile, normal olarak bir blok çıkarsanız bloğu icra edilir. O edilir değil sizi eğer idam breakveya returnbir bloğun dışında veya bir istisna. Sadece süre ve döngüler için değil, aynı zamanda blokları da dener.

Genellikle normalde bir döngüden erken çıkacağınız yerlerde bulursunuz ve döngünün ucundan kaçmak beklenmedik / olağandışı bir durumdur. Örneğin, bir değer arayan bir listede dolaşıyorsanız:

for value in values:
    if value == 5:
        print "Found it!"
        break
else:
    print "Nowhere to be found. :-("

1
Aslında böyle bir şey için oldukça yararlı bir yapı. found_it=FalseBir döngünün başına kaç kez koyduğumu bilmiyorum ve sonra found_itsonunda bir if kontrolü yapın
Cruncher

42

Yanıt olarak Is there a specific reason?, burada ilginç bir uygulama var: çoklu döngü seviyelerinin kırılması.

İşte böyle çalışır: dış döngü sonunda bir mola var, bu yüzden sadece bir kez yürütülür. Ancak, iç döngü tamamlanırsa (bölen bulunmazsa), başka ifadeye ulaşır ve dış kopmaya asla ulaşılmaz. Bu şekilde, iç döngüdeki bir kopukluk, bir döngüden ziyade her iki döngüden de kopar.

for k in [2, 3, 5, 7, 11, 13, 17, 25]:
    for m in range(2, 10):
        if k == m:
            continue
        print 'trying %s %% %s' % (k, m)
        if k % m == 0:
            print 'found a divisor: %d %% %d; breaking out of loop' % (k, m)
            break
    else:
        continue
    print 'breaking another level of loop'
    break
else:
    print 'no divisor could be found!'

Her ikisi için whileve fordöngüler, elsesürece açıklamada, sonunda yürütülür breakkullanıldı.

Çoğu durumda bunu yapmanın daha iyi yolları vardır (bir işleve sarmak veya bir istisna oluşturmak), ancak bu işe yarar!


1
Ben aldatmadım ama sanırım neden biri yaptı biliyorum. Soruyu cevaplamıyorsunuz ve sadece 2 satır açıklama içeren 14 kod satırı sağlıyorsunuz. Bize söylemediğiniz sorulan soru ile ilgisi varsa ...
BlueEel

1
@BlueEel geribildirim için teşekkürler! Kod hakkında daha fazla açıklama ekledim ve bunun soruyu nasıl cevapladığını daha açık hale getirdim (çünkü bir kısmı cevaplıyor).
Mark

Kodunuzu bağlam haline getirmeyi başardınız ve tüm soruları yanıtlamasanız da şu an alaka düzeyini görüyorum. Cevabınızı yeni gelenler ve acemiler için (python açısından kendim gibi) yararlı olduğu için onayladım. - Teşekkürler, bir şeyler öğrendim.
BlueEel

Basit uygulamayı seviyorum - şimdi birisinin neden kullanabileceğini görüyorum. Gerçi hiç buna ihtiyaç duymadım.
gabe

Örnek, for / else kullanımını gösterir, ancak soru özellikle while / else ile ilgilidir.
Ian Goldby

20

Else-yan tümcesi while-koşulu false olarak değerlendirildiğinde çalıştırılır.

Gönderen belgeler :

While ifadesi, bir ifade doğru olduğu sürece tekrarlanan yürütme için kullanılır:

while_stmt ::=  "while" expression ":" suite
                ["else" ":" suite]

Bu, ifadeyi tekrar tekrar test eder ve eğer doğruysa, birinci takımı yürütür; ifade yanlışsa (ilk test edildiğinde olabilir) else, varsa cümlenin paketi yürütülür ve döngü sona erer.

breakİlk süitte yürütülen bir deyim, elseyan tümce süiti yürütülmeden döngüyü sonlandırır . continueİlk süitte yürütülen bir ifade, süitin geri kalanını atlar ve ifadeyi test etmeye geri döner.


15

Cevabım, başka / ne zaman kullanabileceğimize odaklanacaktır.

İlk bakışta, kullanırken farklı bir şey yok gibi görünüyor

while CONDITION:
    EXPRESSIONS
print 'ELSE'
print 'The next statement'

ve

while CONDITION:
    EXPRESSIONS
else:
    print 'ELSE'
print 'The next statement'

Çünkü print 'ELSE'ifade her iki durumda da (her ikisi de whiledöngü bittiğinde ya da çalışmadığında) her zaman yürütülmüş gibi görünür .

Daha sonra, yalnızca print 'ELSE'ifade yürütülmeyeceği zaman farklıdır . Bir olduğu bir zamanda verilmiş bulunuyor breakkod bloğu altındakiler içeridewhile

In [17]: i = 0

In [18]: while i < 5:
    print i
    if i == 2:
        break
    i = i +1
else:
    print 'ELSE'
print 'The next statement'
   ....:
0
1
2
The next statement

Farklıysa:

In [19]: i = 0

In [20]: while i < 5:
    print i
    if i == 2:
        break
    i = i +1
print 'ELSE'
print 'The next statement'
   ....:
0
1
2
ELSE
The next statement

return bu kategoride değildir, çünkü yukarıdaki iki durum için aynı etkiyi yapar.

istisna zamması da fark yaratmaz, çünkü bir sonraki kodun çalıştırılacağı yerde istisna işleyicide (blok hariç), elseyan tümcedeki veya yan tümcesinden hemen sonra kod whileyürütülmez.


4

Bunun eski bir soru olduğunu biliyorum ama ...

Raymond Hettinger'in dediği gibi, bunun while/no_breakyerine çağrılmalıdır while/else.
Bu snippet'e bakarsanız, anlaşılmayı kolay buluyorum.

n = 5
while n > 0:
    print n
    n -= 1
    if n == 2:
        break
if n == 0:
    print n

While while döngüsünden sonra durumu kontrol etmek yerine onu değiştirebilir elseve bu kontrolden kurtulabiliriz.

n = 5
while n > 0:
    print n
    n -= 1
    if n == 2:
        break
else:  # read it as "no_break"
    print n

Her zaman while/no_breakkodu anlamak için okudum ve sözdizimi benim için çok daha mantıklı.


3

Else yan tümcesi yalnızca while koşulu yanlış olduğunda çalıştırılır .

İşte bazı örnekler:

Örnek 1: Başlangıçta koşul yanlıştır, bu nedenle else-cümlesi yürütülür.

i = 99999999

while i < 5:
    print(i)
    i += 1
else:
    print('this')

ÇIKTI:

this

Örnek 2: while-koşul i < 5 nedeniyle yanlış olamadı i == 3döngü, bu nedenle araları başka fıkra infaz edilmedi.

i = 0

while i < 5:
    print(i)
    if i == 3:
        break
    i += 1
else:
    print('this')

ÇIKTI:

0
1
2
3

Örnek 3: while-koşul i < 5 zaman yanlış oldu ioldu 5, bu yüzden başka fıkra infaz edildi.

i = 0

while i < 5:
    print(i)
    i += 1
else:
    print('this')

ÇIKTI:

0
1
2
3
4
this

0

else:Deyim while döngüsü artık koşulunu karşılayan sadece (sizin örnekte, ne zaman ve ne zaman çalıştırılır n != 0yanlıştır).

Yani çıktı şu olurdu:

5
4
3
2
1
what the...

Biliyorum ama bu tür bir süre / başka Java çalışmıyor. Python'da işe yaradığını anladığımda oldukça ilginç buluyorum. Sadece merak ettim ve teknik sebebi bilmek istedim.
Ivan

6
@Ivan: Çok daha öyle değil o değil işi Java ama etmediğini var Java. Birisi dile ekleyecekse, işe yarayabilir.
Ignacio Vazquez-Abrams

1
Hayır, Yanlış ise: .. else .. hala else yan tümcesini çalıştırır. Söylemek daha doğru: başka sadece döngü kopmuşsa çalıştırılmaz.
Leo Ufimtsev

0

While döngüsü kırılmadıysa, başka yürütülür.

Bunu bir 'koşucu' metaforu ile düşünmeyi seviyorum.

"Başka", parkurun başında mı yoksa sonunda mı başladığınızla ilgili olmayan bitiş çizgisini geçmek gibidir. "Başka" okunur değil sen arasında bir yerde bölerseniz idam.

runner_at = 0 # or 10 makes no difference, if unlucky_sector is not 0-10
unlucky_sector = 6
while runner_at < 10:
    print("Runner at: ", runner_at)
    if runner_at == unlucky_sector:
        print("Runner fell and broke his foot. Will not reach finish.")
        break
    runner_at += 1
else:
    print("Runner has finished the race!") # Not executed if runner broke his foot.

Ana kullanım örnekleri, bu iç içe döngülerden ayırmayı kullanmak veya yalnızca döngü bir yerde kırılmadıysa bazı ifadeleri çalıştırmak istiyorsanız (kırılmanın olağandışı bir durum olduğunu düşünün).

Örneğin, değişkenler kullanmadan veya try / catch yapmadan bir iç döngüden nasıl çıkılacağı konusunda bir mekanizma aşağıdadır:

for i in [1,2,3]:
    for j in ['a', 'unlucky', 'c']:
        print(i, j)
        if j == 'unlucky':
            break
    else: 
        continue  # Only executed if inner loop didn't break.
    break         # This is only reached if inner loop 'breaked' out since continue didn't run. 

print("Finished")
# 1 a
# 1 b
# Finished

-1

Python'da 'while: else:' yapısının daha iyi kullanılması, 'while' içinde hiçbir döngü yürütülmezse, 'else' deyimi yürütülürse kullanılmalıdır. Bugün çalışma şekli mantıklı değil çünkü aşağıdaki kodu aynı sonuçlarla kullanabilirsiniz ...

n = 5
while n != 0:
    print n
    n -= 1
print "what the..."

8
Hayır, fark elsedöngüden breakveya returnanahtar kelimeden ayrılırsanız bloğun yürütülmeyeceğidir . Örnekte, printdöngü üzerinde sona ermişse de çalıştırılacaktır breakkomuta.
notsurewhattodo

2
Çoğu insanın bu özelliğin nasıl çalıştığını değil, özelliğin nasıl çalışmasını istediğini açıklarsınız!
dotancohen

-2

Sosyal etkileşim için yararlıdır.

while (Date != "January 1st"):
    time.sleep(1)
else:
    print("Happy new year!")

2
Ve buradaki amaç tam olarak elsenedir? Kod onsuz tam olarak aynı şeyi yapar.
wovano

Eğer breakgeri sayım sırasında saat ve takvim kullanmıyorsanız else, "Mutlu yıllar!" anında hiçbir anlam ifade etmiyor.
Guimoute

@Guimote, "saatiniz ve takviminiz break" ile ne demek istiyorsun ? Kodda yok break.
wovano
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.