Seite 1 von 1

Funktion zum Einlesen eingetippter Zahlen

Verfasst: Mittwoch 12. November 2008, 01:56
von bremer

Code: Alles auswählen

def feeder():
    number = 0
    while number < 1:
        try:
            number = int(raw_input("Please type in a number: "))
        except ValueError:
            print "This is no valid number."
    return number
wert1, wert2, wert3 = feeder(), feeder(), feeder()
Sollte man das so machen?
Oder sollte eine Syntax der Art "feeder()" z.B. Objekten und Klassen vorbehalten sein?

Verfasst: Mittwoch 12. November 2008, 06:52
von str1442
Wäre möglich.

Im allgemeinen möchte man aber eher keine Zahlen über int / raw_input eingeben. Meistens übergibt man Werte mithilfe von Kommandozeilenparametern oder man holt sie sich mittels Dateien (oder ähnlichem). Für Kommandozeilenparameter siehe Optparse.

Was meinst du mit der zweiten Frage? Das ist schon richtig benannt, so, wie es ist. Außer, das der Funktionsname irgendwo nichts über die Funktion aussagt, ist es PEP8.

Im übrigem kannst du auch "while True:" benutzen und hinter numbers ein break setzen. Sollte etwas fehlschlagen, wird automatisch zum except Block gesprungen.

Verfasst: Mittwoch 12. November 2008, 07:26
von bremer
Ich fand es nur ungewöhnlich, eine Funktion ohne Argumente zu haben. Die sehe ich sonst nie.

Das mit dem Kommandozeilenparameter ist ein guter Tipp!

Verfasst: Mittwoch 12. November 2008, 08:30
von Leonidas
bremer hat geschrieben:Ich fand es nur ungewöhnlich, eine Funktion ohne Argumente zu haben. Die sehe ich sonst nie.
Wenn du Funktion nur für die Seiteneffekte da ist, dann ist das durchaus auch üblich.

Verfasst: Mittwoch 12. November 2008, 09:29
von sma
Ich würd's wohl so machen:

Code: Alles auswählen

def read_int(prompt="Please input an integer:"):
    while True:
        try:
            return int(raw_input(prompt))
        except ValueError:
            pass
Denn `feeder` ist kein guter Funktionsname, der hart verdrahtete Prompt-String scheint umgeschickt, zudem spricht er von "number", kann aber nur Ganzzahlen und keine Fließkommazahlen verarbeiten und selbst negative Zahlen gehen aufgrund der while-Schleife nicht.

Stefan

Verfasst: Mittwoch 12. November 2008, 09:54
von Leonidas
Also ``read_cardinal`` für alle Modula-2 geschädigten :)

Verfasst: Mittwoch 12. November 2008, 19:13
von yipyip
Wie wär's denn mit etwas der folgenden Art?

Code: Alles auswählen

questions = [(int, 'i', 'Enter an integer'),
             (float, 'f', 'A float here'),
             (lambda x: int(x, base=16), 'h', 'At last a hex')]


def menu(*questions):
  
  answers = {}
  
  for castfunc, key, text in questions:
    ok = None
    while not ok:
      try:
        answers[key] = castfunc(raw_input('%s -> ' % text))
        ok = True  
      except ValueError:
        continue

  return answers


print menu(*questions)
:wink:
yipyip