Der Arbeitsalltag eines Wissenschaftlers besteht vor allem aus einem: Daten in einem Format einlesen, irgendwie verarbeiten, und wieder irgendwie ausgeben, sei es in einem anderen Format oder als Bild. Da man das sowieso auch in den einfachsten Fällen meistens etwa sechsunddreissig Mal falsch macht, und die Bilder eh alle neunzehn Mal, daher ist es ratsam, sich gleich ein Skript für alle Arbeiten zu schreiben. Das ist dann besser, weil man zwar initial ein bißchen mehr Arbeit reinsteckt, aber später wenigstens noch leicht neu rechnen oder modifizieren kann, was man da gemacht hat.
Ich würde außerdem immer raten, auf freie Software zu setzen. Auch wenn ihr jetzt eine Matlab-Lizenz habt, vielleicht ändert das sich mal, und dann tretet ihr alle eure Skripte in die Tonne – grad Matlab hat teure Lizenzen, und ihr wisst nicht ob eure Uni die immer weiter bezahlt oder reduziert oder ob euer nächstes Institut das überhaupt hat.
Besonders bieten sich Skriptsprachen an, denn sie bieten gegenüber herkömmlichen Programmiersprachen wie C++ oder Java den Vorteil, nicht immer kompiliert werden zu müssen sondern einfach gleich ausführbar sind. Außerdem sind sie drauf angelegt, viele Werkzeuge zu bieten die Datenverarbeitung einfacher machen.
Ich habe viel mit Perl gearbeitet, bin aber seit kurzem voll auf Python umgestiegen. Das bietet die umfangreichsten Werkzeuge, auch bis hin zu vollständigen wissenschaftlich-mathematisch Bibliotheken und umfangreichen und im einfachsten Fall in zwei Zeilen implementierbaren Plotfunktionen. Diese Funktionen sind in den SciPy/NumPy/matplotlib-Bibliotheken vereint.
Grundsätzlich gehe ich von Linux aus, alles andere taugt nicht. Linux bietet in der Kommandozeile die nötigen Programme, um ohne Dauerklickerei alles zu erledigen, was man bei der Datenverarbeitung tun möchte. Daher gehe ich einfach mal davon aus, dass Linux und Python installiert sind.
Ein einfacher emacs mit Python-Mode leistet auch beste Dienste dabei, die Einrückungen in Python einfach hinbekommen zu können. Es gibt für komplexere Programme auch PyDev für Eclipse, das funktioniert auch ganz gut. Aber außer Java scheint in Eclipse nichts so richtig gut zu funktionieren.
Python ist aktiv in Entwicklung, aber Version 2.4 sollte mindestens vorhanden sein. Die neuere, 2.5, hat durchaus mehr “convenience functions”, daher, wenn mal etwas nicht funktioniert darin, einfach mal schauen ob es wegen der Version ist.
Grundsätzlich schreibt man Python genau wie andere Programmiersprachen, mit wenigen Besonderheiten, und auch ein paar Eigenheiten die einem mal den Tag versauen können wenn man sie noch nicht kennt. Aber die Vorteile überwiegen: Dadurch, dass es nicht geschweifte Klammern {} eingesetzt werden um Blöcke zu markieren, und Zeilen nicht mit ; beendet werden müssen, sondern stattdessen strenge Einrückung als Markierung dient, schreibt man quasi ab-initio übersichtlichen Code.
Man kann für einfache Fälle ein Skript einfach am Stück runterschreiben, einfach ein paar Befehle aneinanderreihen. Python ist aber eigentlich voll objektorientiert, man sollte für größere Probleme also die Objektorientierung nutzen, das ist auch sehr einfach.
Das Variablensystem ist flexibel in Python, Variablen werden mit der ersten Verwendung initiiert. Die Typen int, float, string gibt es aber doch und man muss leider öfters einmal casten oder aufpassen, beim Teilen /2. zu schreiben statt /2 um floats zu erhalten. Das ist in Perl schöner, da kann man wirklich fast beliebig schlampig sein mit den Typen und doch klappt es. Ich schreibe jetzt pur aus der Sicht eines Anwenders, der mit einer Sprache arbeitet ohne große das Konzept dahinter zu inhalieren. Ich weiß, dass Python ein strenges Konzept hat, ist ja auch gut so, aber manchmal reibt das sich halt mit meiner Vorstellung.
Weitere Reibungen sind z.B. dass in Klassen ständig self verwendet werden muss, wie this in C++/Java, aber man muss es immer schreiben, auch einmal in jeder Funktionsdefinition. Das ist etwas lästig manchmal. Und aufpassen: Python übergibt Variablen NUR per Referenz. Das hat mich vor kurzem einen Tag gekostet: Ich wollte eigentlich nur ein Objekt ein paar Mal kopieren und in eine Liste stecken. Dann sollte jedes Listenelement einen anderen Weg gehen, und ich wusste nicht, dass das Objekt nicht als Kopie in die Liste gesteckt wird, (dazu braucht man das copy-Modul), sondern nur eine Referenz. Das heißt, die Änderungen an einem Listenelement haben die anderen mit verändert. Naja, normaler Lernprozess an einer neuen Sprache, aber findet so etwas mal raus…
Ok, vielleicht doch ein Beispiel dazu:
class TestObject: def __init__(self, value, text=""): self.value = value self.text = text def output(self): print self.value, self.text def doubleList(list): newList = [] for element in list: newList.append(element) element.value += 1 newList.append(element) return newList def main(): t1 = TestObject(1) t2 = TestObject(5,"Hallo") t3 = TestObject(value=10, text="ScienceBlogs") tList = [t1,t2,t3] dList = doubleList(tList) for e in dList: e.output() if __name__ == "__main__": main()
Sehen wir zuerst kurz an den Schluss:
Kommentare (10)