Neuling im Forum hat mal ne Frage :p

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@Metalcore:
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()
  1. 'MENU_ITEMS' ist ein Tuple, das zu jeder Auswahlmöglichkeit ein weiteres Tuple mit den nötigen Infos enthält.
  2. 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
  3. 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.
  4. 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]
    '+'
  5. 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... :wink:
  6. 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...
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Metalcore
User
Beiträge: 8
Registriert: Donnerstag 13. Oktober 2011, 14:17

Danke dir mutetella :)

Ich hab jetzt auf deinem Post mal geschaut wie und wo Tupel in meinem Buch vorkommen. Zufälligerweise ist dies das nächste Kapitel (Nr 4). Daher werde ich mich jetzt erst mal durch Kapitel 4 arbeiten und dann meinen Rechner wieder mit dem neu gelerntem verbessern (hoffe ich zu mindestens :P)

Ich danke auch allen anderen für ihre Hilfe ! Habe dadurch direkt schon ein paar Sachen gelernt und gesehen wie ich meinen Programmierstil verbessern kann :) (z.B. diese unnötigen Kommentare von mir ...^^')

Ich hoffe es klappt weiterhin so gut :)

Also bis bald denke ich ;)

Mit freundlichen Grüßen Metalcore


ps: Ds Forum gefällt mir, habe schon viele andere Foren dieser Art gesehen, wo Neulingen nicht so nett geholfen wurde :)


EDIT :
Ok konnte doch nicht warten, habe mich jetzt mit Prompt und type_ beschäftigt und es jetzt verstanden.(glaube ich)

habe jetzt noch mal verbessert mit prompt und type_ :

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

# Taschenrechner v 0.2
# 4 Grundrechenarten, solange bis Nutzer beendet

def eingabe(prompt, type_):
    # für Eingaben wiederholung bei Fehler
    while True:
        try:
            return type_(input(prompt))
        except ValueError:
            print("Sie haben eine fehlerhafte Eingabe gemacht!\n")

""" Funktion übernimmt Rechnung und Ausgabe"""
def ausgabe(zahl,zahl1,wahl,op):
    if wahl == 1:
        erg = zahl+zahl1
    elif wahl == 2:
        erg = zahl-zahl1
    elif wahl == 3:
        erg = zahl*zahl1
    elif wahl == 4:
        erg = zahl/zahl1
    print(zahl, op , zahl1, " = ", erg)

def main():
    
    print("Willkommen beim Rechner von mir :)")
    # Wiederholung solange User möchte
    while True:
        print("Folgende Rechenarten stehen zur Auswahl:")
        print("-0- Beenden")
        print("-1- Addition (+)")
        print("-2- Subtraktion (-)")
        print("-3- Multiplikation (*)")
        print("-4- Subtraktion (/)")
        
        wahl = eingabe("Bitte wählen Sie eine Rechenart:\n", int)
        # Auswahl der Rechenart

        if wahl == 0:
            print("Danke und bis bald\n")
            break
        elif wahl == 1:
            op = " + "
        elif wahl == 2:
            op = " - "
        elif wahl == 3:
            op = " * "
        elif wahl == 4:
            op = " / "
        else:
            print("Sie haben einen Fehler gemacht!\n")

        a = eingabe("Bitte erste Zahl eingeben :\n", float)
        b = eingabe("Bitte zweite Zahl eingeben :\n", float)  
        ausgabe(a,b,wahl,op)

        """ Aufruf von der Funktion Ausgabe mit Übergabe
        der Parameter für Rechnung und Ausgabe """
    

if __name__ == "__main__":
    main()
Metalcore
User
Beiträge: 8
Registriert: Donnerstag 13. Oktober 2011, 14:17

So nachdem ich jetzt heute mal wieder etwas mehr Zeit gefunden habe, hab ich mal wieder weiter gemacht und wieder ein wenig neues gelernt. Leider sind es bis jetzt nur Listen geworden und ein paar Funktion für Objekte vom Typ String. Aber jetzt sind ja erst mal 2 Wochen Ferien, da werde ich sicherlich mehr Zeit investieren können.

