None wird ausgegeben?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Matteo Fragasso
User
Beiträge: 1
Registriert: Freitag 22. Oktober 2021, 17:07

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()
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Ja, None wird ausgegeben.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

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()
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

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
"When I got the music, I got a place to go" [Rancid, 1993]
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@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.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Klar, wenn der Benutzer aber etwas anderes als Zahlen eingibt, bekommt er so nochmal einen speziellen Hinweis. Nur eine Variante, muss man nicht machen.
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Sorry für die späte Rückmeldung.

Vielen Dank für eure Erklärungen!
"When I got the music, I got a place to go" [Rancid, 1993]
Antworten