Python neden for ve while döngülerinden sonra 'else' kullanıyor?


480

Bu yapının nasıl çalıştığını anlıyorum:

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

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

Ama neden elseburada anahtar kelime olarak kullanıldığını anlamıyorum , çünkü söz konusu kod sadece forblok tamamlanmadığında çalışır , yani ne tersi! Nasıl düşünürsem düşüneyim, beynim forifadeden elsebloğa sorunsuz bir şekilde ilerleyemez . Bana göre, continueya continuewithda daha mantıklı olurdu (ve kendimi böyle okumak için eğitmeye çalışıyorum).

Python kodlayıcılarının bu yapıyı kafalarında (veya isterseniz yüksek sesle) nasıl okuduğunu merak ediyorum. Belki de böyle kod bloklarını daha kolay deşifre edebilecek bir şey eksik?


26
Kafanızdaki "o zaman" a çevirmek isteyebilirsiniz.
Marcin

63
Python Zen'deki anahtar çizgiyi unutmayın: "... Hollandalı değilseniz bu şekilde ilk başta belli olmayabilir."
Daniel Roseman

50
Kafamda "kırılmazsa" kelimesine çeviriyorum . Beri, breakbir çok kullanıldığı "Bunun buldum" döngüler, bunu çevirebilir "bulursa değil" uzak ne olmadığı, elseokur
MestreLion

29
Bence birçok insanın asıl sorusu " for döngüsü arasındaki for ... else foo()ve foo()sonrasındaki fark nedir ?" Ve cevap, sadece döngü bir break( eğer aşağıda ayrıntılı olarak açıklandığı gibi) içeriyorsa farklı davranmalarıdır .
Sam Kauffman

Yanıtlar:


278

Tecrübeli Python kodlayıcıları için bile garip bir yapı. Döngülerle birlikte kullanıldığında, temel olarak "yinelenebilir bir öğeyi bul, başka hiçbir şey bulunamazsa ..." anlamına gelir. De olduğu gibi:

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

Ancak bu yapıyı her gördüğünüzde, aramayı bir işlevde kapsüllemek daha iyi bir alternatiftir:

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

Veya bir liste kavrayışı kullanın:

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.')

Semantik olarak diğer iki sürümle eşdeğer değildir, ancak tüm listeyi yinelemenizin veya yinelememenizin önemli olmadığı performans dışı kritik kodda yeterince iyi çalışır. Diğerleri buna katılmayabilir, ancak bizzat üretim kodunda başkası için veya başka bir yerde kullanmaktan kaçınırım.

Ayrıca bakınız [Python-ideas] for ... else thread


50
Liste kavraması yanlış bir astardır. Nda olduğu gibi tek bir öğenin arıyorsanız fordöngü örnekler ve jeneratör ifade / liste anlama kullanmak istiyorum, sonra istediğiniz next((o for o in objects if o.key == search_key), None)veya bir alanına kaydırmak try/ exceptve bir yerine varsayılan değeri kullanın if/ ' else.
agf

4
ve Lance Helsten'in cevabı gibi, bir for/elseyapı kullanmanın daha iyi olduğu gerçek durumlar var .
andrean

5
Şerefe. Bir elseile eşleştirilmiş bir kötü girintili dosya forvardı ve yasal olduğunu hiç bir fikrim yoktu.
maxywb

3
Ben for döngüsü orada yapıların en belirgin olduğunu düşünüyorum.
Miles Rout

14
breakBu örnekte olduğu gibi bir deyim açıklık çalıştırılmadığı sürece for döngüsünün değerleri olsa bile else deyiminin çalışacağından bahsetmek gerekir . Yukarıdaki belgelerden: " elseCümlede algılanan başka bir sorun daha var: breakdöngüde hiç yoksa, elsecümle işlevsel olarak gereksizdir." ör.for x in [1, 2, 3]:\n print x\n else:\n print 'this executes due to no break'
dhackner

586

