Uczę się obsługi pythona. Szukam sobie jakiś problemów i staram się je zapisać. Stworzyłem jeden z pierwszych programów w którym podaje się imię oraz wiek i program ma za zadanie się przywitać, a także powiedzieć ile to czasu upłynęło od lub upłynie do 18stych urodzin.
Program jest prosty. Problem mam z inną sytuacją. Chciałbym żeby:
1) jak ktoś poda źle imię, czyli będą w nim liczby/znaki specjalne to żeby wyskoczył komunikat np. "Błędnie wpisane imię" i aby ponownie wyświetliła się opcja z wpisaniem imienia
2) to samo dotyczy wieku, program crashuje mi za każdym razem jak wpiszę literę, a chciałbym komunikat, że "Błędny wiek, podaj ponownie"
3) to samo przy ponownym uruchomieniu programu, jest opcja "tak" i "nie", a przy wpisaniu czegokolwiek innego miałby się pojawić komunikat, że "Proszę wpisać tak lub nie"
Pomożecie? Poniżej kod z programem, który napisałem:
spoiler start
#program in function
def program():
#welcome
print("Witaj w programie!")
#name
name = input("Podaj swoje imię:\n")
print("Witaj", name)
#age
age = int(input("Ile masz lat?\n"))
if age == 18:
print("Gratuluję. Jesteś pełnoletni!")
elif age >= 18:
print("Jesteś pełnoletni od",age-18,"lat")
else:
print("Skończysz 18 lat za",18-age,"lat")
#repeat
def repeat():
repeat = input ("Spróbować ponownie? tak/nie\n").lower()
if repeat == "tak":
program()
elif repeat == "nie":
print("KONIEC")
exit
else:
print("Wpisz tak lub nie!")
repeat()
program()
spoiler stop
Problem crashowania możesz rozwiązać na dwa sposoby :
- Sprawdzić pobraną wartość inputa przez usera zanim będziesz ją próbował parsować do np. inta i wtedy reagować w zależności od tego co wpisał
- Wprowadzić w kodzie tzw. obsługę błędów. Nie wiem jak w pythonie bo w nim pisałem dawno temu, ale większość języków ma tzw. bloki try-catch.
Funkcje sprawdzające najlepiej umieść gdzieś oddzielnie w programie (takie pisanie linijka po linijce bez funkcji i rozdzielenia programu to zła praktyka).
Jest oczywiscie try:except, a typ danych chyba najlepiej bedzie sprawdzic assertami.
PATORIKU, błędów tu strasznych nie ma i programik jest napisany w miarę poprawnie, tylko gdzieś spierniczyłeś indentację i w jednym miejscu kolejność jest trochę chyba na opak.
U mnie, jak wklejam to, co podałeś, to wszystko działa i nie pozwala na wpisanie nic, poza tak lub nie, ALE zmień kolejność tak, żeby na końcu wywoływał się najpierw program(), a później repeat(), bo inaczej jest bez sensu.
P.S. A jeśli chodzi o wiek, to program crashuje Ci się dlatego, że używasz age = int(input("ile masz lat?\n") bez żadnego warunku, co do dozwolonych znaków. Wystarczy, że dodasz jakiś warunek, by sprawdzał typ zmiennej i na tej podstawie podejmował decyzję.
Z indentami jest w porzadku, twoj przyklad spowoduje jedynie ze:
1. zostanie wywolany "program"
2. nastepnie zostanie wywolany "repeat"
3. OPCJONALNIE raz jeszcze "program" i koniec.
On ma cos w rodzaju ukrytej petli - "program" wywoluje na koncu "repeat" ktora to opcjonalnie wywoluje "program". nie lubie takich konstrukcji, ale powinna dzialac.
I juak wspomnialem wyzej bardzo widac tu brak jakiejkolwiek kontroli bledow. Rzutowanie na inta wsadzic w "try", w "except" wywolac komunikat o blednie wprowadzonych danych i ponowic.
uzywaj try: except: do obslugi ewentualnych bledow (jak wlasnie wspomniany age)
po pierwsze jest "pythonic" po drugie mozesz rozbudowac obsluge.
8==>
Masz, jak wujek siara nauczy kodu to nie ma uja we wsi. Wiekszosc wspolczensych enginow hula na kodzie odemnie.