Python-bashing ...

  • ich meinte damit die Definition von "Funktion" im Eingangspost

    Kurz und gut: selbstverständlich gibt es in Python Funktionen, die immer genau einen Wert zurückgeben.

    Das Zeigt schon einen gewissen Humor der Entwickler. Gut, muss man nicht witzig finden, aber IMHO hat das was und trägt zur Lesbarkeit bei.

    Ganz unabhängig davon, Humor haben die Python-Entwickler jede Menge, allen voran Guido van Rossum. Guido ist ein Fan von Monty Python, daher auch die Namensgebung - und in der Doku finden sich jede Menge Anspielung auf Sketche von denen. ;)

    Auch Python selbst enthält einige witzige Eastereggs! Eine Auswahl:

    Python
    from __future__ import braces
    import antigravity
    import this
    # Die Implementierung des Moduls `this` ist der Hammer!
    import __hello__
  • dass wenn ein "Python-Programm" beendet ist, nicht zwangsläufig Python auch beendet ist, ist eine Sache.

    Aber ich schrieb explizit "... beim Beenden ..." - ich weiss ja nicht, wie das bei Dir ist, aber bei mir werden, das es ja keine systemweiten Datei-Handles gibt, alle evtl. geöffneten Dateien bei Programmende geschlossen.

    Ich bezog das eigentlich nicht explizit auf Python, sondern auf allgemein Dateien da du von Betriebssystem gesprochen hattest

    Soweit ich weiß ist das so: entweder das Programm hat eingebaut, dass es, von sich geöffnete Dateien, beim beenden des Programms auch wieder schließt, oder die Dateien bleiben geöffnet. Der Kernel kann sich in manchen Fällen auch darum kümmern, nicht aber in allen Fällen, wie zB wenn das Programm crasht oder zwanghaft von extern beendet wird.

    Also das Betriebssystem kümmert sich nicht immer ums schließen der Files. Manche Interpreter haben eine Schließung möglicher offener FD's eingebaut, manche Bibliotheken von anderen Programmiersprachen ebenfalls - aber das ist schon eher exotisch und leider kein Standard.

    Zum Thema: Ich war auch Klammern oder in- und out-"Tags" gewohnt. Durch die Einrückungen in Python wird/werde man/ich gezwungen übersichtlich zu bleiben. Das Zeigt schon einen gewissen Humor der Entwickler. Gut, muss man nicht witzig finden, aber IMHO hat das was und trägt zur Lesbarkeit bei. :shy:

    Genau das beachten viele nicht und muss ich daher noch mal explizit drauf eingehen. Sehr gutes Kommentar! :thumbup:

  • Hi,

    Soweit ich weiß ist das so: entweder das Programm hat eingebaut, dass es, von sich geöffnete Dateien, beim beenden des Programms auch wieder schließt, oder die Dateien bleiben geöffnet. Der Kernel kann sich in manchen Fällen auch darum kümmern, nicht aber in allen Fällen, wie zB wenn das Programm crasht oder zwanghaft von extern beendet wird.

    nö ...

    wenn es beendet wird ( egal wie auch immer ), greift das Prozess-Management und alle Resourcen werden freigegeben.

    Ist zwar schon älter, wird aber immer noch so gehandhabt -> https://elixir.free-electrons.com/linux/v2.6.18-…e/kernel/exit.c

    Einfach mal nach __exit_files suchen ...

    Also das Betriebssystem kümmert sich nicht immer ums schließen der Files.

    doch ... wäre schlimm, wenn dem nicht so wäre ...

    btw: bitte nicht unbelegte Meinungen als Tatsache darstellen ... es gibt (Mit-)Leser, die glauben das ;)

    //EDIT: neben dem bereinigen von Datei-Handles werden auch alle anderen belegten Rseourcen "aufgeräumt", falls noch nicht geschehen. Sogar semaphoren und shared-memory-blöcke werden passend behandelt (z.B. use-counter dekrementiert, ...).

    ciao,

    -ds-

  • meigrafd: ich denke, Du bringst da was durcheinander ...

    Z.B. können bei einem crash die .lck- und/oder die .pid-Dateien bestehen bleiben. Oder auch Files, die als "Flags missbraucht" werden, wie z.B. eine /tmp/myprog.run ...

    Das gibt beim Neustart natürlich Fehlermeldungen.

    Aber die Resourcen sind abgeräumt, glaub' mir ;)

    Falls nicht ... mach Dich in Deinem System mal auf die Suche nach (Zombie-)Prozessen, die als "Überbleibsel" noch irgendwo vor sich hindümpeln und die Resourcen blockieren ...

    cu,

    -ds-

  • wird scheinbar echt mal Zeit ;)

    Du hast Dir aber viel Zeit gelassen als bekennender C Fan :lol:

    Zitat

    1. laut Definition liefert eine Funktion ein Ergebnis zurück.

    Python kann aber mehrere Werte, die zudem verschiedene Typen haben können, zurückliefern.

    Streng genommen kann man das auch so sehen, dass es in Python dann keine Funktionen gibt, oder?

    Und nein ... es ist nicht dasselbe wie eine C-Funktion, die eine Struktur zurückliefert. Auf die Struktur-Elemente muss ich explizit zugreifen, wobei mir das in Python "verborgen" bleibt.

    Ja, in Python geht das. In C nicht. Interessanterweise hat man in go (etwas neuer als Python wo man aus den Erfahrungen frueherer Sprachen gelernt hat) auch die Moeglichkeit eine beliebige Anzahl von Parameter zurueckzuliefern. In go wird es aber idiomatisch anders genutzt: Es wird immer ein Object zurueckgeliefert welches das Ergebnis traegt (also so wie eine struct in C) und ein rc der signalisiert ob ein Fehler aufgetreten ist oder nicht. Diesen Ansatz finde ich sehr gut. Eine beliebige Menge von Ergebnissen in einer List zurueckzuliefern ist meiner Meinung nach auch der falsche Ansatz. Da es technisch möglich ist wird es auch genutzt. Dazu gibt es eben good programming practices, die natuerlich ein Anfaenger nicht kennt :no_sad:

    Zitat

    2. Die kleinen "Hilfen", wie z.B. das "automatische" Schliessen eines Filehandels sind imho eher kontraproduktiv, da sie den "Programmierer" ( oder eben den, der es werden will ) zur Schlampigkeit/Nachlässigkeit verleiten.


    Ich wuerde sie als Notbremse bezeichnen. Allerdings ist es im weiteren Rahmen ein sehr gutes Konstrukt was dafuer sorgt, dass man sich mit seinen allokierten Resourcen nicht verhaspelt. In go gibt es z.B. das syntaktische Konstrukt defer mit welchem man am Ende einer Funktion/Methode in jedem Falle Kontrolle erhält und seine Resourcen aufraeumen kann. Das muss man allerdings explizit tun. Speziell in gof unctions, die parallele Ausfuehrung von Code effizient erlauben, ist das eminent wichtig. Das with in Python ist da der Anfang so etwas kontrolliert zu handlen.

    Zitat

    3. Einrückungen, die Einfluss auf die Programmlogik haben, sind - zumindest für mich - ein absolutes nogo ...

    Ich bin auch der Meinung dasss Guido van Rossum da etwas ueber das Ziel hinausgeschossen ist. Jeder Programmierer benutzt Einrueckungen und muss dazu nicht gezwungen werden. Dadurch werden zwar die Anfaenger gezwungen, aber es gibt deswegen leider immer wieder Probleme - speziell auch dass manchmal die Logik nicht stimmt weil eine Einrueckung verutscht ist.

    Zitat

    Ich glaube, ich muss mich demnächst mal näher mit Python beschäftigen ... allein schon, um darüber herziehen zu können :rofl:

    Ich bin auch der Meinung dass Python fuer Anfaenger nicht geeignet ist. Die Ursache liegt darin, dass Python eine typeless Sprache ist und damit der Compiler nicht als Big Daddy darauf achten kann, dass alles mit den Typen passt. Das ist gerade fuer Anfaenger sehr wichtig.

    Ich kann mich daran erinnern, als es damals mit dem OO losging und ich mit dem cfront von Stroustroup meine ersten OO Erfahrung in C++ sammeln durfte, ich mich intensiver mit der Mutter aller OO Sprachen - Smalltalk - intensiv befasst habe um die OO Konzepte zu erlernen. Dabei hatte ich zuerst ziemliche Probleme mit der Tatsache, dass Smalltalk auch typeless ist. Es war meine erste typeless Sprache. Man muss einfach anders Programmieren als in getypten Sprachen. Allerdings hat man dadurch auch Freiheiten, die eine getypte Sprache nicht hat. Dann kommt dazu, dass typeless Sprachen den berechtigten Ruf haben 'eben mal schnell was programmieren zu können'. Der Compiler spuckt einem u.A. nicht in die Suppe :shy:Das trifft auch fuer Python zu.
    Leider steigen eine Menge Leute mit der Raspi ins Programmieren ein und da nun mal Python die Primaersprache von der Raspi ist, wird damit auch ziemlich viel Copy-and-Paste-Codierung betrieben um eben mal schnell gewuenschte Ergebnisse zu erzielen. Dabei ist der richtige Ansatz sich als Anfaenger erst einmal in Programmierkonzepte einzuarbeiten. Diese dann in irgendeiner Sprache zu realisieren ist dann wenn man die verstanden hat - nicht mehr schwer. Sei es dann Java, C, C++, Python, Perl, Haskell, Rust, go und wie sie nicht alle heissen. Die erste Sprache sollte aber keine typeless Sprache sein.

    Du bist kein Anfaenger - also bestens dafuer geeignet Dich mal in Python einzuarbeiten ;). Leider ist Python eine evolutionaere Sprache die speziell das OO Paradigma wie auch viele andere Sprachen erst spaeter aufgepropft bekommen hat und dadurch an verschiedenen Stellen syntaktisch und semantisch krude ist. Das ist auch so eine Sache die ich an Python schlecht finde fuer Anfaenger. Aber Du wirst damit zurecht kommen :shy:

    Zusammenfassung:
    Python ist fuer Anfaenger ungeeignet. Sie ist aber eine mächtige Programmiersprache fuer Profis und es gibt diverse erfolgreiche Grossprojekte die in Python implementiert sind/wurden. Aber man muss beruecksichtigen, dass eine typless Sprache einen anderen Programmierstiel erfordert. Wie immer hat eine jede Programmiersprache gewisse Vor-und Nachteile und sollte sorgsam fuer den Einsatzzweck gewaehlt werden. Deshalb finde ich Diskussionen - die Sprache X ist schlechter als Sprache Y - ziemlich witzlos.

    Falls Du Fragen zu Python hast - Du weisst ja dass Du hier eine grosse Gemeinschaft an Pythonkennern hast die Dir sicherlich gerne helfen werden :fies:

  • das Betriebssystem kümmert sich nicht immer ums schließen der Files

    ...können bei einem crash die .lck- und/oder die .pid-Dateien bestehen bleiben. Oder auch Files, die als "Flags missbraucht" werden, wie z.B. eine /tmp/myprog.run ...

    dann sollte man darüber nachdenken, wie ein Programm mit offenen Dateien umgeht beim crash etc. Sollte man sich mit ".lck", ".pid" etc. -Dateien beschäftigen oder überläßt man das dem Betriebssystem? Welche Dateien sollten geschlossen werden?

    Ziel ist meiner Ansicht nach, daß ein Programm unkompliziert zu bedienen ist und daß der Code übersichtlich und verständlich bleibt. Fehlerbehandlung ist eine zentrale Aufgabe.

  • Servus kle,

    Sollte man sich mit ".lck", ".pid" etc. -Dateien beschäftigen oder überläßt man das dem Betriebssystem? Welche Dateien sollten geschlossen werden?

    hier gings zuletzt um die File-Handles resp. die damit verbundenen Resourcen und dass die bei Programm-Ende aufgeräumt werden.

    Die Files stören nicht weiter und stehen halt nur als Müll auf der Platte rum. Und kümmern muss sich da zwangsläufig die Anwendung drum, denn nur die weiss, ob, wofür und wie lange die Files benötigt werden.

    Prinzipiell gilt - zumindest für mich: alle Files, die ich öffne, schliesse ich auch wieder, allen Speicher, den ich mit calloc() und Konsorten belege, gebe ich wieder frei ...

    Und ich denke, das sieht jeder so, der ernsthaft Anwendungen schreibt und ist wieder eine andere Baustelle ;)

    ciao,

    -ds-

  • Hallo zusammen,

    zu @framp's Gedanken zu typeless und OO-Programmierung:

    Meine ersten größeren Projekte hatte ich auf einem Amiga in der Programmiersprache Draco. Vielleicht kennt das noch jemand.

    Hierbei handelte es sich um eine Programmiersprache, bei der alle Daten mit Datentypen deklariert werden mussten, bevor sie mal eingesetzt werden durften. Das war also sehr vergleichbar mit C/C++ und pascal-oiden Programmiersprachen. Es gab aber auch ein Instrument, dass sich tpye cheat nannte.

    Für große Projekte halte ich das für einen sehr guten Ansatz - der einzig brauchbare Ansatz, wenn Projekte von mehreren Personen gleichzeitig betreut werden und jeder schnell den Code eines anderen verstehen können soll. Da muss zumindest ein gemeinsames Verständnis für die Definition der Schnittstellen und Datenstrukturen bestehen. Sonst wird das nichts.

    Bei der Entwicklung von Programmen, bei denen man sicher ist, dass die Entwicklungszeit wenige Tage oder Stunden nicht überschreiten wird, braucht man das alles nicht wirklich. Hier geht es darum, schnell ein Ergebnis zu haben, irgendwelche Daten zu konvertieren oder Datenbestand aus einer Software in Datenbestand einer andren Software zu wandeln. Es ist zwar schön, typisierte Variablen zu haben - dem Ergebnis (der fertigen Anwendung) sieht man in der Regel die Programmiersprache nicht an. Einen solchen Code kommentiert man ordentlich und dann versteht man den Code auch noch in Jahren - hoffentlich.

    Ein Anfänger ist sich meist nicht im Klaren, worauf er sich bei der Wahl einer Programmiersprache einlässt. Der Versuch mit Python zeigt meiner Meinung nach hier [in diesem Forum] aber, dass Python für Einsteiger und Programmieranfänger nicht geeignet ist. Zwar basieren einige Konzepte auf anderen Programmiersprachen (die Generatoren hat man sich z.B . aus Icon abgeschaut) - anderes klingt für mich nur schräg. Das mit den Tuple-Zuweisungen halte ich für keinen guten Weg. Was passiert, wenn einer der Werte nicht ermittelt werden kann? Man kann sich auf die Korrektheit eines Tupels nicht verlassen, nur weil einer zurückgeliefert wird.

    In einem früheren Beitrag hatte ich schon mal geschrieben, dass ich den Eindruck habe, dass hier im Forum die gängigen Programmiersprachen von nicht mehr als je 5 Personen gepflegt beherrscht werden. Der Rest ist auf Copy & Paste bestehender Code-Quellen angewiesen, um eigene Ideen zu verwirklichen.

    Das Interessante dabei ist, dass z.B. FreePascal/Lazarus in diesem Forum konsequent bekämpft wird. Hierbei handelt es sich meiner Meinung nach um eine sehr gelungene Umsetzung von Pascal in einer IDE, die ihresgleichen sucht. Allein das Konzept der Einbindung fertiger Packages in die IDE habe ich anderswo noch nicht gesehen. Dies ermöglicht es auch weniger erfahrenen Anwendern, sehr schnell zumindest mal gelungene Ansätze zu erzeugen. Nach Zusammenklicken der benötigten Packages und Zusammenklicken der Oberfläche steht das Gerüst, das dann nur noch gefüllt zu werden braucht. OK. Hierzu benötigt man dann wieder belastbare Fähigkeiten, die man nur auf die harte Tour erlernen kann.

    Da Lazarus hier in diesem Forum praktisch nicht präsent ist ( Timm Thaler : wie lange hältst Du noch durch?), hat sich in deren Forum der Raspberry Pi mittlerweile eine nicht ignorierbare Ecke geschaffen. Mit Ergebnissen übrigens, wogegen wir mit Blink-LEDs und sinnlosen Diskussionen ziemlich alt aussehen. Einer arbeitet momentan an der Programmierung von Atmels/Arduinos in FreePascal. Dazu hatte ich auch mal einen Link geschickt. (Das ist auch ein schönes Beispiel, was ein Forum schaffen kann, wenn sich die User nicht laufend in sinnlosen und hirnlosen Disputen ergeifern.


    Der Raspberry Pi ist ein interessantes Stück Technk - wir sollten uns aber gegenseitig mit Ideen befruchten, als unterhalb der Gürtellinie angreifen, nur weil jemand anderes gerade die besseren Argumente (besseren, schnelleren, strukturierteren, besser lesbareren Code) hat. Letztlich muss dann jeder Code-Schaffender selber entscheiden, mit welchen Mitteln er in welcher Zeit zu einem befriedigenden Ergebnis gelangen möchte. In den letzten Jahren habe ich viele Programmiersprachen kommen und gehen gesehen. C, Pascal waren damals schon da. In der Zwischenzeit wurden einige Programmiersprachen sinnlos gepuscht. Geblieben sind wenige davon, C, Pascal gibt's heute noch. An beiden Programmiersprachen führt meines Erachtens kein Weg vorbei, wenn man ernsthaft programmieren möchte.

    Hm ... vielleicht programmiere ich auch deshalb so gern in Icon - und damals in Draco - weil beide Sprachkonzepte ziemlich in der Mitte zwischen C und Pascal liegen. Nutzt die positiven Aspekte beider Programmiersprachen und vermeidet die Schwächen...

    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.

    2 Mal editiert, zuletzt von Andreas (29. Dezember 2017 um 12:17)

    • Offizieller Beitrag

    Ich als Nicht-Entwickler sehe Python sehr wohl als für Anfänger geeignet (ich hab damals mit C angefangen). Allerdings programmiere ich nicht um damit Geld zu verdienen sondern weil ich muss/will - damit die blöde LED blinkt, das Relais klickt oder sonst was. Für Python gibt es sau viel schon fertig in Form von Modulen - Ich muss nicht erst ellenlange Datasheets lesen nur damit der Sensor seinen Wert anzeigt (es zu können schadet nichts) sondern greif auf bestehendes zurück und adaptiere. Ich sehe mich selbst als erfahrenen Anfänger was programmieren angeht. Ich kann, was ich können muss um mein Ziel zu erreichen - nicht mehr nicht weniger. Ein grossteil der User hier hat noch viel weniger Ansprüche. Die finden was, was ihnen gefällt und wollen es dann anpassen - manche Arbeiten sich ein - 95% hoffen auf Fremde Hilfe und landen hier ;)

  • Ja, in Python geht das.

    Also Sorry, in Pascal geht das schon seit mindestens 20 Jahren. Halt nicht als Rückgabewert, sondern als Variable. Das liegt einfach an der Art, wie Prozeduren und Funktionen abgehandelt werden. Und das geht auch mit Arrays. Das geht sogar mit Arrays auf Mikrocontrollern. Also so der neue heisse Scheiss ist das auch wieder nicht.

    Jeder Programmierer benutzt Einrueckungen und muss dazu nicht gezwungen werden. Dadurch werden zwar die Anfaenger gezwungen...

    Meine Kritik ist nicht, ob Einrückungen erzwungen werden. Ada zwingt Dich auch zu Einrückungen, aber sowas von.

    Meine Kritik ist, dass Einrückungen die Programmsteuerung übernehmen und es dazu keine Kontrollinstanz gibt. Siehe obiges Beispiel, wann die for-Schleife zu Ende ist bestimmt allein die Einrückung, und nicht ein next, end oder schlimmstenfalls eine }.

    Wenn ich in Minecraft über x, y, z gehe und dabei noch ein paar ifs abfrage, habe ich auf kürzestem Raum 5 oder 6 Einrückungsebenen. Da wirds schon langsam unübersichtlich.

  • Das Interessante dabei ist, dass z.B. FreePascal/Lazarus in diesem Forum konsequent bekämpft wird.

    Hast Du den Eindruck? Ich denke eher, es wird einfach ignoriert.

    Pascal wurde ja immer als "Lehrsprache" belächelt. Und nachdem ich das einmal in der Schule, und rudimentär im Studium hatte, hab ich das fast 20 Jahre nicht wiedergesehen.

    Aber: Ich habe mir mit dem Schulwissen aus Pascal - Programmstrukturen, Variablentypen, überhaupt grundlegendes Herangehen... - diverse Basic-Dialekte, C, JavaScript, Assembler, und zuletzt Ada erarbeitet. Zugegeben alles Sprachen, die sich sehr ähnlich sind. Und mit dem Wissen kann ich auch ein Python-Programm nachvollziehen, ohne jemals ein Python-Buch in der Hand gehabt zu haben.

    Scheint also was dran zu sein an Pascal als Lehrsprache.

    Einer arbeitet momentan an der Programmierung von Atmels/Arduinos in FreePascal.

    Einer? Mir fallen spontan 3 ein, die da regelmäßig dran sind.

    • Offizieller Beitrag

    Das ; und {} wegfallen ist für mich eher Segen als Fluch. Grade bei mehreren if/while macht mich das Klammern suchen wahnsinnig. Da ist mir ne korrekte Einrückung deutlich lieber.

    Timm Thaler

    zum letzten mal. (wie oft muss man dir das sagen?) Editier deine Beiträge, anstelle immerzu neue zu erstellen.

  • Hi dbv,

    Das ; und {} wegfallen ist für mich eher Segen als Fluch. Grade bei mehreren if/while macht mich das Klammern suchen wahnsinnig.

    schönes Beispiel um aufzuzeigen, dass vieles wohl nur Gewohnheit ist ...

    Die Semikolon mache ich schon automatisch und die korrespondierenden Klammern findet vi ganz einfach mit dem %-Zeichen ...
    Und Pointer in C finde ich einfach nur geil ...

    ciao,

    -ds-

  • Das ist keine Meinung sondern Erfahrung

    Ich habe auch die Erfahrung, bei ROT über die Strasse oder Kreuzung ist zu überleben, eigene Erfahrung.

    Ich weiss nicht ob man das allgemeingültig weitergeben darf.

    PS die Phytonklammerei ist doch für den Allerwertesten, geht regelmäßig wie man hier sieht bei C&P schief, in C geklammert ist es schnurz sieht nicht schön aus funzt aber.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Hallo fred0815,

    ja, Du bist der einzige...;) In der IDE Geany (und anderen) kannst Du einstellen, dass nach Drücken von (, {, [, ", ' immer sofort das schließende Zeichen automatisch ausgegeben wird. Diese Konfiguration halte ich für sehr sinnvoll.

    Dann brauchst Du mit dem Cursor nicht eine Spalte zurückkgehen und kannst gleich loslegen. Und damit fängt die Konfiguration zur Vereinfachung erst an. Dann gibt es noch Snippets. Wenn Du Bruchstücke von etwas angibst, fügt Dir die IDE ganze Blöcke ein.

    Bei mir z.B.

    Ich tippe proc ENTER und auf dem Bildschirm steht:

    Code
    procedure ()
    
    end

    Der Cursor blinkt vor der runden Klammer und wartet auf Eingabe des Prozedur-Namens. Nach Drücken einer Tastenkombination springt der Cursor in die Klammer und erlaubt die Eingabe der Argumente.

    Das kannst Du mit jedem Konstrukt und jeder Funktion definieren...

    fred0815 Nö, bist Du nicht! :wink:

    Spielverderber. Gut, dann seid Ihr zu zweit... :^^:


    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 (29. Dezember 2017 um 15:07)

Jetzt mitmachen!

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