Funktion soll Eingaben prüfen – zu lang?

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
Benutzeravatar
Strawk
User
Beiträge: 227
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

Hallo Nutzer und Profis!

Eine Funktion soll zwei Eingaben entgegennehmen und überprüfen. Eingabe 1 soll ein Integer größer/gleich 100 und kleiner/gleich 1 Mio sein. Eingabe 2 soll ein Integer größer/gleich 1 und kleiner/gleich 1000 sein. Bei einer Falscheingabe soll der User erfahren, was falsch war, nicht nur dass etwas falsch war.

Habe den leisen Verdacht, dass ich das viel zu kompliziert und zu lange gelöst habe. Bitte einen heißen Tipp! Danke.

Grüße
Strawk

Code: Alles auswählen

def get_and_check_inputs():
    # gets and checks inputs for integer and correct range:
    # userDesiredUpperBoundary between 100 and 1m
    # userDesiredPasses between 1 and 1000
    inputUserDesiredUpperBoundary = False
    while inputUserDesiredUpperBoundary == False:
        try:
            userDesiredUpperBoundary = int(input('Choose an upper limit of guessing range. Min.: 100, Max: 1m, must be integer: '))
            rule = userDesiredUpperBoundary <= 1000000 and userDesiredUpperBoundary >= 100
            if rule:
                inputUserDesiredUpperBoundary = True
            else:
                print('Out of allowed range. Try again.')
                inputUserDesiredUpperBoundary = False
        except ValueError:
            print('Not an integer. Try again.')
            inputUserDesiredUpperBoundary = False
    
    inputUserDesiredNumberOfPasses = False
    while inputUserDesiredNumberOfPasses == False:
        try:
            userDesiredPasses = int(input('Choose number of passes. Min.: 1, Max: 1000, must be integer: '))
            rule = userDesiredPasses <= 1000 and userDesiredPasses >= 1
            if rule:
                inputUserDesiredNumberOfPasses = True
            else:
                print('Out of allowed range. Try again.')
                inputUserDesiredNumberOfPasses = False
        except ValueError:
            print('Not an integer. Try again.')
            inputUserDesiredNumberOfPasses = False
    
    return userDesiredUpperBoundary, userDesiredPasses
Ich programmiere erfolglos, also bin ich nicht.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Ich würde der Funktion die Unter- und Obergrenze der Werte übergeben, sonst musst du zwei Schleifen programmieren, die im Grunde genommen das gleiche tun. Sowas spricht gegen "don't repeart yourself.", man sollte Code wartbar machen, außerdem wird er so übersichtlich und einfacher verständlich.

Ein Vorschlag (ungetestet):

Code: Alles auswählen

def get_user_input(lower_limit, upper_limit):
    while True:
        try:
            user_input = int(
                input("Integer number between at least {} and {}: ".format(
                    lower_limit, upper_limit))
            )

            if user_input < lower_limit or user_input > upper_limit:
                print("Number '{}' is out of allowed range ({} - {})"
                      .format(user_input, lower_limit, upper_limit)
                      )
            else:
                return user_input
        except ValueError:
            print("Input must be an integer (range {} - {})".format(
                lower_limit, upper_limit))


input1 = get_user_input(100, 1000000)
input2 = get_user_input(10, 1000)
Ein einfaches while True: reicht, da die Schleife automatisch verlassen wird, sobald die Bedingung der gültigen Eingabe zutrifft und das return() zieht.
When we say computer, we mean the electronic computer.
Benutzeravatar
Strawk
User
Beiträge: 227
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

Hallo!

Das funzt ganz prima!

Grüße
Strawk
:)
Ich programmiere erfolglos, also bin ich nicht.
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@sls: der try-Block ist noch zu groß, weil man nur bei `int` einen ValueError erwartet. Durch umdrehen der if-Bedingung, wird die Logik noch klarer:

Code: Alles auswählen

def get_user_input(lower_limit, upper_limit):
    while True:
        try:
            user_input = int(
                input("Integer number between at least {} and {}: ".format(
                    lower_limit, upper_limit))
            )
        except ValueError:
            print("Input must be an integer (range {} - {})".format(
                lower_limit, upper_limit))
        else:
            if lower_limit <= user_input <= upper_limit:
                return user_input
            print("Number '{}' is out of allowed range ({} - {})"
                  .format(user_input, lower_limit, upper_limit)
                  )
Benutzeravatar
Strawk
User
Beiträge: 227
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

Hallo Sirius3,

ist in der Tat noch ne Ecke besser. Hab's getestet. Danke auch.

Strawk
Ich programmiere erfolglos, also bin ich nicht.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@Sirius3: ich weiß schon, warum ich in diesem Forum schreibe. Wieder was gelernt, danke :-)
When we say computer, we mean the electronic computer.
Antworten