An die mit Python Erfahrung, was kann ich tun, um meinen Code zu verkürzen?
Hallo, allerseits!
Ich habe einen "minitaschenrechner" gebaut ( Er kann zwei Zahlen aufnehmen und die Grundrechenarten damit durchführen, außerdem kann er die erste Zahl hoch die Zweite Zahl nehmen)
Ich möchte euch fragen, ob dieser Code effizient ist, oder ob man da noch was kürzen könnte
BIld ist dabei
Lg
3 Antworten
Hallo.
Wieso führst du alle Berechnungen aus ohne Bezug zur Operation zu nehmen? Sinnvoller wäre doch einfach:
number_1=int(input("Bitte erste Zahl eingeben: "))
number_2=int(input("Bitte zweite Zahl eingeben: "))
art=input("Bitte Rechenoperation wählen: ")
if art=="*":
print(f"Das Ergebnis ist {number_1*number_2}")
elif art=="/":
if number_2==0:
print("Eine Division durch 0 ist nicht erlaubt!")
else:
print(f"Das Ergebnis ist {number_1/number_2}")
elif art=="+":
print(f"Das Ergebnis ist {number_1+number_2}")
elif art=="-":
print(f"Das Ergebnis ist {number_1-number_2}")
elif art=="^^":
print(f"Das Ergebnis ist {pow(number_1,number_2)}")
Auch könntest du die print-Methode noch auslagern und eine falsche Operation abfangen:
def ergebnisAusgabe(erg):
print(f"Das Ergebnis ist {erg}")
number_1=int(input("Bitte erste Zahl eingeben: "))
number_2=int(input("Bitte zweite Zahl eingeben: "))
art=input("Bitte Rechenoperation wählen: ")
if art=="*":
ergebnisAusgabe(number_1*number_2)
elif art=="/":
if number_2==0:
print("Eine Division durch 0 ist nicht erlaubt!")
else:
ergebnisAusgabe(number_1/number_2)
elif art=="+":
ergebnisAusgabe(number_1+number_2)
elif art=="-":
ergebnisAusgabe(number_1-number_2)
elif art=="^^":
ergebnisAusgabe(pow(number_1,number_2))
else:
print("Es gehen nur +, -, *, / und ^^")
Ansonsten gibt es noch die eval() Methode, aber die birgt so einige Sicherheitsrisiken, für Anfänger also ungeeignet!
LG
Du erstellst damit eine eigene Methode. Wenn du so willst eine Auslagerung des Codes. Das lohnt sich zum einen für den Überblick, zum anderen spart man sich damit Schreibarbeit, wenn es immer etwas wiederkehrendes ist.
In dem Fall habe ich den Teil:
print(f"Das Ergebnis ist ...")
in eine Methode ausgelagert und übergebe stattdessen nur die Zahl die ausgegeben werden soll.
def steht hierbei für define, also "definiere". Dahinter der Name der Methode, in meinem Fall ergebnisAusgabe. Du könntest den Namen auch kürzer wählen um Schreibarbeit zu sparen.
Eine weitere Möglichkeit das umzusetzen ist wie folgt:
def getf(op):
ops={'+': lambda x,y:x+y , '-' lambda x,y:x-y,
....}
if op not in ops:
raise .... # unbekannte Operation
return ops[op]
def calc(op,x,y,):
#ggf. Checks für Operanden einfügen.
return getf(op)(x,y)
z1=int(input('Erste Ganzzahl eingeben:'))
z2=int(input('Zweite Ganzzahl eingeben:'))
op=input('Bitte Operation einmgeben:')
printf(f'Ergebnis: {calc(z1,z2,op}')
Würde man das dict mit den Lambdas in den globalen Kontext holen, dann könnte man aus den Keys die Operatorliste für die Eingabeaufforderung einfach generieren, anstatt das als fixen String zu machen:
op=input(f'Bitte Operation wählen ({','.join(ops.keys()}):')
Ob das Funktionen sind, die ein absoluter Anfänger in Programmierung verstehen kann?
Verkürzen eher nicht, aber von der Architektur besser machen und da gibt es je nach Paradigma verschiedene Ansätze. Großen Respekt, dass du das so lernst :)
Anbei ein kleines Beispiel mit Funktionen. Es ist nicht sauber, aber ein Ansatz.
def print_welcome_message():
print("""Willkommen zu meinem Taschenrechner! Er beherrscht die Grundrechenarten +, -, * und /
Viel Spaß!
=======================================================================================""")
def get_user_inputs():
first_summand = int(input("Bitte die erste Zahl eingeben: "))
second_summand = int(input("Bitte die zweite Zahl eingeben: "))
operation = input("Bitte einen Operator wählen: ")
return [first_summand, second_summand, operation]
def calculate(first_summand, second_summand, operation):
match operation:
case '+': return first_summand + second_summand
case '-': return first_summand - second_summand
case '*': return first_summand * second_summand
case '/': return first_summand / second_summand
case _: raise ValueError
def run_program():
print_welcome_message()
user_input = get_user_inputs()
try:
print(calculate(user_input[0], user_input[1], user_input[2]))
except ValueError:
print("Bitte +, -, / oder * eingeben!")
run_program()
Das sieht echt komplex aus und verstehe es nicht ganz (bin noch neu im Thema python) aber trotzdem vielen vielen Dank
Lies dir den Code durch, lass ihn laufen und lerne. Fremden Code zu lesen ist durchaus eine Disziplin, bei der man lernen kann.
Und was ist diese "Def" Funktion?
Die kenne ich noch nicht...