[Python] Error: single quoted string

Hallo
Ich habe ein einfaches programmgeschrieben mit dem man währungen umrechnen kann
Code:
# -*- coding: cp1252 -*-


#### Datenbank und Hauptprozedur

def umrechnung(einwaehrung, kurs1, kurs2):
    'Vor: Eingaben sind vom Typ integer\
    \nEff: gibt den Wert der berechneten Waehrung wieder.'
    auswaehrung = kurs2 * einwaehrung / kurs1
    return auswaehrung

abkuerzungen = ['EUR', 'DKK', 'GBP', 'JPY', 'HRK', 'NOK',\
                'PLN', 'RUB', 'CHF', 'SEK', 'CZK', 'USD']

kurs = [1, 7.4466, 0.8957, 117.6471, 7.4216, 8.8179, 4.7780,\
        44.362, 1.4916, 10.8710, 29.1390, 1.2763]

print 'Bitte wählen sie sich die Währungen aus '
print '\
\n1 = EUR = Europa (Deutschland)\
\n2 = DKK = Dänemark\
\n3 = GBP = England\
\n4 = JPY = Japan\
\n5 = HRK = Kroatien\
\n6 = NOK = Norwegen\
\n7 = PLN = Polen\
\n8 = RUB = Russland\
\n9 = CHF = Schweiz\
\n10 = SEK = Schweden\
\n11 = CZK = Tcheschien\
\n12 = USD = USA\'

#### eingabe des kurses

print '1. Währung (die, die umgewandelt wird): ',
kurs1 = raw_input()
while 1:
    try:
        float(kurs1)
        break
    except:
        print '<<<<<<<<Falsche eingabe bitte nochmal eingeben!>>>>>>>>'
        print 'bitte gib die Währung ein: ',
        kurs1 = raw_input()
            
print '2. Währung (die, in die umgewandelt wird): ',
kurs2 = raw_input()
while 1:
    try:
    float(kurs2)
        break
    except:
        print '<<<<<<<<Falsche eingabe bitte nochmal eingeben!>>>>>>>>'
        print 'bitte gib die Währung ein: ',
        kurs2 = raw_input()

#### eingabe des Wertes

print 'Bitte nun den umzuwandelnden Betrag ein: '
einwae = raw_input
while 1:
    try:
        float(einwae)
        break
    except:
        print '<<<<<<<<Falsche eingabe bitte nochmal eingeben!>>>>>>>>'
        print 'bitte gib den Wert ein: ',
        einwae = raw_input()

#### Rechnung

kurs1.1 = kurs1 - 1
kurs1.2 = kurs[kurs1.1]

kurs2.1 = kurs2 - 1
kurs2.2 = kurs[kurs2.1]

umrechnung(einwae, kurs1.1, kurs2.1)

#### Ausgabe
abkuerzung1 = akuerzungen[kurs1.1]
abkuerzung2 = akuerzungen[kurs2.1]
print '%f %s entsprechen %f %s' %(einwae, abkuerzung1, auswae, abkuerzung2)

doch an der der Stelle
Code:
#### eingabe des kurses

print '1. Währung (die, die umgewandelt wird): ',
kurs1 = raw_input()
while 1:
    try:
        float(kurs1)
        break
    except:
        print '<<<<<<<<Falsche eingabe bitte nochmal eingeben!>>>>>>>>'
        print 'bitte gib die Währung ein: ',
        kurs1 = raw_input()
Zeigt mir python ein error an.
Warum?
 
Der Code an der genannten Stelle ist fehlerfrei. Es wäre hilfreich, wenn du den Traceback sendest.

Einiges zu deinem Code:

Deine Namensgebungen sind wirklich grausam. Versuche aussagekräftige Variablennamen anzugeben.

Deine Kommentare brauchen nur ein # und nicht 4 davon.

Die Vorbedingungen etc. in deiner Funktion werden normalerweise in Blockkommentaren dargestellt (""" bla foo bar""")

das implizite Verbinden von 2 physikalischen Zeilen zu einer logischen Zeile ist bei abkuerzungen nicht nötig.

verwende statt while 1 while True

print '2. Währung (die, in die umgewandelt wird): ',
kurs2 = raw_input()

kann man auch so schreiben: kurs2 = raw_input("2. Währung (die in die umgewandelt wird):")

//edit Fehler gefunden:

In dem String nach print 'Bitte wählen sie sich die Währungen aus'

darf nach USA kein \ mehr stehen.

