Pętla, która pilnuje warunku
Podczas gdy for przechodzi po znanej sekwencji, while powtarza się tak długo, jak warunek jest prawdziwy. Sięgasz po nią, gdy nie wiesz z góry, ile iteracji będzie potrzebnych: ponawianie próby, aż coś zadziała, wczytywanie danych, dopóki użytkownik nie powie stop, odpytywanie usługi, aż odpowie.
Budowa jest prosta:
To wypisuje liczby od 0 do 4. Python sprawdza warunek na początku każdej iteracji. Jeśli jest prawdziwy, wykonuje się ciało pętli. Potem warunek jest sprawdzany ponownie. Gdy stanie się fałszywy, pętla się kończy.
Zwróć uwagę, że count += 1 ma znaczenie. Bez tej linii warunek byłby prawdziwy w nieskończoność, czyli powstałaby nieskończona pętla. To główna pułapka while i główny powód, żeby wybierać for wszędzie tam, gdzie się da.
Kiedy while to właściwe narzędzie
Kilka klasycznych zastosowań:
Ponawianie aż do skutku.
Wczytywanie danych, dopóki użytkownik nie zakończy.
Przetwarzanie kolejki.
Wspólny mianownik: czekasz na zmianę stanu, a nie przechodzisz po kolejnych elementach.
while True jest w porządku
Ten wzorzec zobaczysz bardzo często:
To idiomatyczny Python, gdy "prawdziwy" warunek wyjścia znajduje się w ciele pętli, a nie jest czymś, co da się czytelnie sprawdzić na początku. Taki kod czyta się łatwiej niż wymyśloną flagę should_continue, którą aktualizujesz w jednym miejscu, a sprawdzasz w innym.
Jedyna zasada: upewnij się, że istnieje break (albo return, albo zgłoszony wyjątek), do którego kod w końcu dotrze. Bezwarunkowe while True: bez wyjścia to klasyczny sposób na zawieszenie programu.
Jak uniknąć nieskończonej pętli
Nieskończone pętle powstają, gdy warunek pozostaje prawdziwy na zawsze. Typowi winowajcy:
- Brak aktualizacji zmiennej.
while count < 5:wymaga, żeby coś w ciele pętli zmieniałocount. - Aktualizacja niewłaściwej zmiennej.
while i < 10:, a w środkuj += 1: łatwo to przeoczyć, gdy w kodzie jest więcej niż kilka zmiennych. - Porównywanie liczb zmiennoprzecinkowych.
while x != 1.0:może kręcić się w nieskończoność, jeślixtylko zbliża się do 1.0. Zamiast tego użyj<=alboabs(x - 1.0) < tolerance.
Jeśli utkniesz w nieskończonej pętli w terminalu, naciśnij Ctrl+C. To wysyła sygnał przerwania i Python przestaje robić to, co akurat robi.
break, continue i else
while obsługuje te same trzy narzędzia sterowania przepływem co for:
breaknatychmiast kończy pętlę.continueprzechodzi do następnej iteracji (więc warunek jest sprawdzany ponownie).elsewykonuje się, jeśli pętla zakończyła się bezbreak.
To prosty test pierwszości. Jeśli wewnętrzne break zadziała, liczba jest złożona. Jeśli pętla zakończy się naturalnie (warunek stanie się fałszywy), wykona się else i uzna liczbę za pierwszą.
while czy for: co wybrać?
Szybki test w głowie:
- Masz kolekcję do przejścia? →
for. - Chcesz powtórzyć coś określoną liczbę razy? →
for i in range(n):. - Powtarzasz, dopóki nie zmieni się jakiś warunek? →
while.
Na początku przygody z Pythonem zauważysz, że for wystarcza w 90% pętli. while pojawia się przy odpytywaniu, ponawianiu prób albo budowaniu prostego REPL. Jeśli używasz while do przechodzenia po liście za pomocą indeksu, to znak, że warto przejść na for + enumerate.
Praktyczny program z while
Gra w zgadywanie liczby to klasyczny przykład, bo liczba iteracji zależy od tego, jak gra użytkownik:
Nie da się z góry przewidzieć, ile prób to zajmie, bo wszystko zależy od odpowiedzi użytkownika. Właśnie dlatego istnieje while.
Co dalej
Znasz już oba rodzaje pętli, które daje Python. Następny temat to szczegóły range(): pojawia się w niemal każdej liczącej pętli for, a jego drobne niuanse warto zrozumieć, zanim przejdziemy do kolekcji.
Najczęściej zadawane pytania
Kiedy używać pętli while zamiast pętli for?
Użyj while, gdy nie wiesz z góry, ile iteracji będzie potrzebnych, na przykład przy ponawianiu próby, aż coś się uda, albo przy wczytywaniu danych, dopóki użytkownik nie wpisze 'quit'. Użyj for, gdy przechodzisz po znanej kolekcji.
Jak uniknąć nieskończonej pętli w Pythonie?
Upewnij się, że coś wewnątrz pętli w końcu sprawi, że warunek stanie się fałszywy. Najczęstszą przyczyną nieskończonych pętli jest brak aktualizacji zmiennej, od której zależy warunek. Jeśli trafisz na taką pętlę, naciśnij Ctrl+C w terminalu, żeby ją zatrzymać.
Czy while True to zła praktyka?
while True to zła praktyka?Samo w sobie nie. while True: z wyraźnym break w środku to całkowicie normalny wzorzec typu "powtarzaj, aż trafimy na konkretny warunek wyjścia". To czystsze niż wymyślanie flagi logicznej, którą trzeba obsługiwać w dwóch miejscach.