Ich habe wieder einmal probiert meinen Code etwas zu verbessern, bzw habe ihn neu geschrieben (etwas Übung im tippen schadet ja nicht, bei so kurzem Code)
- möglichst wenig Kommentare (also versucht mich auf das wesentliche und nötige zu beschränken)
- Menü via Liste
- Variablen via Liste (Da sie ja, so wie ich es verstanden habe, die gleiche Funktion wie Arrays haben, hielt ich das für sinnvoll)
- Beenden über Frage mit Antwort von ja(j) oder nein(j)
- Auswahl der Operatoren über Objekt vom Typ String

So hier noch mein (hoffentlich) wieder ein wenig besserer Code ^^ :

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8

# Taschenrechner v 0.2.7
# 4 Grundrechenarten, Benutzergesteuerte Wiederholung/Ende

def eingabe(prompt, type_):
# Eingabe wird bei Fehler automatisch wiederholt
    while True:
        try:
            return type_(input(prompt))
        except ValueError:
            print("Ein Fehler bei der Eingabe wurde bemerkt!\n")

def auswertung(a, b , c):       # Funktion zur Ausgabe und Berechnung
    if a == "+":
        erg = b+c
    elif a == "-":
        erg = b-c
    elif a == "*":
        erg = b*c
    elif a == "/":
        erg = b/c
        
    print(b, a , c , "=" , erg)

def main():
    while True:
        
        menu = ["Willkommen zum Rechner v0_2_7",
                "+ Addition", "- Subtraktion","* Multiplikation",
                "/ Division"]

        var = ["op", 0, 0, "n"]
# Ausgabe des Menüs  
        for x in range(0,5):
            print(menu[x])
# Überprüfung und Eingabe des Operators
        op = True
        while op == True:
            var[0] = eingabe("Bitte einen Operator auswählen :\n", str)
            if var[0] == "+":
                op = False
            elif var[0] == "-":
                op = False
            elif var[0] == "*":
                op = False
            elif var[0] == "/":
                op = False
            else:
                print("Sie haben einen Fehler gemacht!\n")

        var[1] = eingabe("Bitte geben Sie eine Zahl ein :\n", float)
        var[2] = eingabe("Bitte geben Sie eine Zahl ein :\n", float)

        auswertung(var[0],var[1],var[2])

        var[3] = eingabe("Möchten Sie weiter rechnen? (j / n)\n", str)
        if var[3].startswith("n") and var[3].endswith("n"):
            print("Aufwiedersehen")
            break
        if var[3].startswith("j") and var[3].endswith("j"):
            print()
        else:
            print("Sie haben einen Fehlergemacht")
            print("Das Programm wird fortgesetzt!\n")

if __name__ == "__main__":
    main()
edit :
ich hoffe es stört niemanden das ich meinen alten Thread dafür wieder nehme?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Versuche doch nun noch, nicht nur die Menüeinträge in einer Liste zu verwalten, sondern auch das Dispatching darüber laufen zu lassen. Im `operator`-Modul gibt es Funktionen für alle Grundrechenarten; damit kannst Du direkt über die Eingabe auf die auszuführende Funktion verzweifen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Metalcore
User
Beiträge: 8
Registriert: Donnerstag 13. Oktober 2011, 14:17

Hyperion hat geschrieben:Versuche doch nun noch, nicht nur die Menüeinträge in einer Liste zu verwalten, sondern auch das Dispatching darüber laufen zu lassen. Im `operator`-Modul gibt es Funktionen für alle Grundrechenarten; damit kannst Du direkt über die Eingabe auf die auszuführende Funktion verzweifen.
Ok danke für den Tipp, das werde ich mir ansehen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hyperion hat geschrieben:[...] auf die auszuführende Funktion verzweifen.
Na, wenn das mal kein 'freudscher' war... :lol:
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@Metalcore: Diese `var`-Liste in `main()` ist unschön. Du ersetzt damit aussagekräftige Namen durch nichtssagende Zahlen. Warum hast Du das gemacht?
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Metalcore hat geschrieben:ich hoffe es stört niemanden das ich meinen alten Thread dafür wieder nehme?
Im Gegenteil! Es handelt sich ja immer noch um dasselbe Programm...

Folgendes könnte man etwas geschickter lösen:

Code: Alles auswählen

for x in range(0, 5):
    print(menu[x])
