Funktion zum Einlesen eingetippter Zahlen

Code-Stücke können hier veröffentlicht werden.
Antworten
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Mittwoch 12. November 2008, 01:56

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?
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Mittwoch 12. November 2008, 06:52

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.
bremer
User
Beiträge: 109
Registriert: Sonntag 25. Mai 2008, 00:13

Mittwoch 12. November 2008, 07:26

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!
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 12. November 2008, 08:30

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 12. November 2008, 09:29

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
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 12. November 2008, 09:54

Also ``read_cardinal`` für alle Modula-2 geschädigten :)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

Mittwoch 12. November 2008, 19:13

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
Antworten