@pythonowiec74: Kilka rzeczy
- Spójrz na ten przykład
>>> wybor = "t"
>>> wybor == "t" or "T"
True
>>> wybor = "n"
>>> wybor == "t" or "T"
'T'
>>> bool(wybor == "t" or "T")
True
Przypisałeś do zmiennej wybor "t" i nigdzie tego nie zmieniasz. A w dodatku ten warunek jest błędny. Prawidłowy warunek powinien wyglądać:
while wybor in ["t", "T"]:
a następnie w pętli powinieneś zrobić coś w stylu:
wybor = input("Grasz dalej t/n : ")
- Robiąc coś takiego
while wybor == 't' or 'T' :
def dodawanie(liczba1,liczba2):
return liczba1 + liczba2
...
za każdą iteracją pętli przedefiniowujesz swoje funkcje. Zamiast tego możesz je wyciągnąć na zewnątrz. Np. tak:
def dodawanie(liczba1,liczba2):
return liczba1 + liczba2
...
while wybor == 't' or 'T' :
liczba1 = gra('liczbę pierwszą: ')
liczba2 = gra('liczbę drugą: ')
...
- Spróbuj sobie opakować wszystko w funkcję. Spróbuj czegoś takiego:
def gra(gracze):
...
def wybory_menu():
...
def czy_liczysz_dalej():
...
def dodawanie(...):
...
def odejmowanie(...):
...
...
def main():
while ...
...
main()
(zepsuło mi wcięcia w tym snippecie, nie wiem jak to naprawić, próbowałem na kilka sposobów, tym na górze też zepsuło)
Spróbuj zrobić tak, żebyś miał cały swój kod do uruchomienia w funkcji main()
. Ostatnią linijką w programie daj wywołanie tej funkcji.
-
Dalej używasz break
. Używasz też exit
, które jest czymś podobnym.
-
Dlaczego break, continue są złe?
Przede wszystkim chodzi o to, że kod assemblerowy, imperatywny wygląda mniej więcej tak, źródło - https://ww2.ii.uj.edu.pl/~kapela/pn/print-lecture-and-sources.php
cmp eax, ebx
jle else_
mov ecx, ebx
jmp koniec
else_: mov ecx, eax
sub ecx, ebx
koniec:
W pierwszej linijce robisz jakieś porównanie, później w zależności od wyniku skaczesz pod etykietę else_
. Następnie jest jakaś linijka z przenoszeniem danych z jednego rejestru do drugiego, później znowu jakiś skok. Najlepsze jest to, że te skoki mogą być w miejsca, które są kompletnie z czapy. Jeżeli napiszesz kiedyś program w asemblerze dłuższy niż 1000 linijek to zrozumiesz, że trzeba się nieźle nagłowić, żeby to ładnie napisać.
Powyższy kod w pythonie wygląda tak:
if first_var == second_var:
do_sth()
else:
do_sth_else()
W programowaniu obiektowym definiujesz sobie jakieś funkcje, obiekty, modyfikatory dostępu i nie możesz sobie już skakać gdzie chcesz. Odpalasz jakieś funkcje, które masz w swoim zasięgu, dzięki temu kod jest czytelniejszy i łatwiejszy w utrzymaniu bo nie możesz już sobie skakać gdzie chcesz. Łatwiej szuka się błędów. Od czasu asemblera wyewoluowaliśmy jako gatunek ludzki, powstała amfetamina, samoloty i programowanie funkcyjne oraz obiektowe, ale co z tego skoro ludzie w językach wysokiego poziomu, który kładzie nacisk na czytelność kodu piszą jak w asemblerze?