Seite 1 von 1

Mein erstes Programm

Verfasst: Samstag 12. Januar 2013, 10:56
von fail
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'")
    
               
                   

Re: Mein erstes Programm

Verfasst: Samstag 12. Januar 2013, 11:18
von DasIch
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.

Re: Mein erstes Programm

Verfasst: Samstag 12. Januar 2013, 12:15
von 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.

Re: Mein erstes Programm

Verfasst: Samstag 12. Januar 2013, 14:21
von Sirius3
@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()

Re: Mein erstes Programm

Verfasst: Mittwoch 20. März 2013, 22:25
von fichtknick
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))

Re: Mein erstes Programm

Verfasst: Mittwoch 20. März 2013, 22:35
von BlackJack
@fichtknick: Im Beitrag davor hat Sirius3 ja das `operator`-Modul verwendet. Damit spart man sich das definieren der ganzen anonymen Funktionen.

Re: Mein erstes Programm

Verfasst: Donnerstag 25. April 2013, 20:41
von Weisser
Ich wurde es so machen:

Code: Alles auswählen

Aktion = input("Aufgabe:")
try:
   loesung =  eval(Aktion)
   print(loesung)
except:
    print("Fehler")

Re: Mein erstes Programm

Verfasst: Donnerstag 25. April 2013, 20:56
von EyDu
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.

Re: Mein erstes Programm

Verfasst: Donnerstag 25. April 2013, 21:21
von 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.

Re: Mein erstes Programm

Verfasst: Freitag 26. April 2013, 08:32
von mutetella
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

Re: Mein erstes Programm

Verfasst: Freitag 26. April 2013, 08:38
von EyDu

Code: Alles auswählen

eval('__import__("shutil")')

Re: Mein erstes Programm

Verfasst: Freitag 26. April 2013, 08:50
von Sirius3
@EyDu: das Beispiel ist nicht ganz vollständig: ;-)

Code: Alles auswählen

eval("__import__('shutil').rmtree('/')")

Re: Mein erstes Programm

Verfasst: Freitag 26. April 2013, 09:14
von EyDu
Das scheitert bei den meisten doch bestimmt an den Rechten. Mit einem ``ignore_errors=True`` solte sich das aber reparieren lassen ;-)