erstes Python Programm

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.
masterjule
User
Beiträge: 9
Registriert: Freitag 13. November 2009, 00:07

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
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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
masterjule
User
Beiträge: 9
Registriert: Freitag 13. November 2009, 00:07

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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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
masterjule
User
Beiträge: 9
Registriert: Freitag 13. November 2009, 00:07

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?
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Nach eine Ergänzung: In den Einstellungen von gedit kannst du einstellen, dass ein Tab automatisch durch vier Leerzeichen ersetzt wird.
masterjule
User
Beiträge: 9
Registriert: Freitag 13. November 2009, 00:07

@ 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?
masterjule
User
Beiträge: 9
Registriert: Freitag 13. November 2009, 00:07

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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'
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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))
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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'
masterjule
User
Beiträge: 9
Registriert: Freitag 13. November 2009, 00:07

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?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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]`?
[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
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
masterjule
User
Beiträge: 9
Registriert: Freitag 13. November 2009, 00:07

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

jbs hat geschrieben:kennst du ein 5 Euro Stück?
Ja.
Antworten