Wie sage ich es in Python ? (Einsteigerfragen)

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Was "besser" ist, darüber lässt sich streiten :angel:


    Das will ich hier nicht :shy:. Aber viele gute Python Libraries sind objectorientiert. Es ist also sinnvoll sich mal - wenn auch nur oberflächlich - mit Python OO vertraut zu machen. Spätestens wenn man mal eine der zahlreichen OO Librarys benutzen will um sich Codierungsaufwand zu ersparen.

  • Mahlzeit mal wieder.

    Ich arbeite gerade den Lehrgang für Python bei CodeCademy.com durch. Ist interaktiver als die Dokumentation.
    Auf jeden Fall bin ich gerade bei dem or-Operator für Strings, und der wundert mich etwas.
    Der or-Operator wirft ja True raus, sobald eine Seite wirklich True ist (weiß gerade nicht wie ich es sonst beschreiben soll).

    Das erste Beispiel beim Lehrgang ist:

    Code
    >>> 1 < 2 or 3 < 1
    True

    Ich frage mich, wozu man das wirklich brauchen kann. Die anderen Dinge Operatoren sind ja soweit klar, aber hier erschließt sich für mich erstmal nicht der Sinn.

    Grün ist Blau oder Rot ist Rot = Richtig will mir nicht in den Kopf.

    Hätte da wer eine anfängerfreundliche Erklärung?

    Gruß Mario

  • aber hier erschließt sich für mich erstmal nicht der Sinn.

    Grün ist Blau oder Rot ist Rot = Richtig will mir nicht in den Kopf.

    Hätte da wer eine anfängerfreundliche Erklärung?

    Jupp. Das Beispiel ist tatsächlich nutzlos. Aber das kennt man ja noch aus dem Matheunterricht der Grundschule: Max kauft 53 Melonen.....

    Mit Variablen wird das Ganze schon besser. Dein Auto muss zur Durchsicht, wenn der Kilometerstand größer 30.000 ODER der Zeitpunkt Juni 2018 überschritten wird...Nur eine Bedingung reicht, dass der Zustand wahr wird. Gelle?

    Gruß, STF

  • Hallo,

    sagen wir mal, du überwachst am Raspi zwei Eingänge. Wenn an (mindestens) _einem_ ein Signal anliegt (=der Eingang "True" ist), soll eine LED leuchten. Dann brauchst du ein `or`.

    Oder die willst prüfen, ob eine Eingabe nicht in einem bestimmten Bereich liegt:

    Python
    >>> zahl = int(input('Zahl eingeben: '))
    Zahl eingeben: 4
    >>> if zahl < 5 or zahl > 10:
    ...     print('Zahl liegt nicht im Bereich 5 bis 10')
    ... 
    Zahl liegt nicht im Bereich 5 bis 10
    >>>

    `or` ist es übrigens gleich, was links und rechts steht (also String oder so), solange der Ausdruck zu `True` oder `False` oder `None` evaluiert.

    Das Beispiel 1 < 2 or 3 < 1 ist in der Tat ziemlich sinnfrei.

    Gruß, noisefloor

  • Ich habe eine Frage zu einer Aufgabe im Buch "Einstieg in Python"

    Die Übung ist zur Funktion range()

    Die Aufgabe ist, dass man ein Programm schreibt, dass folgende Ausgabe erzeugt (Keine Eingabe durch Nutzer)

    15 inch = 38.1 cm

    20 inch = 50.8 cm

    25 inch = 63.5 cm

    30 inch = 76.2 cm

    35 inch = 88.9 cm

    40 inch = 101.6 cm

    Meine Code schaut so aus

    Code
    for i in range(15,41,5):
        print(i, "Inch =", i * 2.54, "cm")

    Der Code aus der Lösung so

    Code
    inch = 2.54
    
    for xi in range(15,41,5):
        xcm = xi * inch
        print(xi, "Inch =", xcm, "cm")

    Beides führt zum gleichen Ergebnis, aber welches ist nun "eleganter"?

    Ich frage nur, weil ich es für sinnvoll erachte einen Code so kurz wie möglich zu halten, und solange die Variablen wie in dem Fall 'inch' und 'xcm' nicht weiter gebraucht werden, würde ich diese erst gar nicht anlegen.

    Gruß Mario

  • Hallo Mario,

    "eleganter" gibt es in der Programmierung nicht.

    Es gibt nur unterschiedliche Grade der Erkenntnis. Die Art der Programmierung, die Du gerade verstehst, ist für Dich gut. Da kann jemand anders lästern, wie er möchte.

    Ein noch so "eleganter" Algorithmus, den Du nicht nachvollziehen kannst, bringt Dir nichts. Du verstehst ihn nicht. Taucht ein Fehler auf, hast Du keine Chance, diesen Algorithmus zu "flicken".

    Ein anderer Gedanke: Ein Programm ist nie wirklich fertig. Du weißt nicht, ob die Variablen gebraucht werden.

    Ich kann z.B. sehr kurze Schleifen programmieren, die andere nicht als Schleifen wahrnehmen, weil z.B. keine Laufvariable vorhanden ist. Brauche ich die Laufvariable nicht, dann ist das sehr "elegant" für mich - für andere nicht, weil sie es nicht verstehen.

    Benötige ich in dieser Schleife aber eine Laufvariable, weil ich noch was anderes damit anstellen will, dann wirkt es "sehr unelegant", wenn ich ich die Laufvariable nachträglich einbaue.

    Bei Mehrfachschleifen wird das dann extremer.


    Was Du auch noch im Hinterkopf behalten solltest, ist die Laufzeit von Code. OK. Spielt bei Python jetzt nicht die Rolle. Wenn Du eine Variable definierst, die innerhalb einer Schleife nicht verändert wird, dann ist dies schneller, als wenn die gleichen Berechnungen immer wieder (aber ohne Zuweisung) wiederholt werden. Spielt bei heutigen Systemen mit viel Speicher auch keine Rolle. Aber bei einem µController kommst Du schnell an Speichergrenzen - und da kann jedes eingesparte Byte über Lauffähigkeit entscheiden...


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Andreas

    Mit anderen Worten, für so ein recht Sinnfreies Übungsprogramm ist es ganz nett so wenig Code wie nötig so haben. Arbeitet man aber an einem größeren, umfangreicheren Programm/Projekt, sollte man derartige Variablen anlegen um ggf später darauf zurückgreifen zu können, oder aber, dass andere, die den Code mal lesen und verstehen sollen, wissen was es in diesem Fall z.B. mit den 2.54 auf sich hat.

    Richtig verstanden?

  • Hallo Mario,

    ja, so in etwa.

    Bei einem größeren (ernsthaften?) Projekt würdest Du eine Umrechnungsfunktionen definieren,die z.B. metrisch2US(), die einen Zahlenwert empfängt und dort entsprechend umrechnet.

    Wenn Du mehrere solcher Funktionen hast [z.B. metrisch2US(), inch2cm(), km2miles(), Angstrom2Lichtjahr], dann würdest Du es wahrscheinlich "elegant" lösen, wenn Du eine einzige Funktion laengenumrechnung(wert, von, zu) definierst. Diese Funktion bekommt einen Zahlenwert und zwei Längeneinheiten. Dann ist fröhliches Umrechnen von allen Längeneinheiten in alle anderen möglich.


    Das wäre mal eine schöne Übungsaufgabe... oder, Mario? Wenn Du bei der Programmierung von Funktionen angekommen bist...

    Was aber allgemein zu beachten ist: Keine MagicStrings und MagicIntegers, MagicReals, ... MagicX einfach so mitten im Code verwenden. Sowas definiert man entweder in einer extra Datei, die dazugeladen wird, oder weit oben im Quellcode. Aber auch das erst, wenn Du das in Deinem Programmier-Lern- und Übungsbuch gefunden hast.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (31. Dezember 2017 um 17:04)

  • Der "Witz" ist, dass du den Umrechnungsfaktor cm => Zoll direkt in die Ausgabe gepackt hast. Was an sich ok ist.

    Die Buchantwort hat den Umrechnungsfaktor als "Konstante" (Python hat keine echten Konstanen(!) ) definiert hat, so dass sich damit recht zügig ein beliebiges Umrechnungsprogramm bauen lässt (indem die Konstante modifiziert wird.)

    Wie Andreas schon schrieb: Mit der Zeit und der wachsenden Erfahrung "denkt man weiter".

    Ich z.B. versuche schon am Anfang zu überlegen, wie ich den Code modular halten kann:

    Kleine Funktionen, welche möglichst nur eine Aufgabe ausführen (Lassen sich auch besser testen).

    Diese werden dann miteinander verknüpft und ein größeres Etwas entsteht.

  • Andreas

    Wenn ich weiß wovon Du da schreibst, dann komme ich gerne mal auf die Aufgabe zurück ;)

    framp

    Ich dachte Python wäre eine Interpreter und keine Compilierer Sprache.... bitte bring mich jetzt nicht in Verlegenheit(wobei ich schon wo gelesen habe, dass zum Teil auch Interpretersprachen compiliert werden können, aber damit beschäftige ich mich später mal wenn es relevant werden sollte).

    Zentris

    Gerade weil mir so ein Denken fehlt fragte ich nach. Ich konnte mir schon denken, dass der Buchautor sich was dabei gedacht hat, aber leider Fehlen solche Infos in dem Buch (wie wohl in den meisten schätze ich). Als Schüler/Lehrling/Student hat man i.d.R. jemanden, der einem den Lösungscode erklärt in solchen Fällen. Hier muss ich leider euch bzw das Forum damit belästigen.

    Gruß und Danke

    Mario

  • Beides führt zum gleichen Ergebnis, aber welches ist nun "eleganter"?

    Hallo Mario, hier noch kurz mein "Lösungsvorschlag":

    Python
    INCH = 2.54
    
    for xi in range(15,41,5):
        xcm = xi * INCH
        print("{inch} Inch = {cm} cm".format(inch=xi, cm=xcm))
        # andere Form noch
        # print("{} Inch = {} cm".format(xi, xcm))

    Konstanten in Python immer groß schreiben

    Näheres zu format

  • Hallo Mario,

    sei Dir gewiss:

    Ich konnte mir schon denken, dass der Buchautor sich was dabei gedacht hat, aber leider Fehlen solche Infos in dem Buch (wie wohl in den meisten schätze ich). Als Schüler/Lehrling/Student hat man i.d.R. jemanden, der einem den Lösungscode erklärt in solchen Fällen. Hier muss ich leider euch bzw das Forum damit belästigen.

    Der Buchauor hat sich dabei garantiert nichts gedacht. So viele Bücher, wie momentan zum Thema Raspberry Pi / Arduino / diverse Programmiersprachen für Raspberry Pi herausgehauen werden, verunmöglichen dieses. Soviel Lektoren mit Programmiersachverstand gibt es nicht. Letztlich geht es immer um die Frage "Tut der Code? Oder tut er nicht?" Bei Ja geht's sofort weiter. Zum Optimieren (Minimierung der Code-Zeile, Minimierung der Laufzeit, Minimierung der CPU-Belastung) kommt es - mit Verlaub - niemals in solcher Literatur. Sonst wären da auch nicht so viele Fehler enthalten (zumindest in den Erstausgaben). Die meisten Fehler, die in den Drittauflagen nicht mehr enthalten sind, wurden ja bereits von uns im Forum aufgedeckt und an die Autoren gemeldet.

    Der Buchautor war garantiert selber froh, als der Code lief. Für meine Icon-Tutorials habe ich teilweise 2 Wochen für so manches Beispiel-Programm gebraucht. Das war aber glücklicherweise nicht die Regel. Fürs aktuelle Tutorial-Teil kann ich noch nicht mal die Monate abschätzen, die an Arbeit dahinter stehen. Dafür ist da auch Code in zu vielen Programmiersprachen enthalten.

    Wenn Du etwas suchst, in dem der Code sehr ausführlich erläutert wird, dann schaue nur mal testweise in meine Icon-Tutorials rein. Nachdem Du mit Python durch bist.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Irre, wer verwendet denn da Python 2, Leerzeichen hinter'm Komma und so lange Variablennamen 8o

    Python
    print('\n'.join('{} Inch = {} cm'.format(i,i*2.54) for i in range(15,41,5))

    Mario Be tu das nicht. Auch wenn sich mit Python vieles kurz schreiben lässt und somit in einer Zeile (List Comprehension, If/elif/else in einer Zeile, ...) statt in vielen, hier ist es einfach nur unübersichtlich. Hat aber auch Vorzüge.

    Edit: wo wir schon dabei sind, PEP 8 zu lesen ist gerade für Anfänger sicher kein Fehler. So kommst du gleich zu sauberem Code. In der Python-Community legt man da Wert drauf.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!