Ortak bir yapı, bir şey bulunana kadar bir döngü çalıştırmak ve daha sonra döngüden çıkmaktır. Sorun, döngüden koparsam veya döngü biterse, hangi durumun olduğunu belirlemem gerekir. Bir yöntem, döngüden nasıl çıkıldığını görmek için ikinci bir test yapmama izin verecek bir bayrak veya mağaza değişkeni oluşturmaktır.

Örneğin, bir listede arama yapmam ve bir bayrak öğesi bulunana kadar her öğeyi işlemem gerektiğini ve ardından işlemeyi durdurmam gerektiğini varsayalım. Bayrak öğesi eksikse, bir istisna oluşturulmalıdır.

Sahip olduğunuz Python for... elseyapısını kullanarak

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

Bunu, bu sözdizimsel şekeri kullanmayan bir yöntemle karşılaştırın:

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

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

İlk durumda, raisebirlikte çalıştığı for döngüsüne sıkıca bağlanır. İkincisinde bağlanma o kadar güçlü değildir ve bakım sırasında hatalar ortaya çıkabilir.


69
Bu, yazarın başka ne hakkında olduğunu gerçekten alamadığı seçilen cevaptan daha iyi açıklar!
erikbwork

17
Bu sözdizimsel şekerin projenizin dişlerini çürütebileceğini söylemeliyim. Bu bir Python: the good partskitap yapmaz .
boatcoder

1
process(i)Örneğinizde, her ürün için mylistkesinlikle theflagdeğil, daha önce olduğunu teyit edebilir misiniz theflag? Amaçlanan bu muydu?
bli

4
processulaşılmadan iönce listede bulunan her birinde theflagyürütülür, daha sonra listedeki öğeler üzerinde yürütülmez theflagve yürütülmez theflag.
Lance Helsten

1
yinelenebilir hiçbir öğesi yoksa else deyimi de yürütülür
Lost

173

Raymond Hettinger tarafından Kodun Güzel, Deyimsel Python'a Dönüştürülmesi başlıklı mükemmel bir sunum var ve burada yapının tarihine kısaca değiniyor for ... else. İlgili bölüm 15: 50'den başlayan ve yaklaşık üç dakika süren "döngülerdeki çoklu çıkış noktalarının ayırt edilmesi" dir . İşte yüksek noktalar:

  • for ... elseYapı, belirli bir yerine Donald Knuth tarafından geliştirildi GOTOkullanım durumları;
  • elseAnahtar kelimeyi yeniden kullanmak mantıklıydı çünkü Knuth'un kullandığı şey buydu ve insanlar o zaman tüm forifadeler bir ifve GOTOaltına gömülmüştü else;
  • Gez, buna "mola yok" (veya muhtemelen "nobreak") denilmeliydi ve sonra kafa karıştırıcı olmayacaktı. *

Yani, soru "Neden bu anahtar kelimeyi değiştirmiyorlar?" Sonra Kedi Plus Plus muhtemelen en doğru cevabı verdi - bu noktada, pratik olması için kod mevcut çok yıkıcı olurdu. Ama gerçekten sorduğunuz soru neden elseilk etapta yeniden kullanıldıysa, o zaman iyi bir fikir gibi görünüyordu.

Şahsen, bir bakışta, döngünün içine ait olarak, yanıltıcı olabilecek # no breakher yerde satır içi yorum yapmanın tavrını seviyorum else. Oldukça açık ve özlü. Bu seçenek , Bjorn'un cevabının sonunda bağladığı özette kısa bir söz alır :

Tamlık için, sözdiziminde hafif bir değişiklikle, bu sözdizimini isteyen programcıların şu anda sahip olabileceğini belirtmeliyim:

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

* Videonun bu kısmından bonus alıntı: "Tıpkı lambda işlevini çağırırsak, kimse '' Lambda ne yapar? ''


33

Çünkü dile yeni bir anahtar kelime getirmek istemediler. Her biri bir tanımlayıcı çalar ve geriye dönük uyumluluk sorunlarına neden olur, bu nedenle genellikle son çare olur.


