Zauważyłem, że następujący kod jest legalny w Pythonie. Moje pytanie brzmi: dlaczego? Czy jest jakiś konkretny powód?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
Zauważyłem, że następujący kod jest legalny w Pythonie. Moje pytanie brzmi: dlaczego? Czy jest jakiś konkretny powód?
n = 5
while n != 0:
print n
n -= 1
else:
print "what the..."
else
był wyjątkowo złym pomysłem i że nie robiliby tego więcej.after:
.Odpowiedzi:
else
Klauzula jest wykonywana tylko wtedy, gdywhile
warunek stanie się fałszywy. Jeśli wyjdzieszbreak
z pętli lub zostanie zgłoszony wyjątek, nie zostanie on wykonany.Jednym ze sposobów myślenia o tym jest konstrukt if / else w odniesieniu do warunku:
jest analogiczny do konstrukcji zapętlonej:
Przykładem może być:
źródło
while {} something
z wyjątkiem tego, żesomething
zostanie pominięty, jeśli będzieszbreak
wwhile
pętli.else
Klauzula jest wykonywany po wyjściu bloku normalnie, trafiając warunek pętli lub spadając spód bloku try. To jest nie wykonany, jeślibreak
lubreturn
z bloku, albo podnieść wyjątek. Działa nie tylko podczas i dla pętli, ale także próbuje blokować.Zazwyczaj znajduje się w miejscach, w których normalnie wychodziłbyś z pętli wcześniej, a ucieczka z końca pętli jest nieoczekiwaną / nietypową okazją. Na przykład, jeśli przeglądasz listę w poszukiwaniu wartości:
źródło
found_it=False
na początku pętli, a potem sprawdzałem, czyfound_it
pod koniecW odpowiedzi na
Is there a specific reason?
to jest jedna interesująca aplikacja: przełamanie wielu poziomów zapętlenia.Oto jak to działa: zewnętrzna pętla ma przerwę na końcu, więc zostanie wykonana tylko raz. Jeśli jednak wewnętrzna pętla się zakończy (nie znajdzie dzielnika), wówczas osiągnie wyrażenie else i zewnętrzna przerwa nigdy nie zostanie osiągnięta. W ten sposób przerwa w wewnętrznej pętli wyrwie się z obu pętli, a nie tylko z jednej.
Dla obu
while
ifor
pętle Theelse
instrukcja wykonywana jest na końcu, chyba żebreak
użyto.W większości przypadków istnieją lepsze sposoby na zrobienie tego (zawijanie go w funkcję lub zgłaszanie wyjątku), ale to działa!
źródło
Klauzula else jest wykonywana, gdy warunek while ma wartość false.
Z dokumentacji :
źródło
Moja odpowiedź skupi się na KIEDY możemy użyć podczas / na-innym.
Na pierwszy rzut oka wydaje się, że nie ma różnicy w użyciu
i
Ponieważ
print 'ELSE'
instrukcja wydaje się zawsze wykonywana w obu przypadkach (zarówno po zakończeniuwhile
pętli, jak i po jej uruchomieniu).Wtedy będzie inaczej tylko wtedy, gdy instrukcja
print 'ELSE'
nie zostanie wykonana. To wtedy, gdybreak
pod blokiem znajduje się blok koduwhile
Jeśli różnią się od:
return
nie jest w tej kategorii, ponieważ ma ten sam efekt w dwóch powyższych przypadkach.zgłaszanie wyjątków również nie powoduje różnicy, ponieważ gdy zgłoszenie zostanie wykonane, w którym następny kod zostanie wykonany, jest on obsługiwany w wyjątku (oprócz bloku), kod w
else
klauzuli lub bezpośrednio po niejwhile
nie zostanie wykonany.źródło
Wiem, że to stare pytanie, ale ...
Jak powiedział Raymond Hettinger, należy go wywołać
while/no_break
zamiastwhile/else
.Łatwo to zrozumieć, jeśli spojrzysz na ten fragment kodu.
Teraz zamiast sprawdzania stanu po pętli while możemy go zamienić
else
i pozbyć się tego sprawdzania.Zawsze czytam go,
while/no_break
aby zrozumieć kod, a ta składnia ma dla mnie znacznie większy sens.źródło
Klauzula else jest wykonywana tylko wtedy, gdy warunek while staje się fałszywy.
Oto kilka przykładów:
Przykład 1: Początkowo warunek jest fałszywy, więc klauzula else jest wykonywana.
WYNIK:
Przykład 2: natomiast warunek
i < 5
nigdy nie stał się fałszywe, ponieważi == 3
łamie pętli, więc jeszcze klauzula nie została wykonana.WYNIK:
Przykład 3: natomiast warunkiem
i < 5
się fałszywie gdyi
był5
tak dalej klauzula została wykonana.WYNIK:
źródło
else:
Instrukcja wykonywana jest wtedy i tylko wtedy, gdy pętla gdy nie spełnia już jej stan (w przykładzie, jeślin != 0
jest fałszywe).Wynik byłby następujący:
źródło
W przeciwnym razie pętla while nie ulegnie awarii.
Lubię myśleć o tym z metaforą „biegacza”.
„Else” jest jak przekroczenie linii mety, bez względu na to, czy zacząłeś na początku, czy na końcu toru. „else” nie jest wykonywane tylko wtedy, gdy złamiesz się gdzieś pomiędzy.
Główne przypadki użycia polegają na przełamywaniu zagnieżdżonych pętli lub jeśli chcesz uruchomić niektóre instrukcje tylko wtedy, gdy pętla gdzieś się nie zepsuła (pomyśl o zerwaniu jako nietypowej sytuacji).
Na przykład poniżej przedstawiono mechanizm wyjścia z wewnętrznej pętli bez użycia zmiennych lub try / catch:
źródło
Lepszym zastosowaniem konstrukcji „while: else:” w Pythonie powinno być, jeśli żadna pętla nie jest wykonywana w „while”, wówczas wykonywana jest instrukcja „else”. Dzisiejszy sposób nie ma sensu, ponieważ możesz użyć poniższego kodu z tymi samymi wynikami ...
źródło
else
blok nie zostanie wykonany, jeśli opuścisz pętlę za pomocąbreak
lubreturn
słowa kluczowego. W twoim przykładzieprint
zostanie wykonane również, jeśli pętla zakończy się nabreak
komendzie.Jest to przydatne do interakcji społecznych.
źródło
else
? Kod robi dokładnie to samo bez niego.break
podczas odliczania zegar i kalendarz nieużywanieelse
sprawi, że powiesz „Szczęśliwego nowego roku!” natychmiast, co nie ma żadnego sensu.break
”? Nie mabreak
w kodzie.