Strings mit einer Variablen abrufen - oder so ähnlich

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

weil man daraus auch etwas lernen kann und weil die Lösung in eine ganz andere Richtung geht
the more they change the more they stay the same
maaax
User
Beiträge: 4
Registriert: Freitag 6. November 2009, 14:25

ice2k3 hat geschrieben:

Code: Alles auswählen

>>> a = raw_input()
5
>>> a = int(a)
>>> type(a)
<type 'int'>
Ganz kurz: ``input()`` stellt eine mögliche Sicherheitslücke dar (bei Python 2.x).
ok... jetzt hab ich es verstanden :)
dann werde ich das wohl nochmal umbauen.

Vielen Dank für eure Hilfe.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Dav1d hat geschrieben:weil man daraus auch etwas lernen kann und weil die Lösung in eine ganz andere Richtung geht
Daraus kann man nur lernen, wie man es NICHT machen sollte. Und wenn das nicht ausdrücklich und deutlich dabei steht, wird so ein Schrott auch noch von anderen aufgegriffen.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Code: Alles auswählen

print ['a', 'b', 'c'][int(raw_input()) - 1]
Stefan
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

@maaax: Wenn du nur input verwendest, kann der User gültigen Python-Code eingeben. exit() ist eine Funktion, mit der du Python beenden kannst. Wenn der User das nun schreibt, beendet sich das Programm.

Dehalb lieber raw_input. Damit würdest du dann einen String erhalten, den du auswerten kannst.

Um eine Zahl als Eingabe zu bekommen ist der Ansatz ``int(raw_input())`` der Beste, wie es sma gemacht hat.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

numerix hat geschrieben:
Dav1d hat geschrieben:weil man daraus auch etwas lernen kann und weil die Lösung in eine ganz andere Richtung geht
Daraus kann man nur lernen, wie man es NICHT machen sollte. Und wenn das nicht ausdrücklich und deutlich dabei steht, wird so ein Schrott auch noch von anderen aufgegriffen.
Kann sein, allerdings kann man z.B. lernen wie man eval() einetzten kann, wenn man dann bei raw_input() ein int drum rum macht int(raw_input()) und mit dem try...except noch nen ValueError abfängt, ist es sogar einigermasen sicher trotz eval()!
the more they change the more they stay the same
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Statt eval(raw_input()) kannst du dann gleich input nehmen...

eval ist evil und sollte peinlichst vermieden werden
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dav1d hat geschrieben:Kann sein, allerdings kann man z.B. lernen wie man eval() einetzten kann, wenn man dann bei raw_input() ein int drum rum macht int(raw_input()) und mit dem try...except noch nen ValueError abfängt, ist es sogar einigermasen sicher trotz eval()!
Wo ist da denn noch ein `eval`? Das Problem mit `eval` ist, dass es nur dann Exceptions schmeisst, wenn es _gar nichts_ (und erst dann!) mit dem uebergebenen String anfangen kann.
Bei `int(raw_input())` weiss man, dass es den `ValueError` schmeisst, wenn es keine passende String Repraesentation einer Zahl ist.
Fuer einen Anfaenger gilt wie jbs schon sagte "eval is evil", erst wenn man `eval` und den Input ganz genau kennt, kann man anfangen das anders zu sehen. Aber auch dann ist es meist die schlechteste Wahl (sofern nicht gar nichts anderes geht).
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

mit dem eval(), war ne blöde Idee!
sma hat geschrieben:

Code: Alles auswählen

print ['a', 'b', 'c'][int(raw_input()) - 1]
Stefan
Das würd ich nicht nutzen, da es zu Verwirrungen führen kann wenn man 0 eingibt und dann c ausgegeben wird
the more they change the more they stay the same
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dav1d hat geschrieben:Das würd ich nicht nutzen, da es zu Verwirrungen führen kann wenn man 0 eingibt und dann c ausgegeben wird
Dann bliebe - allerdings auch nur fuer positive zahlen:

Code: Alles auswählen

a = ['a', 'b', 'c']
a[(int(raw_input()) - 1) % len(a)]
Im Allgemeinen finde ich aber Dicts besser fuer so etwas geeignet.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dav1d hat geschrieben:... Das würd ich nicht nutzen, da es zu Verwirrungen führen kann wenn man 0 eingibt und dann c ausgegeben wird
Guter Punkt. Hatte ich gar nicht bedacht. Ich nenne das ein Feature :)

Stefan
Antworten