Frage an die "Python-Experten hier im Forum"

  • Ist das nur zu Übungszwecken oder willst du etwas bestimmtes fertigen, wo dir das Programm weiter hilft?

    Ich habe das Programm schon etliche Jahre auf einem programmierbaren Taschenrechner und immer bei der Arbeit eingesetzt,

    Du glaubst gar nicht wie viele Zeichnungen es gibt, wo Maße fehlen.

    Andere sind da immer zum Konstruktionsbüro gelaufen. Ich habe es halt über Winkelfunktionen errechnet


    Aber Python rechnet sogar noch mit 180 Grad.

    Ergebnis aber Gegenkathete_A = 1.2246467991473532e-14 (Warscheinlich ein Rundungsfehler)

    Mein Taschenrechner zeigt da einen ERROR (Mathematischer Fehler)


  • Ergebnis aber Gegenkathete_A = 1.2246467991473532e-14 (Warscheinlich ein Rundungsfehler)

    Kann ich bestätigen, aber leider nicht erklären. Ich habe zwar schon öfters was zu solchen "Fehlern" gelesen, konnte mir aber die Begründung nicht merken. Aber dazu sagt ein Experte bestimmt noch was.

    Einzig der Cosinus stimmt:


    Du glaubst gar nicht wie viele Zeichnungen es gibt, wo Maße fehlen.

    Leider glaube und weis ich es auch, es fällt mir jetzt noch viel mehr auf, seit dem ich Zeichnungen von anderen kontrollieren muss, bevor sie in die Fertigung gehen. :-/


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Kann ich bestätigen, aber leider nicht erklären

    Kommt darauf an, mit wie vielen Stellen math da rechnet. z.B. pi oder die Umrechnung von radians und degrees, die Genauigkeit von sin, cos, tan.........


    Aber die Abweichung e-14 kann man getrost vernachlässigen. :)

  • (Und besondere Scherzkekse (wie ich 🤡) geben auch gerne mal "inf", "-inf", und "nan" ein, um zu sehen was passiert.)

    Das kenn ich gar nicht, gibts es wo eine Liste wie viele solcher Schlüsselwörter noch existieren?


    Dein Beispiel aus #10 funktioniert doch.

    ...

    Erst als ich dein komplettes Beispiel übernommen hatte, ging es.

    Sehr schön, war kurz verunsichert und hatte es gleich nochmals selbst getestet. Ist dir auch klar wie es funktioniert oder soll ich es erklären?

  • Ist dir auch klar wie es funktioniert oder soll ich es erklären?

    Ich habe da eine gute Erklärung zu gefunden.

    https://www.python-kurs.eu/ausnahmebehandlung.php


    Aber Danke für die Nachfrage

  • Ich würde in der Funktion, wo gerechnet werden soll, überhaupt keine Validierung machen und auch nicht nach der Eingabe des Users fragen (input).



    Ein paar Beispiele:


    Beim letzten sieht man z.B., dass ein Fehler nicht erkannt worden ist.

    Auch das müsste man in validate abfangen.


    In der Funktion triangle, die mit validate dekoriert ist, kann man sich dann ausschließlich auf das Rechnen konzentrieren.

    Das letzte Beispiel zeigt auf, wie komplex die Abfragen werden können. Im Fall, dass z.B. alle Werte angegeben sind, würde ich z.B. einen Fehler auslösen.

    Die Funktion triangle soll ja fehlende Angaben berechnen, anstatt die Eingaben auf Gültigkeit zu überprüfen.


    Könne man z.B. so abfragen:


    Code
    # in der Funktion validate -> inner
    if all(angles) and all(sides):
        raise ValueError("All side and all angles are given. This is not allowed!")

    Wenn also alle Winkel und alle Seiten weder None, noch 0 sind, wird der Fehler ausgelöst.

    Negative integer ergeben auch ein True, wenn man sie in ein bool umwandelt.


    Die Reihenfolge der Abfrage der möglichen Eingabe-Fehler ist auch von Bedeutung.

    Wenn z.B. zuvor überprüft worden ist ob eine der Zahlen negativ ist, können die folgenden Ausnahmehandlungen nicht erreicht werden.

  • Ich habe das Programm jetzt noch einmal komplett überarbeitet.


    Kritik oder Anregungen erwünscht :)


  • Hallo,


    die 'main'-Funktion steuert das Programm, sprich daraus werden Funktionen aufgerufen, Argumente übergeben und Rückgaben von Funktionen entgegen genommen. In der Funktion, weitere Funktionen erstellen, macht man hier eigentlich nicht (so weit ich das beurteilen kann).

    Eine Funktion soll wiederkehrende Arbeit abnehmen, wenn du vier Funktionen hast, die alle nur einen 'print'-Befehl enthalten, könnte man daraus eine Funktion machen und diese dann mit entsprechenden Argumenten aufrufen.


    Wenn du in Zeile 32 noch einen beliebigen Text ausgeben willst, kannst du das so machen raise ValueError('Falsche Eingabe')


    Man könnte doch auch eine Funktion schreiben, die an Hand der Argumente die sie bekommt die gewünschten Seiten ausrechnet. Dann sparst du dir auch hier das immer wieder kehrende Schreiben von Formeln.


    Wenn du gerne ein paar Beispiele zu dem geschriebenen haben möchtest, dann reiche ich die nach dem Abendessen gerne nach, davor reichts nicht mehr ^^




    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Wenn du gerne ein paar Beispiele zu dem geschriebenen haben möchtest

    Die nehme ich sehr gerne an. :)

    Aber nichts überstürzen. Es ist keine Eile geboten.

  • Anstatt:

    Code
    math.sqrt(adjacent_side ** 2 + opposite_side ** 2)

    Kann man math.hypot verwenden.

    Code
    math.hypot(adjacent_side, opposite_side)


    Falls du mal die Distanz zwischen zwei Punkten berechnen willst, dann schau mal nach math.dist.

    Das Modul math hat viele nützliche Funktionen.

  • In der Funktion, weitere Funktionen erstellen, macht man hier eigentlich nicht

    Die Funktion also vor die main-Funktion setzem?

    Code
    def known(text, value):
        print(text, value)
    
    def main():


    könnte man daraus eine Funktion machen und diese dann mit entsprechenden Argumenten aufrufen.

    Etwa so?

    Code
            print("\n")
            known("Gegenkathete =   ", opposite_side)
            known("Ankathete =      ", adjacent_side)
            print("Hypothenuse_C =  ", math.sqrt(adjacent_side ** 2 + opposite_side ** 2))
            print("Winkel_Alpha =   ", math.degrees(math.atan(opposite_side / adjacent_side)))
            print("Winkel_Beta =    ", math.degrees(math.atan(adjacent_side / opposite_side)))

    Dann könnte ich ja auf die Funktion ganz verzichten und gleich statt "known" "print "davor schreiben.

  • Die Funktion also vor die main-Funktion setzem?

    Ja genau. Das Problem ist, dass wenn du die Funktion in der 'main' Funktion erstellst, dann ist sie auch nur in der 'main' Funktion verfügbar.

    Siehe:

    Wenn du den Kommentar entfernst, siehst du, dass du auf die Funktion nicht zugreifen kannst.


    Ja, nur wegen einer 'print'-Ausgabe würde ich auch keine Funktion schreiben, es sei den es geht darum zu üben wie man Argumente übergibt.


    Dazu eventuell das kleine Beispiel:


    Gestartet wird 'main', darin wird die Funktion 'get_input' aufgerufen. 'get_input' gibt mit 'return' den 'input' zurück, der eingegeben wird. Die Rückgabe wird in 'main' an den Namen 'user_input' gebunden. Jetzt kann man in 'main' mit den Werten aus der 'get_input' Funktion arbeiten. Zum Beispiel übergibt man 'user_input' an die nächste Funktion. In dem Fall an 'print_user_input.

    Jetzt kommt etwas, das verwirrend sein kann, aber wichtig ist. Du übergibst nicht den Namen 'user_input', aber du musst den "Inhalt" von 'user_input' in einer anderen Funktion wieder an einen Namen binden.

    Namen sind immer nur in der Funktion verfügbar, in der sie erstellt werden.

    Um das zu verdeutlichen, wird der "Inhalt" der in in 'main' an 'user_input' gebunden wurde, in 'print_user_input' an den Namen 'input_to_print' gebunden.


    Ich hoffe die Erklärung ist nicht zu wild, bau dir ein paar 'prints' ein, damit du siehst was passiert.


    Das ist wichtig, so kann man mit Funktionen arbeiten und diese auch so aufbauen, damit sie einzeln und unabhängig von einander testbar und erweiterbar sind.


    Grüße

    Dennis

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?