2
finallyBu durumda daha iyi bir seçim olurdu gibi görünüyor . Nihayet anahtar kelime, bu yapının kullanıma sunulduğu sırada henüz mevcut değil miydi?
Ponkadoodle

26
@Wallacoloo finallyçok daha iyi değil, çünkü bloğun döngüden sonra her zaman yürütüleceğini ima ediyor ve değil (çünkü bu sadece döngüden sonra kodun çalıştırılmasıyla gereksiz olurdu).
Cat Plus Plus

Diğer finallyyan tümce de continuefor döngüsünde kullanıldığında da çalıştırılamaz - bu yalnızca sonunda değil, birçok kez de olabilir.
pepr

6
@pepr elseyan tümce yürütme etkilenmez continue( dokümanlar ve test kodu )
Air

@AirThomas: +1. Haklısın. elseYalnızca yürütüldüğünde continueson yineleme için biriydi.
pepr

33

Basitleştirmek için bunu şöyle düşünebilirsiniz;

  • Döngüdeki breakkomutla karşılaşırsa, parça çağrılmaz.forelse
  • Döngüdeki breakkomutla karşılaşmazsa for, elseparça çağrılır.

Başka bir deyişle, döngü yinelemesi için "kırılmaz" ise break, elseparça çağrılır.


elseDöngünün gövdesi bir özel durum ise blok da yürütülmez.
Amal K

17

For / else ne yaptığını ve daha da önemlisi ne zaman kullanacağımı 'bulmanın' en kolay yolu break ifadesinin nereye atladığına odaklanmaktı. For / else yapısı tek bir bloktur. Mola bloktan atlar ve böylece diğer cümlenin üzerine atlar. Diğer yan tümcesinin içeriği basitçe for yan tümcesini izleseydi, hiçbir zaman atlanmayacaktı ve bu nedenle eşdeğer mantığın bir if içine sokulmasıyla sağlanacaktı. Bu daha önce söylendi, ancak bu kelimelerle tam olarak değil, bu yüzden başka birine yardımcı olabilir. Aşağıdaki kod parçasını çalıştırmayı deneyin. Bütün kalbimle netlik için 'ara vermeden' yorumunu destekliyorum.

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')

"Kırılma bloktan atlar ve böylece başka maddede 'üzerinde' atlar" - bu "alma" bir yolu olarak yararlı olabilir iken for:/ else:, gerçekten anahtar kelime varlık için bir gerekçe sağlamaz else. Burada verilen çerçeve göz önüne alındığında, then:çok daha doğal olacak gibi görünüyor. (Orada olan nedenleri else- onlar sadece burada sağlanan değiliz diğer yanıtlar verilen seçilmiş olmanın,.)
Mark Amery

16

Bence belgelerin başka bir açıklaması daha var , devam et

[...] döngü, listenin tükenmesiyle (for ile) sona erdiğinde veya koşul false olduğunda (while ile) yürütülür, ancak döngü bir break deyimi ile sonlandırıldığında gerçekleşmez. "

Kaynak: Python 2 belgeleri: Kontrol akışıyla ilgili öğretici


13

Ben şöyle bir şey okudum:

Hala döngüyü çalıştırmak için koşullar varsa, bir şeyler yapın, başka bir şey yapın.


Kişisel koşullara hala yanlış olmasına rağmen (1) yararlıdır - 's insan ;-)
Kurt

1; Bu telaffuzu for:/ else:ses gibi else:her zaman böyle değildir döngü, sonra yayınlanacaktır.
Mark Amery

11

Teknik kısım hemen hemen yanıtlandığından, yorumum bu geri dönüştürülmüş anahtar kelimeyi üreten karışıklıkla ilgilidir .

Python çok etkili bir programlama dili olduğundan, bir anahtar kelimenin yanlış kullanımı daha meşhurdur. elseAnahtar kelime mükemmel "Eğer (başka) bunu bunu yapamaz eğer", bir karar ağacının akışının bir kısmını tanımlıyor. Bu oluyor ima kendi dilinde.

