Walidacja danych z użyciem pętli while
W praktycznych programach często trzeba pytać użytkownika tak długo, aż poda poprawne dane. Do tego świetnie nadaje się pętla while, która powtarza blok instrukcji dopóki spełniony jest warunek. Pętle i instrukcje warunkowe warto przeglądać razem — przykłady działania while znajdziesz w lekcji o pętlach w Pythonie.
Co warto zapamiętać?
- while wykonuje blok kodu dopóki warunek jest prawdziwy (
True). - Często używa się
while Truerazem zbreak, żeby łatwo kontrolować moment wyjścia z pętli —breakprzerywa pętlę natychmiast. - Walidacja to sprawdzanie, czy dane wejściowe spełniają wymagania (np. czy to liczba, czy długość tekstu jest odpowiednia, czy zawiera cyfrę). Instrukcje warunkowe pomagają podejmować decyzje na podstawie takich sprawdzeń.
- Konwersję tekstu na liczbę warto robić z obsługą błędów (
try/except) lub prostszymi sprawdzeniami jakisdigit()(pamiętaj —isdigit()działa tylko dla nieujemnych liczb całkowitych bez znaku plus/minus).
Krok po kroku
- Zadaj pytanie użytkownikowi (np.
input()). - Sprawdź, czy odpowiedź spełnia kryteria (walidacja).
- Jeśli tak — przerwij pętlę (
break) i użyj danych dalej. - Jeśli nie — poinformuj użytkownika i poproś o poprawę (pętla pyta ponownie).
Przykłady
Przykład 1 — prosta walidacja (tylko dodatnie liczby całkowite):
```python
while True:
s = input("Podaj dodatnią liczbę całkowitą: ")
# isdigit() zwraca True tylko gdy wszystkie znaki to cyfry (0-9)
if s.isdigit() and int(s) > 0:
n = int(s)
break
else:
print("To nie jest poprawna liczba. Spróbuj jeszcze raz.")
print("Wpisałeś:", n)
```
Wyjaśnienie działania przykładu:
- Wejście do pętli
while True— pętla będzie się powtarzać aż napotkamybreak. - Czytamy tekst od użytkownika (
input()). - Sprawdzamy: czy cały tekst to cyfry (
isdigit()) i czy po zamianie na liczbę jest większy niż 0. - Jeżeli tak — zamieniamy na
int, przypisujemy doni wychodzimy z pętli. - W przeciwnym razie informujemy użytkownika i pętla pyta ponownie.
Przykład 2 — bezpieczna konwersja (obsługa błędów):
```python
while True:
s = input("Podaj liczbę całkowitą: ")
try:
n = int(s) # próba konwersji na int
break # jeśli się uda, przerywamy pętlę
except ValueError:
print("To nie wygląda na liczbę. Spróbuj ponownie.")
```
- W tej wersji nie polegamy na
isdigit(), tylko próbujemy wykonaćint(s). Jeśli tekst nie jest poprawną reprezentacją liczby całkowitej, Python zgłaszaValueErrori trafiamy do blokuexcept. - Takie podejście jest bardziej ogólne (działa też z liczbami ujemnymi zapisanymi ze znakiem '-', a także z różnymi białymi znakami), dlatego jest często bezpieczniejsze.
Uwaga na typowe pułapki
isdigit()nie rozpozna liczb ujemnych ani liczb ze znakiem plus, ani ciągów zawierających spacje. Dla takich przypadków lepszy jesttry/except.- Pamiętaj o odpowiednich komunikatach dla użytkownika — dobrze dobrany komunikat pomaga szybciej wprowadzić poprawne dane.
- Unikaj nieskończonych pętli bez sposobu na wyjście — zawsze miej w kodzie warunek lub
break.
Zadanie (do samodzielnego rozwiązania)
Stwórz program, który pyta użytkownika o hasło i wymaga, żeby:
- miało co najmniej 6 znaków,
- zawierało przynajmniej jedną cyfrę.
Powtarzaj pytanie, aż hasło będzie poprawne. Po akceptacji wypisz: Hasło ustawione.
Podpowiedzi i wskazówki (to nie jest gotowe rozwiązanie):
- Użyj
while True, żeby ponawiać pytanie. - Sprawdź długość tekstu funkcją
len()(np.len(haslo) >= 6). - Sprawdź, czy w haśle znajduje się cyfra — możesz to zrobić iterując po znakach i używając
char.isdigit(), albo użyć dowolnej konstrukcji warunkowej, która znajdzie cyfrę. - Gdy obie zasady są spełnione — użyj
break, aby opuścić pętlę i wypisać komunikat.
Szablon, który możesz wypełnić samodzielnie (wstaw brakujące warunki):
```python
while True:
haslo = input("Podaj hasło: ")
# sprawdź tutaj długość i obecność cyfry
# jeśli hasło jest poprawne:
# break
# w przeciwnym razie wypisz wskazówkę i zapytaj ponownie
print("Hasło ustawione")
```
Jeśli utkniesz, zacznij od napisania krótkiego fragmentu, który sprawdza tylko długość, potem dodaj sprawdzenie cyfry. Testuj program na kilku przykładach (np. "abc", "abcdef", "a1b2c3").
Praca z pętlami i walidacją jest ważna — w praktycznych programach często musimy upewnić się, że dane od użytkownika są poprawne, zanim zaczniemy je przetwarzać. Jeśli chcesz, mogę sprawdzić Twój szkic rozwiązania i podpowiedzieć, co ulepszyć.
Materiały pomocnicze (jeśli chcesz poczytać więcej): lekcja o pętlach w Pythonie oraz rozdział o break/continue i instrukcjach warunkowych.