//edit2 in Zeile 50 ist die Einrückung falsch und was soll kurs1.1 sein?! Das ist kein gülitger Variablenname!
 
So ich mal den Code ein wenig geändert, aber jetzt ist ein anderer Fehler aufgetreten
Code:
# -*- coding: cp1252 -*-


#### Datenbank und Hauptprozedur

def umrechnung(betrag1, kurs1, kurs2):
    'Vor: Eingaben sind vom Typ integer\
    \nEff: gibt den Wert der berechneten Betrags wieder.'
    betrag2 = (kurs2 * betrag1) / kurs1
    return betrag2

abkuerzungen = ['EUR', 'DKK', 'GBP', 'JPY', 'HRK', 'NOK',\
                'PLN', 'RUB', 'CHF', 'SEK', 'CZK', 'USD']

kursliste = [1, 7.4466, 0.8957, 117.6471, 7.4216, 8.8179, 4.7780,\
             44.362, 1.4916, 10.8710, 29.1390, 1.2763]

print 'Bitte wählen sie sich die Währungen aus '
print '\
\n0 = EUR = Europa (Deutschland)\
\n1 = DKK = Dänemark\
\n2 = GBP = England\
\n3 = JPY = Japan\
\n4 = HRK = Kroatien\
\n5 = NOK = Norwegen\
\n6 = PLN = Polen\
\n7 = RUB = Russland\
\n8 = CHF = Schweiz\
\n9 = SEK = Schweden\
\n10 = CZK = Tcheschien\
\n11 = USD = USA'

#### eingabe des kurses

kurs1 = raw_input('1. Währung (die, die umgewandelt wird): ')
while True:
    try:
        float(kurs1)
        break
    except:
        print '<<<<<<<<Falsche eingabe bitte nochmal eingeben!>>>>>>>>'
        kurs1 = raw_input('bitte gib die Währung ein: ')
            
kurs2 = raw_input('2. Währung (die, in die umgewandelt wird): ')
while True:
    try:
        float(kurs2)
        break
    except:
        print '<<<<<<<<Falsche eingabe bitte nochmal eingeben!>>>>>>>>'
        kurs2 = raw_input('bitte gib die Währung ein: ')

#### eingabe des Wertes

betrag1 = raw_input('Bitte nun den umzuwandelnden Betrag eingeben: ')
while True:
    try:
        float(betrag1)
        break
    except:
        print '<<<<<<<<Falsche eingabe bitte nochmal eingeben!>>>>>>>>'
        betrag1 = raw_input('bitte gib den Wert ein: ')

#### Rechnung

rechnungskurs = kursliste[kurs1]

rechnungskurs1 = kursliste[kurs2]

umrechnung(betrag1, rechnungskurs, rechnungskurs1)

#### Ausgabe
abkuerzung1 = akuerzungen[kurs1]
abkuerzung2 = akuerzungen[kurs2]

print '%f %s entsprechen %f %s' %(betrag1, abkuerzung1, betrag2, abkuerzung2)

Fehlermeldung:
Code:
Traceback (most recent call last):
  File "I:\Informatik\Neuer Ordner\umrechner.py", line 66, in ?
    rechnungskurs = kursliste[kurs1]
TypeError: list indices must be integers

@ Darkslide:
Dass ich kein Traceback gesendet habe lag daran, das mir keins angezeigt wurde.

Deine Kommentare brauchen nur ein # und nicht 4 davon.
Ich mache nur zur Unterteilung des Codes 4# anstatt 1#, das hilft mir besser im code zurecht zufinden.

print '2. Währung (die, in die umgewandelt wird): ', kurs2 = raw_input() kann man auch so schreiben: kurs2 = raw_input("2. Währung (die in die umgewandelt wird):")
Daran hab ich einfach nicht gedacht.

verwende statt while 1 while True
Das hatten wir im Informatik Unterricht noch nicht, aber es ist ja das gleiche.
Ich hab es trotzdem geändert.

Deine Namensgebungen sind wirklich grausam. Versuche aussagekräftige Variablennamen anzugeben.
Gut da hast du recht. ich habe sie mal ein wenig überarbeitet.

trotzdem danke


MfG Shadow94
 
Dein Input ist ein String.
Du musst also Casten.
Aber

was du in diesem Fall haben willst ist eine Woerterbuch.


Alternativ kannst du auch
jede umrechnung in eine eigene Methode Packen und dann mittels getattr()
ein message passing ausfuehren und sodie Funktion ausfuehren.
 
