Damit es Dir Sonntagabend nicht langweilig wird hab' ich in Deinen Taschenrechner einmal 'ganz sachte' eine Liste eingebaut, über die Du Deine Auswahl triffst.
Hier erstmal der geänderte Code, meine Änderungen habe ich nummeriert und unten erklärt:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 1.
MENU_ITEMS = (('', 'Beenden'),
('+', 'Addition'),
('-', 'Subtraktion'),
('*', 'Multiplikation'),
('/', 'Division'))
def eingabe():
# für Eingaben wiederholung bei Fehler
while True:
print("Bitte Eingabe machen:")
try:
return float(input())
except ValueError:
print("Sie haben eine fehlerhafte Eingabe gemacht!\n")
""" Funktion übernimmt Rechnung und Ausgabe"""
# 5.
def ausgabe(zahl, zahl1, op):
if op == '+':
erg = zahl+zahl1
elif op == '-':
erg = zahl-zahl1
elif op == '*':
erg = zahl*zahl1
elif op == '/':
erg = zahl/zahl1
print(zahl, op , zahl1, " = ", erg)
def main():
print("Willkommen beim Rechner von mir :)")
while True:
print("Bitte entscheiden Sie sich für eine Rechenart :")
# 2.
for choice, item in enumerate(MENU_ITEMS):
print('-{0}- {1} ({2})'.format(choice, item[1], item[0]))
# 3.
wahl = int(eingabe()) # Auswahl der Rechenart
if wahl == 0:
print("Danke und bis bald\n")
break
elif wahl > len(MENU_ITEMS)-1:
print("Sie haben einen Fehler gemacht!\n")
# 6.
a = eingabe()
# 6.
b = eingabe()
# 4.
op = MENU_ITEMS[wahl][0]
ausgabe(a, b, op)
if __name__ == '__main__':
main()
- 'MENU_ITEMS' ist ein Tuple, das zu jeder Auswahlmöglichkeit ein weiteres Tuple mit den nötigen Infos enthält.
- Somit kannst Du über 'MENU_ITEMS' iterieren und aus jedem 'item' einen Menüpunkt erstellen. 'enumerate()' ist eine kleine aber feine built-in-Funktion, die Dir den Index eines jeden Elements liefert. Ohne 'enumerate()' müsstest Du daher selbst einen Index-Zähler implementieren. Beispiel:
Code: Alles auswählen
>>> liste = ['Null', 'Eins', 'Zwei'] >>> index = 0 >>> for element in liste: ... print(index, element) ... index += 1 0 Null 1 Eins 2 Zwei >>> for index, element in enumerate(liste): ... print(index, element) 0 Null 1 Eins 2 Zwei
- Das ist z. B. ein Grund, weshalb Deine 'eingabe()'-Funktion flexibler gestaltet werden sollte. Könnte ich den Typ, den ich zurückerhalten möchte als Parameter gleich übergeben, müsste ich aus dem float hier nicht wieder ein int machen.
Muss ich deshalb, weil ich ja über 'wahl' auf 'MENU_ITEMS' zugreifen möchte. Und ein Index muss ein int sein. - Das, was Du über die elendlange if-/elif-Abfrage gemacht hast, erreichst Du hier mit einem Zugriff auf 'MENU_ITEMS'. Du holst Dir das Element mit der Zahl, auf das 'wahl' verweist und aus diesem Element dann wiederum das vorderste. Beispiel:
Code: Alles auswählen
>>> MENU_ITEMS = (('', 'Beenden'), ...('+', 'Addition'), ...('-', 'Subtraktion'), ...('*', 'Multiplikation'), ...('/', 'Division')) >>> MENU_ITEM[1] ('+', 'Addition') >>> _[0] #Mit _ kannst Du in der Pythonshell immer auf das letzte Ergebnis zugreifen '+' >>> MENU_ITEM[1][0] '+'
- Somit musst Du 'wahl' auch nicht mehr an Deine 'ausgabe()'-Funktion übergeben. Dass Du innerhalb von 'ausgabe()' aber trotzdem noch sage und schreibe 4 Abfragen durchlaufen musst, kannst Du durch noch konsequenteren Einsatz von 'MENU_ITEMS' vermeiden.
BlackJack hat Dir da ja schon was dazu geschrieben... - Und wenn Du jetzt noch einen dynamischen Prompt einbaust, dann kannst Du bei der Abfrage der Zahlen auch einen Text mitgeben, damit man weiß, was man eingeben soll. 3 x hintereinander 'Bitte Eingabe machen:' ist ja nicht so dolle...