Bunun yerine, bu anahtar kelimeyi whileve forifadeleriyle kullanmak karışıklık yaratır. Bunun sebebi, programcı olarak kariyerimizin bize elseifadenin bir karar ağacı içinde yer aldığını ; onun mantıksal kapsamı , bir sarıcı şartlı bir yol takip etmek dönün. Bu arada, döngü ifadelerinin bir şeye ulaşmak için mecazi açık bir amacı vardır. Amaç, bir sürecin sürekli tekrarlarından sonra yerine getirilir.

if / else izlenecek yolu belirtin . Döngüler , "hedef" tamamlanana kadar bir yolu takip eder .

Sorun şu ki else, bir koşuldaki son seçeneği açıkça tanımlayan bir kelimedir. Semantik kelimenin ikisi olan paylaşılan Python ve İnsan Dile göre. Ancak İnsan Dilindeki diğer kelime, bir şey tamamlandıktan sonra birinin veya bir şeyin yapacağı eylemleri belirtmek için asla kullanılmaz. Tamamlama sürecinde bir sorun ortaya çıkarsa (daha çok bir break bildirimi gibi ) kullanılır.

Sonunda, anahtar kelime Python'da kalacaktır. Her programcı bazı anımsatıcı cihazlar gibi kullanımını anlamak için bir hikaye bulmaya çalıştığında hata olduğu açıktır. Anahtar kelime yerine onlar seçtiler isterdim then. Bu anahtar kelimenin döngüden sonraki kazanç , yinelemeli akışa mükemmel bir şekilde uyduğuna inanıyorum .

Bu, bir çocuğun bir oyuncak montajındaki her adımı izledikten sonra sahip olduğu duruma benzer: Peki sonra ne baba?


Bence bu cevap OP'nin bahsettiği kafa karışıklığı konusunu ele alıyor. Else anahtar kelimesi, for eylemine bağlıyken, başkalarının İngilizce anlamından ne beklediğinizin tam tersini yapar. Teoride, for ... else farklı bir şekilde çalışmış olabilir, çünkü döngü koptuğunda başka bir parçaya ulaşırsınız, Ama sorun x öğesini bulmak ve x'in olduğu durumla başa çıkmaktır. bulunamadı, başka bir şey için bir bayrak veya başka bir test kullanmak zorunda kalabilirsiniz .. başka yapı
Spacen Jasset 31:18

7

" iterableTamamen tükendiğinde ve yürütme işlemi bittikten sonra bir sonraki ifadeye geçmek üzereyken for, diğer fıkra yürütülür" şeklinde okudum. Bu nedenle, yineleme bozulduğunda break, bu yürütülmeyecektir.


6

Katılıyorum, daha çok 'elif değil [koşul (lar) yükseltme molası]' gibi.

Bu eski bir konu olduğunu biliyorum, ama şu anda aynı soruya bakıyorum ve kimse bu sorunun cevabını anladığım şekilde ele geçirdiğinden emin değilim.

Benim için, hepsi eşdeğer olan elsein For... elseveya While... elseifadeleri "okumanın" üç yolu vardır:

  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) (muhtemelen böyle bir durum vardır, ya da bir döngünüz olmaz)

Yani, esasen, bir döngüdeki "else" gerçekten bir "elif ..." dir, burada '...' (1) hiçbir mola değildir, bu da (2) NOT [koşul (lar) yükseltme molasına] DEĞİLDİR.

Ben anahtarı else'sonu' olmadan anlamsız olduğunu düşünüyorum , bu yüzden bir for...elseiçerir:

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

Yani, bir for...elsedöngünün temel unsurları aşağıdaki gibidir ve bunları plainer İngilizce'de şu şekilde okursunuz:

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

Diğer posterlerin söylediği gibi, genellikle döngünüzün aradığını bulabildiğinizde bir mola verilir, böylece else:"hedef öğe bulunmazsa ne yapmalı" olur.

