Mein erstes Programm

Code-Stücke können hier veröffentlicht werden.
Antworten
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Hier ist mein erstes Python Programm

Code: Alles auswählen

print("Hello World")
Scherz bei seite hier ist es.
Habt ihr verbesserungsvorschläge?

Code: Alles auswählen

print("Operation:")
print("1:Addition")
print("2:Subtraktion")
print("3:Multiplikation")
print("4:Division")
print("5:Integer Division")
print("6:Modulo")
print("7:Potenzieren")
nochmal="ja"
while nochmal=="ja":
    operation=int(input("Waehlen sie die entsprechende Nummer von 1-7:"))
    ersteZahl=int(input("Geben sie die erste Zahl ein:"))
    zweiteZahl=int(input("Geben sie die zweite Zahl ein:"))
    if operation==1:
        Ergebnis=ersteZahl+zweiteZahl
    elif operation==2:
        Ergebnis=ersteZahl-zweiteZahl
    elif operation==3:
        Ergebnis=ersteZahl*zweiteZahl
    elif operation==4:
        Ergebnis=ersteZahl/zweiteZahl
    elif operation==5:
        Ergebnis=ersteZahl//zweiteZahl
    elif operation==6:
        Ergebnis=ersteZahl%zweiteZahl
    else:
        Ergebnis=ersteZahl**zweiteZahl
    print("Das Ergebnis ist",Ergebnis)
    nochmal=input("Wollen sie noch eine Rechnung durchfuehren? 'ja' oder 'nein'")
    
               
                   
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Ich gehe mal davon aus dass du Python 3 nutzt, da aber i.d.R. Python 2 genutzt wird solltest du erwähnen wenn du Python 3 verwendest.
  • Schau dir PEP 8 an.
  • Gib Konstanten Namen, damit deren Bedeutung klarer wird. Das wird vor allem wichtig wenn du mehr als ein paar Zeilen hast.
  • int(input(...)) kann eine Ausnahme werfen, die solltest du behandeln.
  • `operation` kann auch etwas anderes als 1-7 sein, den Fall solltest du sinnvoll behandeln.
  • In den ganzen if Zweigen hast du überall fast identischen Code, dass solltest du durch Funktionen vermeiden
  • Die ganzen if Zweige kannst du manchmal, wie in diesem Fall, durch ein dictionary ersetzen.
BlackJack

@fail: Als zusätzlicher Hinweis: Funktionen sind auch Werte und das `operator`-Modul stellt die Funktionalität von den Operatoren als Funktionen zur Verfügung.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Blackjack: das operator-Modul macht alles viel einfacher ;-)

Code: Alles auswählen

import operator

def input_int(text, bereich=None):
    while True:
        try:
            zahl = int(input(text))
            bereich and bereich.index(zahl)  # Test ob zahl in bereich
            return zahl
        except ValueError:
            print("Falsche Eingabe!")

ORDINAL_ZAHLEN = ('erste', 'zweite', 'dritte')

def eingabe(operationen):
    print("Operation:")
    for num, op in enumerate(operationen, 1):
        print("{0}:{1[0]}".format(num, op))

    anzahl = len(operationen)
    operation = input_int("Waehlen sie die entsprechende Nummer von 1-{0}: ".format(anzahl), range(1, anzahl + 1))
    bezeichnung, funktion, argumente = operationen[operation-1]

    zahlen = [input_int("Geben sie die {0} Zahl ein: ".format(num))
              for num in ORDINAL_ZAHLEN[:argumente] ]
    return bezeichnung, funktion, zahlen

def main():
    operationen = [
        ("Addition", operator.add, 2),
        ("Subtraktion", operator.sub, 2),
        ("Multiplikation", operator.mul, 2),
        ("Division", operator.truediv, 2),
        ("Integer Division", operator.floordiv, 2),
        ("Modulo", operator.mod, 2),
        ("Potenzieren", operator.pow, 2),
        ("Negieren", operator.neg, 1),
        ("Betrag", operator.abs, 1),
        ]

    nochmal = "ja"
    while nochmal == "ja":
        _bezeichnung, funktion, zahlen = eingabe(operationen)
        ergebnis = funktion(*zahlen)
        print("Das Ergebnis ist {0}.".format(ergebnis))

        while True:
            nochmal = input("Wollen sie noch eine Rechnung durchfuehren? 'ja' oder 'nein' ")
            if nochmal in ('ja', 'nein'):
                break
            print("Falsche Eingabe!")

