Seite 1 von 1
None wird ausgegeben?
Verfasst: Freitag 22. Oktober 2021, 17:28
von Matteo Fragasso
import random
def code():
i = int(random.randint(1, 10))
# = True
# print(i)
question = int(input("Enter any number from 1 to 10 here: "))
while question > 10:
print(int("The entry must be from 1 to 10 and cannot be smaller or larger"))
print(code())
while question < 0:
print(int("The entry must be from 1 to 10 and cannot be smaller or larger"))
print(code())
print(i)
# print(question)
if i == question:
print("you got the right number. Congratulation!")
print("If you want to play again click on the - Run 'main' - button in the right top corner.")
while question != i:
print(code())
code()
Re: None wird ausgegeben?
Verfasst: Freitag 22. Oktober 2021, 18:34
von kbr
Ja, None wird ausgegeben.
Re: None wird ausgegeben?
Verfasst: Freitag 22. Oktober 2021, 18:39
von noisefloor
Hallo,
wenn du eine Frage zu deinem Code hast, dann solltest du diese stellen... Außerdem fehlen im Code die Einrückungen - damit kann man nicht beurteilen, ob das grundsätzlich überhaupt läuft. Code bitte in einem Codeblock posten. Den erreichst du, indem du im Editor auf die </> Schaltfläche klickst.
`print(code())` macht wenig Sinn, weil die Funktion `code()` keinen Rückgabewert hat. Bzw. den wird `None` zurück gegeben.
Gruß, noisefloor
Re: None wird ausgegeben?
Verfasst: Freitag 22. Oktober 2021, 19:01
von rogerb
Also "None" wird nicht ausgegeben
(kleiner Tipp an alle die es noch nicht wissen, bei Antwort mit Zitat, sieht man die ursprüngliche Einrückung des Autors)
@Matteo Fragasso
Mit </> - Code Tags würde das so aussehen. Ich habe deine Kommentare entfernt und dafür ein paar Anmerkungen von mir eingefügt
Code: Alles auswählen
import random
def code():
# wie der Name schon andeutet, liefert randint einen int-Wert. Die Konvertierung in int ist also nicht nötig
i = int(random.randint(1, 10))
question = int(input("Enter any number from 1 to 10 here: "))
while question > 10:
print(int("The entry must be from 1 to 10 and cannot be smaller or larger"))
# Dieser recursive Aufruf ist keine gute Idee. Statt dessen bietet sich eine while True Schleife an
print(code())
while question < 0:
# Dies ist der gleiche Text wie oben und kann zusammen gefasst werden
print(int("The entry must be from 1 to 10 and cannot be smaller or larger"))
print(code())
print(i)
if i == question:
print("you got the right number. Congratulation!")
print("If you want to play again click on the - Run 'main' - button in the right top corner.")
while question != i:
print(code())
code()
Das wäre mein Vorschlag:
Code: Alles auswählen
import random
def guessing_game():
while True:
random_number = random.randint(1, 10)
guess = int(input("Enter any number from 1 to 10 here: "))
if not 1 <= guess <= 10:
print("The entry must be from 1 to 10 and cannot be smaller or larger")
continue
print(random_number)
if random_number == guess:
print("you got the right number. Congratulation!")
print("If you want to play again,")
print("click on the - Run 'main' - button in the right top corner.")
break
guessing_game()
Re: None wird ausgegeben?
Verfasst: Freitag 22. Oktober 2021, 20:35
von Dennis89
Hallo,
ich habe schon öfters gelesen, das es für 'continue' nicht so viele sinnvolle Anwendungen geben soll. Wann es sinnvoll ist und wann nicht kann ich nicht müsste ich auch erst noch mal nach lesen.
Wie dem auch sei, ich habe hier das Beispiel von @rogerb noch umgeschrieben, so sind beide Vaianten verfügbar.
Code: Alles auswählen
import random
def guessing_game():
while True:
random_number = random.randint(1, 10)
guess = int(input("Enter any number from 1 to 10 here: "))
if 1 <= guess <= 10:
if random_number == guess:
print(
"you got the right number. Congratulation!\n"
"If you want to play again,\n"
"click on the - Run 'main' - button in the right top corner."
)
break
else:
print(f"Sorry, the right number is {random_number}")
else:
print("The entry must be from 1 to 10 and cannot be smaller or larger")
def main():
guessing_game()
if __name__ == "__main__":
main()
Grüße
Dennis
Re: None wird ausgegeben?
Verfasst: Freitag 22. Oktober 2021, 20:42
von Sirius3
@Dennis89: das `continue` in rogerb`s Code ist nicht so optimal, weil es verschleiert, dass eigentlich in einer Schleife zwei verschiedene Dinge gemacht werden. Erstens so lange eine Eingabe wiederholen, bis die Zahl zwischen 1 und 10 ist, und so lange dieses 1-10-Eingeben wiederholen, bis die Zahl gleich der gewürfelten Zahl ist.
Das macht Dein Code durch die tiefe if-else-Verschachtelung auch nicht besser.
Code: Alles auswählen
import random
def input_number():
while True:
try:
number = int(input("Enter any number from 1 to 10 here: "))
if 1 <= number <= 10:
return number
except ValueError:
pass
print("The entry must be from 1 to 10 and cannot be smaller or larger")
def guessing_game():
while True:
random_number = random.randint(1, 10)
guess = input_number()
if random_number == guess:
break
print(f"Sorry, the right number is {random_number}")
print(
"you got the right number. Congratulation!\n"
"If you want to play again,\n"
"click on the - Run 'main' - button in the right top corner."
)
if __name__ == "__main__":
guessing_game()
Re: None wird ausgegeben?
Verfasst: Freitag 22. Oktober 2021, 20:55
von Dennis89
Okay, das verstehe ich. Danke für die Erklärung.
Könntest du mir bitte noch sagen, wieso in deinem 'except'-Block ein 'pass' steht?
Ich hätte das 'pass' durch den darunter stehenden 'print'-Aufruf ersetzt. Wäre das falsch?
Grüße
Dennis
Re: None wird ausgegeben?
Verfasst: Freitag 22. Oktober 2021, 23:00
von rogerb
@Dennis89,
"continue" kann man verwenden, um die Einrücktiefe nicht zu groß werden zu lassen. Wird die Abarbeitung der Schleife durch continue abgebrochen, erspart man sich den else-Zweig.
Ich denke dein Code zeigt das auch deutlich.
Ob das jetzt gut oder schlecht ist, sei jedem selbst überlassen.
Ich bin der Meinung, dass die Verwendung von "continue" den Code oft leserlicher macht. Man darf es aber nicht übertreiben. Bei sehr langen und womöglich noch verschachtelten Verzweigungen, kann es zum Problem werden.
Ich gebe Sirus3 in sofern recht, dass meine while-Schleife zu viele verschiedene Dinge tut (also naja, - zwei). Code der in einzelne Funktionen aufgebrochen ist, lässt sich einfacher testen, denn die Kombinationen von Eingangs- und Ausgangsparametern ist dann einfacher zu bewältigen. Wenn man einen Anfänger abholen will, ist es aber manchmal besser den Ausgangscode nicht zu stark zu verändern - meine Meinung.
Abgesehen davon, ist das etwas woran ich persönlich arbeiten muss.
Ich denke an Stelle des "pass" gäbe es eine gute Gelegenheit dem User nochmal feedback zu einer falschen Eingabe zu geben:
Code: Alles auswählen
import random
def isvalid(number):
if not 1 <= number <= 10:
print("The entry must be from 1 to 10 and cannot be smaller or larger")
return False
return True
def input_number():
while True:
user_input = input("Enter any number from 1 to 10 here: ")
try:
number = int(user_input)
except ValueError:
print(f"{user_input} is not a valid input. Only numbers are allowed")
else:
if isvalid(number):
return number
def guessing_game():
while True:
random_number = random.randint(1, 10)
guess = input_number()
if random_number == guess:
break
print(f"Sorry, the right number is {random_number}")
print(
"you got the right number. Congratulation!\n"
"If you want to play again,\n"
"click on the - Run 'main' - button in the right top corner."
)
if __name__ == "__main__":
guessing_game()
Der else-Zweig nach try-except wird nur ausgeführt wenn es keine Exception gab. Dadurch wird das Exception-handling präziser, denn die if-Bedingung muss da nicht mit drin sein.
Re: None wird ausgegeben?
Verfasst: Samstag 23. Oktober 2021, 10:49
von Sirius3
Das print wird bei mir sowohl ausgeführt wenn keine Zahl eingegeben wird und auch wenn eine Zahl >10 eingegeben wird. Im except-Block gibt es daher keinen Grund etwas zu tun.
Re: None wird ausgegeben?
Verfasst: Samstag 23. Oktober 2021, 11:08
von rogerb
Klar, wenn der Benutzer aber etwas anderes als Zahlen eingibt, bekommt er so nochmal einen speziellen Hinweis. Nur eine Variante, muss man nicht machen.
Re: None wird ausgegeben?
Verfasst: Sonntag 24. Oktober 2021, 19:52
von Dennis89
Sorry für die späte Rückmeldung.
Vielen Dank für eure Erklärungen!