Misal

İstisna işleme, aralar ve döngüler için birlikte kullanabilirsiniz.

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")

Sonuç

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

Misal

Bir mola ile basit örnek.

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")

Sonuç

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

Misal

Kesinti, kopukluk koşulu ve hata ile karşılaşılmayan basit örnek.

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")

Sonuç

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

6

elseBuradaki anahtar kelime kafa karıştırıcı ve birçok kişi sivri out, böyle bir şey var olarak alınabilir nobreak, notbreakdaha uygundur.

Anlamak için for ... else ...mantıksal olarak, ile karşılaştırmak try...except...elsedeğil, if...else..., piton programcılar çoğu aşağıdaki kodları ile aşina:

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.

Benzer şekilde, breaközel bir tür olarak düşünün 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

Fark edilir pythonima except breakve olur böylece, bunu yazamazsınız:

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

Evet, bu karşılaştırmanın zor ve yorucu olabileceğini biliyorum, ama karışıklığı netleştiriyor.


Kaynak kopyalarken kaynağa bir bağlantı yapmalısınız: Nick Coghlan'ın Python Notları .
godaygo

@ godaygo bağlantı için teşekkürler. İlk python öğrenirken kavramı okudum ve kabul ediyorum, cevabı yazarken kaynağı ezberlemedim.
cizixs

@cizixs "Kaynağı ezberlemediniz", ancak orijinaliyle aynı yorum cümlelerinin tümünü eklediniz mi? Ooookaaaay.
Mark Amery

5

İfade elsebloğundaki kodlar , fordöngü kırılmadığında yürütülür .

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

Gönderen docs: kırmak ve Tablolar ve Loops else Maddelerini devam

Döngü deyimlerinin başka bir cümlesi olabilir; döngü listenin tükenmesiyle (for ile) sona erdiğinde veya koşul false olduğunda (while ile) yürütülür, ancak döngü bir break deyimi ile sonlandırıldığında gerçekleşmez. Bu, asal sayıları arayan aşağıdaki döngü ile örneklendirilir:

>>> 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

(Evet, bu doğru koddur. Yakından bakın: else yan tümcesi if döngüsüne değil, for döngüsüne aittir.)

Bir döngü ile birlikte kullanıldığında, else cümlesi, bir try ifadesinin else cümlesi ile if ifadelerinden daha fazla ortaktır: try ifadesinin else cümlesi, istisna olmadığında çalışır ve hiçbir break gerçekleşmediğinde loop'un else cümlesi çalışır . Try ifadesi ve istisnalar hakkında daha fazla bilgi için bkz. İstisnaları İşleme.

C'den ödünç alınan devam ifadesi, döngünün bir sonraki yinelemesiyle devam eder:

>>> 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

1
Bu hiçbir şey eklemez ve soruyu cevaplamaz, bu nasıl ama neden değil .
Hava

5

İşte yukarıda başka kimsenin görmediğini düşünmenin bir yolu:

İlk olarak, for-döngülerin temel olarak while-döngülerinin etrafında sadece sözdizimsel şeker olduğunu unutmayın. Örneğin, döngü

for item in sequence:
    do_something(item)

(yaklaşık) olarak yeniden yazılabilir

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

İkincisi, while-loop'larının temelde sadece if-blokları tekrarlandığını unutmayın! Her zaman while döngüsünü "bu koşul doğruysa, gövdeyi yürütün, sonra geri dönüp tekrar kontrol edin" şeklinde okuyabilirsiniz.

Bu yüzden / else mükemmel mantıklıyken: Sadece bir kez kontrol etmek yerine koşul yanlış olana kadar döngü işlevinin eklenmesi ile if / else ile tam olarak aynı yapıdır.

Ve sonra / else için de mükemmel mantıklı: çünkü tüm for-loop'lar while-loop'ların üstünde sadece sözdizimsel şeker olduğundan, sadece altta yatan while-loop'un örtülü koşulunun ne olduğunu bulmanız gerekir ve sonra diğeri bunun ne zaman karşılık geldiğini bulmanız gerekir. durumu Yanlış olur.


