Newbie bittet um Hilfe

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
Julian K
User
Beiträge: 2
Registriert: Montag 5. Mai 2014, 17:07

Hallo Forum,

ich fange gerade an mich mit Python zu beschäftigen. Find meinen Fehler gerade nicht. Könnt ihr mir bitte weiterhelfen?

Code: Alles auswählen

Menu = ["Bond", "Stock", "Future", "Option"]
Preis = [1, 2, 3, 4]

Auswahl = input("Welche Assetklasse wollen sie kaufen?")

if Auswahl == Menu[0]:
    print Preis[0] 
    
if Auswahl == Menu[1]:
    print Preis[1] 
    
if Auswahl == Menu[2]:
    print Preis[2] 
    
if Auswahl == Menu[3]:
    print Preis[3] " ""Euro"
Zuletzt geändert von Hyperion am Montag 5. Mai 2014, 18:09, insgesamt 1-mal geändert.
Grund: Code in Python-Code-Tags gesetzt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

"Funktioniert nicht" ist eine äußerst ungenügende Fehlerbeschreibung. Was erwartest du als Ergebnis, was kommt heraus und was für eine Fehlermeldung, inklusive des gesamten Traceback, gibt es?

Das Forum hat übrigens Code-Tags (ein Button über dem Eingabefeld für Text), damit wird dein Code hier auch vernünftig Dargestellt.
Das Leben ist wie ein Tennisball.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Julian K
Ohne die Fehlermeldung kann man nur raten, was Dein Problem ist... Ich nehme mal an, Du verwendest Python 2, da Du das ``print`` statement und nicht die `print()` Funktion verwendest. Wenn dem so ist nehme ich weiter an, dass Du nach der Eingabe einen `NameError` bekommst. Innerhalb Python 2 gibt es neben `input()`, das alles, das Du eingibst wie eine Anweisung behandelt noch `raw_input()`, das alles, das Du eingibst als String zurückgibt. Verwende unter Python 2 in jedem Fall `raw_input()`, da ein böser Bube über `input()` Code auf Deinem Rechner ausführen kann.
Mit `raw_input()` wird Dein Programm funktionieren. Statt den vielen ``if``'s würde ich aber entweder

Code: Alles auswählen

if selection == asset[0]:
    print price[0]
elif selection == asset[1]:
    print price[1]
elif selection == asset[2]:
    print price[2]
elif selection == asset[3]:
    print price[3]
verwenden, da in diesem Fall nach einem Treffer die anderen Abfragen nicht mehr durchgeführt werden. Noch besser allerdings fände ich es, wenn Du den index nicht erst abfrägst um ihn dann wieder abzufragen, sondern gleich verwendest:

Code: Alles auswählen

assets = ['Bond', 'Stock', 'Future', 'Option']
prices = [1, 2, 3, 4]

def get_price():
    selection = raw_input('Welche Assetklasse wollen Sie kaufen? ')
    try:
        return prices[assets.index(selection)]
    except ValueError:
        return '{!r} ist nicht enthalten!'.format(selection)

Code: Alles auswählen

>>> get_price()
Welche Assetklasse wollen Sie kaufen? Bond
1
>>> get_price()
Welche Assetklasse wollen Sie kaufen? bla
'bla' ist nicht enthalten!
Aber noch besser fände ich es, wenn Du statt zweier Listen für zusammengehörende Daten eine andere Datenstruktur verwenden würdest. Wenn es nur um die Abfrage von Preisen geht, zwingt sich mir ein Dictionary auf.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich habe die Frage mal ins "richtige" Forum verschoben :-)

@Julian K: Das Showcase-Forum ist eher für fertige und gerne auch komplexere Programme gedacht; Du hast eher eine allgemeine Frage, auch wenn Du uns darin Source-Code postest. Von daher passt Dein Beitrag besser hier rein :-)

Ergänzend zu mutetella: Wenn die Optionen in dieser Reihenfolge bleiben, kann man auf die ``prices`` Liste auch gleich verzichten. Der richtige Index lässt sich ja einfach errechnen - "Auswahl - 1".

Generell sollten zusammengehörige Daten auch in *einer* Struktur vorgehalten werden.

Für die Namensgebung verweise ich mal auf PEP8; Bezeichner sollten eher klein geschrieben werden, also ``auswahl`` statt ``Auswahl`` usw.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Julian K
User
Beiträge: 2
Registriert: Montag 5. Mai 2014, 17:07

@ Eydu: Deine Kritik und Hinweise sind berechtigt. Beim nächsten Posting werde ich das alles berücksichtigen.

@ mutella: Danke für deine Lösung, konstruktiven Verbesserungsvorschläge und schnelle Antwort.

@ Hyperion: Alright. Sry, beim nächsten Mal schreibe ich in das richtige Forum. Auch dir vielen Dank für deine Hilfeleistung. Ich setzte die ganzen Vorschläge mal um. Das ist eine gute Übung für mich.

Ich habe mich jetzt nur prägnant auf eure Postings bezogen, da ich außer Hyperions keine mehr direkt vor mir sehen kann. Das liegt vermutlich daran, dass mein Thread verschoben wurde. Also bitte meine Antwort nicht als unhöflich verstehen.

Vielen Dank!
Julian
Antworten