Für was nutzt ihr Python?



  • Aus aktuellem Anlaß: was macht folgender Code?

    def f(a):
      def g():
        print a
      return g
    f(42)()
    

    Klar, gibt 42 aus. Und was macht das hier?

    def f(a):
      def g():
        print a
        a = 0
      return g
    f(42)()
    
    UnboundLocalError: local variable 'a' referenced before assignment
    

    Python ist auf so viele Weisen kaputt, ich weiß gar nicht, wo anfangen 😞

    Workaround in Python 3 ist mit nonlocal möglich, in Python 2.7 gar nicht. Der übliche Vorschlag ist, daß man in f ein Dictionary anlegen soll, in das man dann in g reinschreiben kann.



  • Wobei ich das jetzt nicht so tragisch finde. Es gibt viel magic mit Variablen, die tut meistens das passende - aber halt leider nicht immer.

    Das implizite deklarieren von Variablen ist manchmal halt doof.

    Prinzipiell einfach keine Zuweisungen an Argumente machen 😉

    Ich bevorzuge folgende Lösung:

    def f(a):
      a=[a]
      def g():
        print a[0]
        a[0] = 0
      return g
    f(42)()
    

    oder

    def f(a):
      f.a=a
      def g():
        print f.a
        f.a = 0
      return g
    f(42)()
    

    Oder aber direkt gleich eine Klasse statt einer Funktion nehmen

    class fClass(object):
      def __init__(self,a):
        self.a=a
      def __call__(self):
        print self.a
        self.a=0
    
    fClass(42)()
    

    Aber klar, automagische Sachen können manchmal nervig sein und variablen deklarationen wären in der Tat sehr praktisch.



  • Shade Of Mine schrieb:

    Prinzipiell einfach keine Zuweisungen an Argumente machen 😉

    Mit einer lokalen Variable von f hättest du dasselbe Problem.

    Shade Of Mine schrieb:

    def f(a):
      f.a=a
      def g():
        print f.a
        f.a = 0
      return g
    f(42)()
    

    Schön, das kannte ich noch nicht, und das werde ich benutzen. Danke!



  • audacia schrieb:

    Shade Of Mine schrieb:

    def f(a):
      f.a=a
      def g():
        print f.a
        f.a = 0
      return g
    f(42)()
    

    Schön, das kannte ich noch nicht, und das werde ich benutzen. Danke!

    Achtung, a ist dadurch "public property" von f. Und du kannst
    print f.a
    auch außerhalb von f machen.



  • Phyton ist für mich maximal für ein mathematisches script interessant, weil Dinge wie Mengen und Complexe zahlen direkt in der Sprache sind.
    Phython für etwas produktives einzusetzen fällt mir hoffentlich nicht in meinem schlimmsten Alptraum ein. (Es sei denn ich möchte jemanden verarschen)

    Das mag subjetiv sein, aber es gibt auch ohne Ende objektive Gründe, die hier bestimmt schon genannt wurden.



  • Shade Of Mine schrieb:

    Achtung, a ist dadurch "public property" von f.

    Das wird ja immer schlimmer 😞 Die Syntax sah für mich aus wie eine explizite Scoping-Methode. Aber wozu soll das mit den Funktions-Membern gut sein? Für diesen Anwendungsfall gibts doch class .

    Allerdings hat Python eh ein gestörtes Verhältnis zur Kapselung. Konstanten und Variablen innerhalb eines Moduls sind ja auch unweigerlich public, und private Funktionen definieren ist nicht vorgesehen. Und das Lustigste ist, wenn man auf Stackoverflow fragt, was der Blödsinn soll, bekommt man nur you're holding it wrong zur Antwort. "Python drops that pretence of security and encourages programmers to be responsible." 🤡

    Ich nehme dann jedenfalls eine lokale Klasse und wundere mich weiterhin, warum so viele nützliche Bibliotheken gerade für diese Sprache geschrieben werden mußten.



  • krümelkacker schrieb:

    Julia find ich interessant als Ersatz für Python / Matlab / GNU Octave, weil es generische Programmierung anscheinend besser unterstützt (Yay multiple dispatch!) und weil es JIT-kompiliert wird und daher nicht so lahmarschig ist.

    Ich hoffe auch, dass die Entwicklung von Julia schneller voran geht und man die Sprache stabil für alles nutzen kann. Gerade die Geschwindigkeit und die super Unterstützung für viele mathematische Operationen ist genial.

    Für kleinere Skripte wäre Python eigentlich super und ich finde die große Unterstützung durch so viele Bibliotheken und die große Community super. In meinem Bereich findet Python auch leider sehr viel Verwendung. Es stören mich aber ein paar Dinge an Python:

    - Einrücken für Code-Blöcke
    - ziemlich langsam
    - 2.x-irgendwas hauptsächlich genutzt und 3.x eigentlich die neuste Version

    Die Inkompatibilität zwischen den Versionen und dann noch diese ganzen unterschiedlichen Interpreter, die irgendwas aber nie alles unterstützen, kombiniert mit "white space statt Klammern oder begin/end" und die weniger gute Performance schrecken mich persönlich ziemlich von Python ab.

    Meine bisher einzigen Alternativen sind Lua (viel genutzt aber sehr schlechte Ressourcen), Javascript (node.js ist ganz cool aber Javascript ist bei Desktop-Anwendungen eher zum skripten von GUIs geeignet und hat dafür aber schlechte Mathe- und I/O-Unterstützung) und Julia. Letzteres kombiniert die Stärken von Python mit einer angenehmeren Synthax und besserer Perfomance, ist aber noch zu jung und nicht weit genug entwickelt/angenommen. Ansonsten wäre es genau das, was ich brauche.



  • audacia schrieb:

    Shade Of Mine schrieb:

    Achtung, a ist dadurch "public property" von f.

    Das wird ja immer schlimmer 😞 Die Syntax sah für mich aus wie eine explizite Scoping-Methode. Aber wozu soll das mit den Funktions-Membern gut sein? Für diesen Anwendungsfall gibts doch class .

    Weil Funktionen auch nur Objekte sind 😉

    Allerdings hat Python eh ein gestörtes Verhältnis zur Kapselung. Konstanten und Variablen innerhalb eines Moduls sind ja auch unweigerlich public, und private Funktionen definieren ist nicht vorgesehen.

    Ja, es gibt keine access privileges. Das hat vor und nachteile. Ich habe beruflich viel mit JavaScript zu tun, das hat das auch nicht, bietet aber moeglichkeiten an den Zugriff zu unterbinden in dem die Sichtbarkeit weggenommen wird.

    Meine Python Projekte waren aber nie so gross dass es notwendig war hier wirklich hart zu kapseln. Aber vermutlich gehen die selben Tricks wie in JavaScript auch in Python - indem man die Sichtbarkeit unterbindet.

    Ich nehme dann jedenfalls eine lokale Klasse und wundere mich weiterhin, warum so viele nützliche Bibliotheken gerade für diese Sprache geschrieben werden mußten.

    Ach, ich finde Python ganz angenehm. Ich finde aber eher die Libraries furchtbar designed. Die sind zwar teilweise enorm praktisch, aber das Design ist zum grausen 😞

    Wofuer verwendest du Python denn?
    Ich schreibe damit eigentlich nur System Maintenance Scripte.



  • Shade Of Mine schrieb:

    Weil Funktionen auch nur Objekte sind 😉

    D.h., class ist nur Syntaxzucker, und eigentlich ist Python wie Javascript? WTF.

    Nein, ich weiß schon, daß class mehr kann. Aber trotzdem, das kommt davon, wenn jemand everything is an object zu wörtlich nimmt und nicht weiß wozu.

    Shade Of Mine schrieb:

    Ach, ich finde Python ganz angenehm.

    Ja, wie gesagt, für Hello-world-Projekte ist es supereinfach, und als Taschenrechner on steroids auch gut geeignet dank NumPy. Und halt zum Plotten, weil MatPlotLib einfach schöne Plots erzeugt. Aber schon als Taschenrechner fand ich R schöner. Nur ist das leider nochmal eine Größenordnung langsamer.

    Shade Of Mine schrieb:

    Ich finde aber eher die Libraries furchtbar designed. Die sind zwar teilweise enorm praktisch, aber das Design ist zum grausen 😞

    Kein Wunder, wenn die Sprache genauso ist.

    Shade Of Mine schrieb:

    Wofuer verwendest du Python denn?

    Wissenschaftliches Rechnen. Das Numbercrunchingzeug mache ich in C++ (oder Fortran, wenn es da noch überlieferten Code gibt), und für High-level-Ablaufssteuerung und zum Plotten benutze ich eben Python. Hauptgrund ist, daß a) hier alle das benutzen und b) MatPlotLib gute Ergebnisse produziert. Dank PTVS ist das cross-language debugging relativ schmerzlos. Aber die Sprache macht mich trotzdem regelmäßig schaudern.

    Früher hab ich auch mal an einem Bildverarbeitungsprojekt gearbeitet, das Python benutzte. Mein voriger Post zum Thema beschreibt meine Eindrücke davon. Damals habe ich auch mit Python for .NET rumgespielt, was eine recht angenehme Brücke zwischen CPython und .NET zu sein versprach. Leider hat das in komplexeren Projekten nie fehlerfrei funktioniert, so daß ich angesichts meiner Deadline das gemacht habe, was Pythonprogrammierer immer machen: meine Programmbestandteile in verschiedene Prozesse zerlegt, die über Kommandozeilenargumente und Dateien interagieren 😞

    Julia beobachte ich auch mit Interesse. Ein, zwei Jahre soll es noch reifen, dann sehe ichs mir mal näher an.



  • Ich würde gerne noch eine weitere Frage in den Raum werfen - was nutzt ihr so als Alternative für Python? Da die Begeisterung hier nicht so groß ist für Python, würde mich gerne interessieren, was ihr so für kleine Skripte oder Projekte verwendet.


Anmelden zum Antworten