4

Harika cevaplar:

  • Bu geçmiş açıklamak hangi ve
  • bu , çeviri / anlayışınızı kolaylaştırmak için doğru alıntıyı verir.

Buradaki notum Donald Knuth'un bir zamanlar söylediği şeyden (üzgünüm referans bulamıyor) süre-başkasının if-else'den, yani (Python'da) ayırt edilemediği bir yapı olduğunu söyledi:

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

aşağıdakilerle aynı akışa sahiptir (düşük seviye farklılıkları hariç):

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

Mesele şu ki, if-else bloğunun breaksonunda örtük olan while için başka sözdizimsel şeker olarak düşünülebilir if. Bu whiledöngü, bunun uzantısıdır , bunun tersi ifdaha yaygındır (daha önce tekrarlanan / döngülü koşullu kontrol), çünkü ifdaha önce öğretilir while. Ancak bu doğru değildir, çünkü bu durum elsewhile bloğu anlamına gelir ; koşul yanlış olduğunda her seferinde yürütülür .

Anlayışınızı kolaylaştırmak için bunu şu şekilde düşünün:

Olmadan break, returndurum olduğunda, vb döngü biter sadece artık doğru ve bu tür durumda elsebloğun da bir kez çalıştırır. Python durumunda, forC tarzı fordöngüler (koşullarla) veya bunları çevirmeniz gerekir while.

Başka bir not:

Döngü içindeki erken break, returnvb. Durum doğru olduğunda imkansız hale gelir, çünkü koşul doğruyken yürütme döngüden atlar ve bir daha kontrol etmek için geri gelmez.


3

Bunu else, döngüde yapılmayan diğer şeylerde veya diğer şeylerde olduğu gibi düşünebilirsiniz .


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

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

"else" burada çok basit, sadece

1, " for clausetamamlandıysa"

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")

"Madde tamamlandı" gibi uzun ifadeler yazmak için kullanışlıdır, bu yüzden "else" ifadesini kullanırlar.

else İşte doğasında bir if.

2, ancak, nasıl hakkında 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

Yani tamamen ifade mantık kombinasyonu:

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

veya şu şekilde koyun:

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

veya bu şekilde:

if "for clause not encounter a break":
    do else stuff

aksi halde SQL'de "işlem" görevi görür.
Matematik

2

İşte arama dışında başka bir deyimsel kullanım örneği. Diyelim ki bir koşulun gerçek olmasını beklemek istiyorsunuz, örneğin bir bağlantı noktasının uzak sunucuda açık olması ve biraz zaman aşımı. O zaman şöyle bir while...elseyapı kullanabilirsiniz :

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()

1

Sadece kendimi tekrar anlamaya çalışıyordum. Aşağıdakilerin yardımcı olduğunu buldum!

• Döngünün içi elseile eşleştirildiğini düşünün if(yerine değil for) - koşul yerine getirilirse döngüyü kırın, başka bir şey yapın - tek bir elseçoklu ifs ile eşleştirilmiş olması hariç !
• Hiç kimse iftatmin olmamışsa else.
• Çoklu ifs de aslında s if- olarak düşünülebilir elif!


-2

I (varsa) bir başka B olarak yapısını düşünün ve için (varsa) -else olan özel bir if-else , kabaca . Başka anlamaya yardımcı olabilir .

A ve B en fazla bir kez yürütülür, bu if-else yapısıyla aynıdır.

for (if), if koşulunu karşılamaya çalışmak için bir döngü yapan özel bir if olarak değerlendirilebilir. Bir kez eğer koşul karşılandığında, A ve kırılma ; Else , B.


-2

Python for döngüsü sırasında ve while döngüsünden başka bir şey kullanır, böylece döngü için hiçbir şey geçerli değilse başka bir şey olur. Örneğin:

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

Çıktı tekrar tekrar 'Merhaba' olacaktır (eğer doğruysam).

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.