Seite 1 von 2

erstes Python Programm

Verfasst: Donnerstag 11. März 2010, 11:47
von masterjule
Hey Leute,

Habe jetzt mal mein erstes Programm geschrieben und würde mich über Verbesserungsvorschläge sehr freuen.

Code: Alles auswählen

import gzfunc

option = None
fehler = False
ergebnis = 0

print('Der Geldzähler')

while True:

    print("""
            Bitte wählen Sie eine Option.
            1 ->  1 Cent
            2 ->  2 Cent
            3 ->  5 Cent
            4 -> 10 Cent
            5 -> 20 Cent
            6 -> 50 Cent
            7 ->  1 Euro
            8 ->  2 Euro
 
            0 -> Ergebnis berechnen
        """)
    option = int(input('Bitte Eingeben: '))
    
    while option != 0:
    
        anzahl = int(input('Bitte geben Sie jetzt die Anzahl der Münzen ein: '))

        if option == 1:
            ergebnis += gzfunc.ein_cent(anzahl)
        elif option == 2:
            ergebnis += gzfunc.zwei_cent(anzahl)
        elif option == 3:
            ergebnis += gzfunc.fuenf_cent(anzahl)
        elif option == 4:
            ergebnis += gzfunc.zehn_cent(anzahl)
        elif option == 5:
            ergebnis += gzfunc.zwanzig_cent(anzahl)
        elif option == 6:
            ergebnis += gzfunc.fuenfzig_cent(anzahl)
        elif option == 7:
            ergebnis += gzfunc.ein_euro(anzahl)
        elif option == 8:
            ergebnis += gzfunc.zwei_euro(anzahl)
        else:
            fehler = True

        break

    if option == 0:
        break

print('Ihr Ergebnis: ', ergebnis)

Code: Alles auswählen

def ein_cent(n):
    wert = n / 100

    return wert


def zwei_cent(n):
    wert = n * 2 / 100

    return wert


def fuenf_cent(n):
    wert = n * 5 /100

    return wert


def zehn_cent(n):
    wert = n * 10 / 100

    return wert


def zwanzig_cent(n):
    wert = n * 20 / 100

    return wert


def fuenfzig_cent(n):
    wert = n * 50 / 100

    return wert


def ein_euro(n):
    wert = n

    return wert


def zwei_euro(n):
    wert = n * 2

    return wert
So, das wäre dann mal mein Programm. Ist noch niocht ganz fertig, z.B. kommt noch ein Teil, der Eingabe Fehler behandelt.
Bin mal gespannt, was ihr dazu meint.

MfG Julian

Verfasst: Donnerstag 11. März 2010, 11:57
von BlackJack
@masterjule: Reichlich unnötig kompliziert IMHO. Die ganzen Funktionen sind doch im Grunde immer das selbe: Multiplikation mit einer zum Betrag passenden Konstanten. Da könnte man viel einfacher die Konstanten in eine Liste packen und über die Eingabe der Ziffern auf das entsprechende Element zugreifen. Damit fallen die ganzen Funktionen und die vielen ``elif``\s weg.

Verfasst: Donnerstag 11. März 2010, 12:01
von cofi
Willkommen im Forum und in Python!

Du solltest aber gemerkt haben, dass deine ganzen `gzfunc`-Funktionen dasselbe tun und sich nur in dem "Wert" unterscheiden.
Das kann man sehr elegant als Dictionary ausdruecken:

Code: Alles auswählen

values = { "1" : 0.01,
                    "2" : 0.02,
                    "3" : 0.05,
                    "4" : 0.1,
                    "5" : 0.2,
                    "6" : 0.5,
                    "7" : 1,
                    "8" : 2}
und so einbinden (die `option` muss auch nicht unnoetigerweise zu einer Zahl geaendert werden):

Code: Alles auswählen

try:
    ergebnis += values[option] * anzahl
except KeyError as e:
    fehler = True
die 0 musst du natuerlich extra behandeln. Die innere `while`-Schleife ist ueberfluessig, da du sie sowieso gleich beendest.

Verfasst: Donnerstag 11. März 2010, 12:19
von masterjule
Danke für die Antworten.

Hm, stimmt, das geht wirklich viel einfach. Ist mir erst garnicht aufgefallen :D

Ich werde mal probieren das umzusetzen.
Hab gestern erst mit Python angefangen. So vor einem Jahr hatte ich mir mal Java angeschaut, aber nur die Grundlagen. Und noch ein paatr Jahre davor C++.
Ich hoffe jetzt in Python die richtge Sprache für mich gefunden zu haben.

MfG Julian

PS.: Welchen Editor würdet ihr denn einem Anfänger empfehlen? Benutze im mom gedit.