würde ich so machen:

Code: Alles auswählen

for line in menu:
    print(line)
Damit bist Du flexibler in Deiner Menügestaltung, da es keine Rolle spielt, ob Dein Menü 5, 3 oder 8 Einträge hat.

Code: Alles auswählen

>>> result = 'Nein'
>>> result.startswith('n') and result.endswith('n')
False
>>> result = 'N'
>>> result.startswith('n') and result.endswith('n')
False
>>> result = 'nein'
>>> 'n' in result.lower()
True
>>> result = 'NEIN'
>>> 'n' in result.lower()
True
Das 'startswith' und 'endswith' an dieser Stelle würde ich so nicht machen, damit sind einige Varianten nicht abgedeckt.

Ansonsten, wie Hyperion schon vorgeschlagen hat, würde ich mir jetzt auch mal das 'operator'-Modul anschauen...

Bin schon gespannt... :wink:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Metalcore
User
Beiträge: 8
Registriert: Donnerstag 13. Oktober 2011, 14:17

Also ich bin im Moment noch auf der Suche nach einer Dokumentation für das Operator Modul , aber ehrlich gesagt weiß ich gar nicht wo ich suchen muss, also hätte ich generell mal Frage, wo finde ich denn die Dokumentationen zu den einzelnen Modulen bzw. überhaupt zu Python?
Ist eigentlich egal ob deutsch oder englisch, allerdings deutsch doch etwas lieber, außer wenn die englische natürlich besser ist ^^.
Mit freundlichen Grüßen
Metalcore :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo,

Google ist dein Freund. Mit "python doc" findest du die Documentation, darin sind auch alle enthaltenen Module vorhanden. "python doc MODULNAME" führt dich im Allgemeinen direkt zum Modul. Eine Dokumentation in Deutsch wirst du nicht finden.

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

@Metalcore: Welche Suchmaschine hast Du denn mit welcher Anfrage verwendet und bist *nicht* auf die Webseite von der Sprache gekommen? http://lmddgtfy.com/?q=python
Metalcore
User
Beiträge: 8
Registriert: Donnerstag 13. Oktober 2011, 14:17

Ich hab zwar Google genutzt, habe halt nach "Python 3.2 operator modul" gesucht, aber das hat mich dann auf Python.de nur geführt, da hab ich aber nichts gefunden, und einmal auch auf python.org, allerdings bin ich da dann in einem naderen Modul scheinbar gelandet, denn die Dokumenation sieht anders aus... hmm
problembär

Metalcore hat geschrieben:Also ich bin im Moment noch auf der Suche nach einer Dokumentation für das Operator Modul , aber ehrlich gesagt weiß ich gar nicht wo ich suchen muss, also hätte ich generell mal Frage, wo finde ich denn die Dokumentationen zu den einzelnen Modulen bzw. überhaupt zu Python?
Normalerweise verwende ich auf der Linux-Konsole den pydoc-Befehl:

Code: Alles auswählen

pydoc operator
zeigt mir schnell die Dokumentation an.

Im Netz wäre das für 3.2 wohl:

http://docs.python.org/release/3.2/libr ... e-operator
-----
Versucht zu programmieren habe ich 1983 auf einem Sinclair ZX Spectrum (Basic, kein schlechtes Basic übrigens, IMHO). Z80-Assembler angesehen, nix verstanden. Dann Atari 800 XL: Mehr gespielt, weniger programmiert. Ab 1988 Amiga 500: Amiga Basic wurde interessanterweise von Microsoft geschrieben. Insgesamt auch noch nicht viel verstanden. Erstmal was anderes studiert und Windows benutzt. Neustart ca. 2002: Linux installiert, versucht C/C++ kennenzulernen. Sicher sehr mächtig, aber für mich zu schmerzhaft, vor allem das Debuggen. Perl kennengelernt. Nicht schlecht, aber oft etwas unsauber. Dann Python. Nett. Auch mal JavaScript, VBA usw.. Im Groben ähneln sich die Sprachen (Schleifen, Bedingungen, Funktionen usw.), aber eine der Sprachen sollte man besser kennenlernen, dann lernt man dort mehr über Tricks und verfügbare Module, bzw. Bibliotheken.
Antworten