@ sw33tlull4by:
du musst wissen, dass das mein erstes schuljahr in Informatik ist.
Also ist dein Post, für mich, größten teils Fachchinesisch.
Könntest du es mir bitte nochmal etwas deutlicher erklären?
Danke
 
Also Casten
"2" der String
int("2") die Zahl
str(int("2")) der String


So nun zu dem Woerterbuch:
Du hast 2 Listen, welche beide was miteinander zu tun haben(Waehrungsabkuerzung,Wert)
Das schreit geradezu nach einem Woerterbuch.
Ein Woerterbuch ist eine Liste auf die du ueber Indizes Zugreisfst und nicht ueber die Stelle.

Also:
test = {"hallo":2}
die {} sind wichtig.
wenn nun
test["hallo"] eingibst bekommst du
2
zurrueck.


Und was das mit dem message passing soll:

Sagen wir du hast eine Datei test.py
in dieser stehen 2 funktionen wa und na.
wenn du
oho = getattr(test,"wa")
eingibst enthaelt oho die adresse von der Funktion wa
nun rate mal was
ruft die Funktion wa auf
mfg

sw33t
 
nein na ist nur um dir zu verdeutlichen das du genau die Funktion aufrufst nach welcher du mit getattr() in test gesucht hast.

Probiers einfach mal aus und du siehst was ich meine.
 
Schau dir mal den PEP 8 Styleguide an. ;)

@sw33tlull4by

Der Typ von kurs1 ist nicht String sondern Float. Zudem ist ein Dictonary ein eigener Datentyp und hat absolut nichts mit listen zu tun!

@Shadow
Kurs1 muss dementsprechend in den Typ Integer umgewandelt werden, denn was soll bei einer liste das 2.5 Element sein? =)

Hier mal eine etwas umgewandelte Version:

Code:
#! /usr/bin/env python
# -*- coding: UTF-8 -*-

waehrung = {"EUR" : 1.0, "DKK" : 7.4466, "GBP" : 0.8957, "JPY" : 117.6471, "HRK" : 7.4216}

def eingabe(): 
    print 'Bitte wählen sie sich die Währungen aus \n'
    print """0 = EUR = Europa (Deutschland)\n
             1 = DKK = Dänemark\n
             2 = GBP = England\n
             3 = JPY = Japan\n
             4 = HRK = Kroatien\n
          """
    
    while True:
        kurs1 = raw_input("1. Währung: ")
        kurs2 = raw_input("2. Währung: ")
        betrag = raw_input("Betrag: ")
        if (waehrung.has_key(kurs1) and waehrung.has_key(kurs2)):
            try:
                betrag = float(betrag)
                break
            except:
                print "<<<<<<<<Falscher Betrag!>>>>>>>>"
        else:
            print "<<<<<<<<<<Falsche Währung!>>>>>>>>>>>>"

    umrechnung(betrag, kurs1, kurs2) 

def umrechnung(betrag, kurs1, kurs2):
    umgerechneter_betrag = (waehrung[kurs1] * betrag) / waehrung[kurs2]
    ausgabe(betrag, umgerechneter_betrag, kurs1, kurs2)

def ausgabe(betrag, umgerechneter_betrag, kurs1, kurs2):
    print "%f %s entprechen %f %s" %(betrag, kurs1, umgerechneter_betrag, kurs2)
    raw_input()

eingabe()
 
@darkslide
Der Type von kurse1 ist ein String,
Du haettest recht wenn er
kurs1 = input()
genommen haette
raw_input() liest aber alles als einen String.

Und das ein Dictionary ein eingenstaendiger Datentyp ist ist mir schon klar.
Mir ging es halt nur darum die Funktion des Dictionaries zu vergleichen.
Besonders toll ist es wenn ein Dictionary als Schluesse fortlaufende Indizes von 0 bis n Integers hat.
Dann gibt es naehmlich beim abruf der enthaltenen Elemente keinen Unterschied.

Der Grund wiso ich hier das Dictionary eingefuegt habe ist der das es in shadows fall praktikabeler waere.

sorry fuer OT.
 
Dann schau mal in seinem 2. Quelltext in Zeile 38 :D. Ich habe dich deswegen korrigiert, weil er, wie er selber zugibt, noch ein Anfäng ist und sich daher nicht von Anfang an falsche Begriffe oder Erläuterungen einprägen soll.
 
Zurück
Oben