Verfasst: Donnerstag 11. März 2010, 12:26
von gkuhl
masterjule hat geschrieben:Welchen Editor würdet ihr denn einem Anfänger empfehlen? Benutze im mom gedit.
gedit benutze ich auch und ist für den Anfang völlig ausreichend. Für mehr schau mal ins Wiki: http://wiki.python-forum.de/Tags/Editoren

Grüße
Gerrit

Verfasst: Donnerstag 11. März 2010, 12:49
von masterjule
ich werde jetzt auch erstmal weiter gedit benutzen.
macht es eigentlich einen unterschied, ob ich Leerzeichen oder Tabs benutze?

@ cofi:
was hat es denn mit dem
as e
bei
except KeyError as e:
auf sich?

Verfasst: Donnerstag 11. März 2010, 12:54
von mkesper
masterjule hat geschrieben:macht es eigentlich einen unterschied, ob ich Leerzeichen oder Tabs benutze?
Ja. Tabs sind böse. Du solltest immer Leerzeichen verwenden, auf keinen Fall aber mischen!

Verfasst: Donnerstag 11. März 2010, 12:55
von cofi
In dem Fall koenntest du es weglassen, aber es ist dazu da auf die abgefangene Exception zuzugreifen: http://tutorial.pocoo.org/errors.html#a ... -behandeln

Einen Unterschied macht es nicht. Wenn du beides aber mischst, wird es dir ganz boese um die Ohren fliegen.

Nach PEP-8 sind 4 Leerzeichen zu bevorzugen. Daran sollte man sich auch halten.

Verfasst: Donnerstag 11. März 2010, 13:10
von gkuhl
Nach eine Ergänzung: In den Einstellungen von gedit kannst du einstellen, dass ein Tab automatisch durch vier Leerzeichen ersetzt wird.

Verfasst: Donnerstag 11. März 2010, 14:13
von masterjule
@ cofi: okay, danke

@ gkuhl: super, danke. das macht die sache ja einfach^^

Edit:
Wie kann man denn den augegebenen Text am einfachsten formatieren?

Und zwischen ' und " gibt es doch keinen Unterschied, oder?
Welches davon sollte man denn normal benutzen?

Verfasst: Freitag 12. März 2010, 08:59
von masterjule
So, hier ist dann mal die überarbeitete Version.

Code: Alles auswählen

# Der Geldzähler

values = { '1' : 0.01,
           '2' : 0.02,
           '3' : 0.05,
           '4' : 0.1,
           '5' : 0.2,
           '6' : 0.5,
           '7' : 1,
           '8' : 2,
           '9' : 5,
           '10' : 10,
           '11' : 20,
           '12' : 50,
           '13' : 100,
           '14' : 200,
           '15' : 500} 
bug = False
result = 0
option_list_note = ['9', '10', '11', '12', '13', '14', '15']

print('\n', '               ', 'Der Geldzähler')

while True:
    coin = 'Münzen'
    
    print("""
            Bitte wählen Sie eine Option.
            
            Münzen:
            1 ->   1 Cent
            2 ->   2 Cent
            3 ->   5 Cent
            4 ->  10 Cent
            5 ->  20 Cent
            6 ->  50 Cent
            7 ->   1 Euro
            8 ->   2 Euro
            
            Scheine:
            9 ->   5 Euro
           10 ->  10 Euro
           11 ->  20 Euro
           12 ->  50 Euro
           13 -> 100 Euro
           14 -> 200 EUro
           15 -> 500 Euro
            
            0 -> Ergebnis berechnen
          """)
    option = input('Bitte Optionsnummer Eingeben: ')
    
    if option == '0':
        break

    for i in range(len(option_list_note)):
        if option == option_list_note[i]:
            coin = 'Scheine'
    
    print('Bitte zählen Sie jetzt ihre ', coin, ' und geben Sie dann die Anzahl ein.')
    number = int(input('Eingabe: '))
    
    try:
        result += values[option] * number
    except KeyError:
        bug = True
        break


if bug == False:
    print('Sie haben ', result, '€')
else:
    print('Fehler bei der Optionsauswahl.\n\
Programm bitte Neustarten!')
MfG Julian

Verfasst: Freitag 12. März 2010, 10:16
von Hyperion
Ein kleines Beispiel für sehr unpythonischen Code:

Code: Alles auswählen

for i in range(len(option_list_note)):
    if option == option_list_note[i]:
        coin = 'Scheine' 
Du kannst in Python doch direkt über Listeneinträge iterieren; also besser so:

Code: Alles auswählen

for item in option_list_note:
    if item == option:
        coin = 'Scheine'

Verfasst: Freitag 12. März 2010, 11:17
von Leonidas
Und dieses ``bug``-Flag finde ich auch eher ungelungen. Da würde man eher die Fehlerbehandlung sofort nach dem Auftreten des Fehlers ausführen und mit den Exceptions arbeiten statt einen binären Wert vorzuhalten ob ein Fehler oder nicht passiert ist.

