von stdin lesen

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
Frank
User
Beiträge: 6
Registriert: Freitag 23. Juni 2006, 11:45

Hi,

eigentlich hätte ich gestern Abend ins Bett sollen. Allerdings mußte ich mich zu später Stunde entschließen nun doch mal ein wenig Python zu schnuppern. Nu bin ich mit Kaffee vollgepumpt ;) und hab eine kleine Sorge:

Ist es ratsam, Integer die von stdin kommen generell als String zu lesen und zu casten? Ein foo = int (raw_input ('Insert :')) läßt sich prima durch faule Eingaben abschießen. Oder hab ich nur nicht die richtige Funktion gefunden?


Gruß, Frank
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Frank hat geschrieben:läßt sich prima durch faule Eingaben abschießen.
Hi Frank!

So nicht :-) :

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

def eingabe():
    prompt = "Bitte geben Sie eine Ganzzahl ein (0 beendet das Programm): "
    retval = raw_input(prompt)
    try:
        return int(retval)
    except:
        return eingabe()
    
def main():
    while True:
        intval = eingabe()
        if intval == 0:
            break
        else:
            print "Ergebnis: %s" % (intval * intval)
            print
    
if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Wenn du dir sicher sein kannst, das ein Integer kommt,
kannst auch auch input() statt raw_input() verwenden.
um aus dem wiki zu zitieren:

raw_input gibt immer den unverarbeiteten Eingabestring (Typ: str) zurück
input hingegen wertet den String vor der Rückgabe aus
Der Rückgabewert ist daher nicht unbedingt vom Typ str

Code: Alles auswählen

>>> import types
>>> eingabe = raw_input("Eingabe: ")
Eingabe: 100
>>> types.TypeType(eingabe)
<type 'str'>
>>> eingabe = input("Eingabe: ")
Eingabe: 100
>>> types.TypeType(eingabe)
<type 'int'>
*edit* Nochmal kurz als Warnung möchte ich auf den Artikel bei
Wikipedia verlinken. Input() ist nicht immer ratsam:
http://de.wikibooks.org/wiki/Python-Pro ... Datentypen
relativ weit unten ist raw_input und input erklärt
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Frank
User
Beiträge: 6
Registriert: Freitag 23. Juni 2006, 11:45

@Gerold

Ah, die try/except-Geschichte hab ich gesucht. Vielen Dank!


@pr0stAta
pr0stAta hat geschrieben:Wenn du dir sicher sein kannst, das ein Integer kommt...
Indianisches IT-Sprichwort: Nur geprüfte Daten sind gute Daten. :)


Gruß, Frank
pr0stAta
User
Beiträge: 271
Registriert: Freitag 17. September 2004, 11:49
Wohnort: Bremen

Indianisches IT-Sprichwort: Nur geprüfte Daten sind gute Daten.
hehe das stimmt, daher ist der weg von gerold definitv der bessere. safety first ;) man sollte sich input auch gar nicht erst angewöhnen, aber wenn man nur kleine programme für sich selber schreibt, dürfte es meist
auch ausreichen :>
Antworten