An die mit Python Erfahrung, was kann ich tun, um meinen Code zu verkürzen?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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

Woher ich das weiß:Studium / Ausbildung – Diplom Wirtschaftsinformatiker

Kingofforty2 
Beitragsersteller
 19.07.2024, 19:25

Und was ist diese "Def" Funktion?

Die kenne ich noch nicht...

GuteAntwort2021  19.07.2024, 19:28
@Kingofforty2

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.

Kingofforty2 
Beitragsersteller
 19.07.2024, 19:21

Vielen Vieln Dank

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()}):')

GuteAntwort2021  26.07.2024, 19:29

Ob das Funktionen sind, die ein absoluter Anfänger in Programmierung verstehen kann?

Von Experte Erzesel bestätigt

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()

Kingofforty2 
Beitragsersteller
 19.07.2024, 20:49

Das sieht echt komplex aus und verstehe es nicht ganz (bin noch neu im Thema python) aber trotzdem vielen vielen Dank

cleanercode  20.07.2024, 16:23
@Kingofforty2

Lies dir den Code durch, lass ihn laufen und lerne. Fremden Code zu lesen ist durchaus eine Disziplin, bei der man lernen kann.