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..."
after:
.
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..."
after:
.
Odpowiedzi:
else
Klauzula jest wykonywana tylko wtedy, gdy while
warunek stanie się fałszywy. Jeśli wyjdziesz break
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:
if condition:
handle_true()
else:
handle_false()
jest analogiczny do konstrukcji zapętlonej:
while condition:
handle_true()
else:
# condition is false now, handle and go on with the rest of the program
handle_false()
Przykładem może być:
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()
while {} something
z wyjątkiem tego, że something
zostanie pominięty, jeśli będziesz break
w while
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śli break
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:
for value in values:
if value == 5:
print "Found it!"
break
else:
print "Nowhere to be found. :-("
found_it=False
na początku pętli, a potem sprawdzałem, czy found_it
pod koniec
W 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.
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!'
Dla obu while
i for
pętle The else
instrukcja wykonywana jest na końcu, chyba że break
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!
Klauzula else jest wykonywana, gdy warunek while ma wartość false.
Z dokumentacji :
Instrukcja while służy do wielokrotnego wykonywania, dopóki prawdziwe jest wyrażenie:
while_stmt ::= "while" expression ":" suite ["else" ":" suite]
Powoduje to wielokrotne testowanie wyrażenia i, jeśli jest to prawdą, wykonanie pierwszego pakietu; jeśli wyrażenie jest fałszywe (co może być pierwszym testem), zestaw
else
klauzuli, jeśli jest obecny, jest wykonywany i pętla kończy się.
break
Oświadczenie wykonany w pierwszej pakietu kończy pętlę bez wykonywaniaelse
pakiet klauzula jest.continue
Oświadczenie wykonany w pierwszej pakietu pomija resztę pakietu i wraca do testowania ekspresji.
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
while CONDITION:
EXPRESSIONS
print 'ELSE'
print 'The next statement'
i
while CONDITION:
EXPRESSIONS
else:
print 'ELSE'
print 'The next statement'
Ponieważ print 'ELSE'
instrukcja wydaje się zawsze wykonywana w obu przypadkach (zarówno po zakończeniu while
pętli, jak i po jej uruchomieniu).
Wtedy będzie inaczej tylko wtedy, gdy instrukcja print 'ELSE'
nie zostanie wykonana. To wtedy, gdy break
pod blokiem znajduje się blok koduwhile
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
Jeśli różnią się od:
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
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 niej while
nie zostanie wykonany.
Wiem, że to stare pytanie, ale ...
Jak powiedział Raymond Hettinger, należy go wywołać while/no_break
zamiast while/else
.
Łatwo to zrozumieć, jeśli spojrzysz na ten fragment kodu.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
if n == 0:
print n
Teraz zamiast sprawdzania stanu po pętli while możemy go zamienić else
i pozbyć się tego sprawdzania.
n = 5
while n > 0:
print n
n -= 1
if n == 2:
break
else: # read it as "no_break"
print n
Zawsze czytam go, while/no_break
aby zrozumieć kod, a ta składnia ma dla mnie znacznie większy sens.
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.
i = 99999999
while i < 5:
print(i)
i += 1
else:
print('this')
WYNIK:
this
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.
i = 0
while i < 5:
print(i)
if i == 3:
break
i += 1
else:
print('this')
WYNIK:
0
1
2
3
Przykład 3: natomiast warunkiem i < 5
się fałszywie gdy i
był 5
tak dalej klauzula została wykonana.
i = 0
while i < 5:
print(i)
i += 1
else:
print('this')
WYNIK:
0
1
2
3
4
this
else:
Instrukcja wykonywana jest wtedy i tylko wtedy, gdy pętla gdy nie spełnia już jej stan (w przykładzie, jeśli n != 0
jest fałszywe).
Wynik byłby następujący:
5
4
3
2
1
what the...
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.
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.
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:
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
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 ...
n = 5
while n != 0:
print n
n -= 1
print "what the..."
else
blok nie zostanie wykonany, jeśli opuścisz pętlę za pomocą break
lub return
słowa kluczowego. W twoim przykładzie print
zostanie wykonane również, jeśli pętla zakończy się na break
komendzie.
Jest to przydatne do interakcji społecznych.
while (Date != "January 1st"):
time.sleep(1)
else:
print("Happy new year!")
else
? Kod robi dokładnie to samo bez niego.
break
podczas odliczania zegar i kalendarz nieużywanie else
sprawi, że powiesz „Szczęśliwego nowego roku!” natychmiast, co nie ma żadnego sensu.
break
”? Nie ma break
w kodzie.
else
był wyjątkowo złym pomysłem i że nie robiliby tego więcej.