if __name__ == '__main__':
    main()
fichtknick
User
Beiträge: 8
Registriert: Mittwoch 20. März 2013, 22:21

noch eine kleine anregung :) bin auch neuling :)

Code: Alles auswählen

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from argparse import ArgumentParser
parser = ArgumentParser()

parser.add_argument("-o", "--operation",
                    dest="operation", default="plus")

parser.add_argument("op1", type=float)
parser.add_argument("op2", type=float)

args = parser.parse_args()

calc = {"plus" : lambda a, b: a + b,
        "minus" : lambda a, b: a - b, 
        "mal" : lambda a, b: a * b, 
        "durch" : lambda a, b: a / b,
        "hoch" : lambda a, b: a ** b}

op = args.operation
if op in calc:
	print("Ergebnis: ", calc[op](args.op1, args.op2))
else:
	parser.error("{} ist keine gültige operation".format(op))
BlackJack

@fichtknick: Im Beitrag davor hat Sirius3 ja das `operator`-Modul verwendet. Damit spart man sich das definieren der ganzen anonymen Funktionen.
Weisser
User
Beiträge: 13
Registriert: Mittwoch 24. April 2013, 16:47

Ich wurde es so machen:

Code: Alles auswählen

Aktion = input("Aufgabe:")
try:
   loesung =  eval(Aktion)
   print(loesung)
except:
    print("Fehler")
Kabelsalat ist gesund!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Weisser hat geschrieben:Ich wurde es so machen:
Damit hast du zumindest die Lösung gezeigt, wie man es auf keinen Fall machen sollte ;-) Mit eval können beliebige Python-Ausdrücke ausgeführt werden. Das ich gleichbedeutend damit, dass beliebiger Code ausgeführt werden kann. Und dieses Verhalten will man ganz sicher nicht.

Und das nackte except macht die Sache noch schlimmer. Damit wird wirklich jeder Fehler abgefangen, welcher irgendwie in dem try-Block auftritt. Das ist eine wunderbare Quelle für nichtauffindbare Fehler, weil auch zum Beispiel ein NameError nicht entdeckt wird. In Verbindung mit eval ist das natürlich besonders großartig.

Außerdem solltest du, wenn du Fehler mittels try/except behandelst, dafür sorgen, dass möglichst wenig Code im try-Block steht. Je mehr Code darin enthalten ist, desto wahrscheinlicher wird es, dass ungewollt Ausnahmen behandelt werden. Die Ausgabe der Lösung sollte also nach dem try/except-Konstrukt kommen.
Das Leben ist wie ein Tennisball.
BlackJack

@Weisser: *Dafür* bräuchtest Du kein Programm schreiben sonst kannst einfach den Python-Interpreter starten. Und hättest dabei sogar Vorteile. Zum Beispiel das den Benutzern bewusst ist, dass sie beliebige Python-Ausdrücke verwenden können — inklusive der Gefahr die sich daraus ergibt. Das sie Werte an Namen binden, und in späteren Eingaben verwenden können. Und das bei Fehlern nicht bloss "Fehler" ausgegeben wird, sondern eine in der Regel hilfreichere Meldung.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

EyDu hat geschrieben:Das ich gleichbedeutend damit, dass beliebiger Code ausgeführt werden kann.
Dieses Risiko wird im Zusammenhang mit `eval()` immer wieder genannt. Allerdings verarbeitet `eval()` doch expressions und keine statements wie es `exec()` macht. Ich hab' keine Vorstellung davon, wie man also über `eval()` Code ausführen könnte, der tatsächlich Schaden anrichtet. Kannst Du dafür mal ein Beispiel zeigen?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

eval('__import__("shutil")')
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@EyDu: das Beispiel ist nicht ganz vollständig: ;-)

Code: Alles auswählen

eval("__import__('shutil').rmtree('/')")
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das scheitert bei den meisten doch bestimmt an den Rechten. Mit einem ``ignore_errors=True`` solte sich das aber reparieren lassen ;-)
Das Leben ist wie ein Tennisball.
Antworten