@eli: Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Hauptrogramm und Funktionsdefinitionen auf Modulebene mischen ist maximal unübersichtlich. Das Hauptrogramm steht üblicherweise in einer Funktion die `main()` heisst.
`input_check` kann nur die Werte 0 und 1 annehmen, ist also eigentlich gar keine Zahl sondern ein Wahrheitswert. Dafür hat Python einen eigenen Typ `bool` mit den Werten `True` und `False` die man da verwenden sollte, statt Zahlen zu missbrauchen.
Letztlich braucht man `input_check` aber auch gar nicht. Idiomatisches Python ist eine ”Endlosschleife”, die dann an der passenden Stelle mit ``break`` oder ``return`` verlassen wird.
Der Inhalt eines ``try``-Blocks sollte klein gehalten werden. Wenn man auf `ValueError` beim Umwandeln testen will, sollte im ``try``-Block auch nur die Umwandlung stehen, und nicht noch weitere Tests und Code wo vielleicht auch ein `ValueError` auftreten könnte.
Namen sollten nicht kryptisch abgekürzt werden. Wenn man `number` meint, sollte man nicht nur `num` schreiben.
Man nummeriert keine Namen. Man sich da entweder bessere Namen überlegen, oder keine Einzelnamen sondern eine Datenstruktur verwenden. Oft eine Liste.
Grunddatentypen haben in Namen nichts zu suchen. Und etwas das `number` oder so ähnlich heisst, sollte keine Zeichenkette sein. Das ist verwirrend.
`print()` wandelt Argumente für die Ausgabe selbst in Zeichenketten um, das muss man nicht selbst machen.
Zwischenstand (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python3
def berechne_ggt_rekursiv(a, b):
if b == 0:
return a
else:
print("rekrusiver Aufruf mit:", a, b)
return berechne_ggt_rekursiv(b, a % b)
def main():
while True:
try:
first_number = int(input("Tell me your first number >0: "))
second_number = int(input("Tell me your second number >0: "))
except ValueError:
print("Only natural numbers allowed! Please try again!")
else:
if first_number > 0 and second_number > 0:
break
print("Only numbers >0 allowed! Please try again!")
print("Der ggT ist", berechne_ggt_rekursiv(first_number, second_number))
if __name__ == "__main__":
main()
Für die Eingabe *einer* Zahl würde man besser eine Funktion schreiben, denn das man gezwungen ist bei einer korrekten und einer falschen Eingabe, *beide* noch mal zu machen, ist nicht so nutzerfreundlich.
Was ist denn jetzt das konkrete Problem? Die Schritte werden doch ausgegeben‽