Verfasst: Freitag 12. März 2010, 11:17
von cofi
Bleibt aber noch das Problem, dass die Herangehensweise unguenstig ist.

In dem Fall macht es mehr Sinn die Zahl als Schluessel fuer die Werte zu nehmen (statt der Strings) und die Zahl zu vergleichen, statt die Scheinoptionen nochmal extra zu speichern und dann ueber sie zu iterieren.

Alternativ kann man auch direkt den Wert holen und vergleichen ob der Wert groesser ist, als fuer Muenzen moeglich.

`coin` ist natuerlich auch ein schlechter Name fuer einen String der "Scheine" oder "Münzen" enthaelt.

Code: Alles auswählen

if option == "0":
    break

value = values[option]
if value > 2:
    mode_description = "Scheine"
else:
    mode_description = "Münzen"
Die "Fehlerbehandlung" laesst sich auch schoener machen (daneben sollte man nie boolsche Werte vergleichen, denn es kommen auch wieder boolsche Werte raus):

Code: Alles auswählen

if bug:
    print("""Fehler bei der Optionsauswahl.
Programm bitte Neustarten!""")
else:
    print("Sie haben {0}€".format(result))

Verfasst: Freitag 12. März 2010, 11:54
von hendrikS
Hyperion hat geschrieben:Ein kleines Beispiel für sehr unpythonischen Code:

Code: Alles auswählen

for i in range(len(option_list_note)):
    if option == option_list_note[i]:
        coin = 'Scheine' 
noch pythonischer:

Code: Alles auswählen

if option in option_list_note:
    coin = 'Scheine'

Verfasst: Freitag 12. März 2010, 12:09
von masterjule
Danke für eure geduldige Hilfe.

Code: Alles auswählen

# Der Geldzähler

values = { 1 : 0.01,
           2 : 0.02,
           3 : 0.05,
           4 : 0.1,
           5 : 0.2,
           6 : 0.5,
           7 : 1,
           8 : 2,
           9 : 5,
           10 : 10,
           11 : 20,
           12 : 50,
           13 : 100,
           14 : 200,
           15 : 500} 
result = 0
bug = False

print('\n', '               ', 'Der Geldzähler')

while True:
    
    print("""
            Bitte wählen Sie eine Option.
            
            Münzen:
            1 ->   1 Cent
            2 ->   2 Cent
            3 ->   5 Cent
            4 ->  10 Cent
            5 ->  20 Cent
            6 ->  50 Cent
            7 ->   1 Euro
            8 ->   2 Euro
            
            Scheine:
            9 ->   5 Euro
           10 ->  10 Euro
           11 ->  20 Euro
           12 ->  50 Euro
           13 -> 100 Euro
           14 -> 200 EUro
           15 -> 500 Euro
            
            0 -> Ergebnis berechnen
          """)
    option = int(input('Bitte Optionsnummer Eingeben: '))
    
    if option == 0:
        break

    value = values[option]
    if value > 2:
        mode_description = 'Scheine'
    else:
        mode_description = 'Münzen'
    
    print('Bitte zählen Sie jetzt ihre ', mode_description, ' und geben Sie dann die Anzahl ein.')
    number = int(input('Eingabe: '))
    
    try:
        result += values[option] * number
    except KeyError:
        bug = True
        break


if bug:
    print('Fehler bei der Optionsauswahl.\n\
Programm bitte Neustarten!')
else:
    print('Sie haben {0}€'.format(result))

Edit:
cofi hat geschrieben:

Code: Alles auswählen

if option == "0":
    break

value = values[option]
if value > 2:
    mode_description = "Scheine"
else:
    mode_description = "Münzen"
Warum ist da bei

Code: Alles auswählen

if value > 2
die 2?

Verfasst: Freitag 12. März 2010, 12:58
von jbs
kennst du ein 5 Euro Stück?

Edit:
Warum eigentlich ein Dictionary und keine Liste und warum nutzt du nicht weiter `value` anstatt `values[option]`?

Verfasst: Freitag 12. März 2010, 13:09
von hendrikS
jbs hat geschrieben:kennst du ein 5 Euro Stück?
Ehrlich gesagt ist es doch eigentlich egal, ob es sich bei den Werten um Scheine oder Münzen handelt. Am Ende kommt so oder so eine Summe raus.

Verfasst: Freitag 12. März 2010, 15:24
von masterjule
jbs hat geschrieben:kennst du ein 5 Euro Stück?

Edit:
Warum eigentlich ein Dictionary und keine Liste und warum nutzt du nicht weiter `value` anstatt `values[option]`?
Wie kommst du auf ein 5 Euro Stück?
Und das mit dem 'value' und 'values[option]' ist mir noch garnicht aufgefallen.. werde es ändern.

Verfasst: Freitag 12. März 2010, 16:04
von numerix
jbs hat geschrieben:kennst du ein 5 Euro Stück?
Ja.