Skip to content

daterem.py vs. daterem.pl ...

Ich muss bzw. darf mich mit der Programmiersprache Python auseinandersetzen. Was liegt da näher, ein selbstgeschriebenes Perl-Skript nach Python zu migrieren? Nichts. Also habe ich es getan.

Die Ergebnisse lassen sich auf GitHub sehen.

Kritik ist ausdrücklich erwünscht, ich kann davon nur lernen.

Diesen Artikel wollte ich nicht Python vs. Perl nennen, weil beide Programmiersprachen ihre Berechtigung haben und es gibt ja nicht wirklich einen Streit zwischen beiden, nur unterschiedliche Philosophien. Einer von vielen Gründen ist, dass Perl von einem Linguisten - Larry Wall - entwickelt wurde und Python von einem Mathematiker - Guido van Rossum.

So, hier kommen die Dinge, die mir beim Umschreiben aufgefallen sind. Achtung! Ich bin kein Programmierer, sondern eher ein Skripter ...

Die folgenden Punkte kann meiner Ansicht nach Python besser:
  • Datumshandling mit mitgelieferten Bibliotheken: das Modul time ist doch deutlich komfortabler als das Perl-Pendant Time::local (zum Wert für Monat muss 1 und zum Wert von Jahr muss 1900 addiert werden).
  • Struktur: Da Bei Python die Einrückungen eine Rolle spielen, kann auf geschweifte Klammern für Codeblöcke verzichtet werden, das gefällt mir richtig gut.
  • Listen: Der Umgang mit Listen gefällt mir auch besser als bei Perl, aber ich gebe zu, dass das Geschmackssache sein könnte.


Aber auch Perl hat seine Stärken:
  • Reguläre Ausdrücke, nun, was soll ich schreiben, reguläre Ausrücke gehen direkt und wesentlich unkomplizierter als bei Python, wo sie per Modul nachgerüstet werden müssen. Es hat einen Grund, dass es einen Namen gibt "PRE - Perl Regular Expressions".
  • Variablenhandling: Ich habe mich daran gewöhnt, dass ich eine Variable sowohl als String wie auch als Zahl verwenden kann, ohne umwandeln zu müssen. Gut, Python ist schwach typisiert, aber wenn der Typ feststeht, muss man konvertieren.
  • Assoziative Arrays gefallen mir deutlich besser als Dictionaries, das ist wieder einmal Geschmackssache.
  • Nachgestelles "if" print $a if ($a == $b) ist wirklich hübscher als ein Mehrzeiler.


Es gibt gute Gründe, die zu den Entscheidungen in den Programmiersprachen geführt haben. Ich möchte auch nicht in "besser" oder "schlechter" einteilen, das ist doof. Alles, was man mit der einen Programmiersprache erledigen kann, kann man auch mit der anderen tun.

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Kai Wolf am :

*Hallo Dirk,

ein paar Anmerkungen:

Verwende für die Dokumentation statt diesen ### doch lieber
CODE:
def foo()
   """ my foo doc """

Das ist PEP8 Standard und taucht damit auch z.B. in der Hilfe von vielen Python IDEs auf, wenn die Funktion aufgerufen wird.

Du kannst noch ein
CODE:
ifdef __name__ == "__main__":
    main()

in deinem Skript ergänzen, dann lässt sich das besser als Modul in andere Pythonskripte importieren bzw. einfach von der Kommandozeile starten, da beim Aufruf deines Skripts automatisch main() aufgerufen wird.

Dirk Deimeke am :

*Ich hatte das so verstanden, dass längere Kommentare in dreifache Anführungszeichen eingeschlossen werden und kürzere nur mit dem Nummernzeichen markiert werden.

Momentan sind ja nur sehr wenige Kommentare enthalten, wenn es mehr wird, ändere ich das gerne.

Den Test habe ich direkt aufgenommen und Dich im Commit erwähnt.

Danke!

freiheit am :

*'Ich möchte auch nicht in "besser" oder "schlechter" einteilen, das ist doof.'

Danke für diesen wirklich wahren Satz, welcher nicht nur hier, sondern viel öfters Anwendung finden sollte! Und zwar universell. Wie oft denken wir in "Richtig und Falsch", dabei ist es oft nur ein "Anders"

Matthias Gutjahr am :

*Ich meine, in Python geht auch sowas wie
CODE:
print (a if b else 0)
, aber ich bin auch kein Python-Experte.

Dirk Deimeke am :

*Ja, das funktioniert.

Cool, danke! Ich muss mal herausfinden, ob das nur für print funktioniert oder auch für andere Kommandos.

dpausp am :

*print $a if ($a == $b) in Perl entspricht in Python:

if a == b: print(a)


"a if b else 0" ist einfach ein Ausdruck, der überall geht und hat nicht speziell mit print zu tun. Das ist hier das Argument, welches der print-Funktion übergeben wird.

Sowas ist z.B. recht praktisch, wenn man nicht weiß, ob in der Liste ein Element ist oder nicht:

elem = liste[0] if liste else None

Dirk Deimeke am :

*Es geht um das "nachgestellte if".

if a == b: print(a)
entspricht
if ($a == $b) {print $a};

Die geschweiften Klammern können beim "nachgestellten if" entfallen.

Das unten stehende Konstrukt kann Perl natürlich auch:

my $elem = @liste ? $liste[0] : undef;
oder
my $c = $a == 10 ? $b : $a;

Saddy am :

*Das Folgende ist auch ein gültiger Python-Ausdruck:

a = 1 if True else 2

Sebstian am :

*Python ist dynamisch aber stark typisiert. Starke Typisierung hat den Vorteil, dass keine Variablen implizit konvertiert werden. Ich sehe das als grosse Staerke von Python. Bei PHP ist das ein erhebliches Problem, so werden dort Strings wie "1235" bei Vergleichen in Zahlen umgewandelt. Wenn die Zahl lang ist, wird abgeschnitten, weil float nicht unbegrenzte Laenge hat. Siehe zu den Problemen schwacher Typisierung in PHP zB hier:
https://stackoverflow.com/questions/22140204/why-md5240610708-is-equal-to-md5qnkcdzo
http://www.darkreading.com/vulnerabilities---threats/php-hash-comparison-weakness-a-threat-to-websites-researcher-says-/d/d-id/1320353
Wenn man weiss, was man tut, ist das kein Problem. Andernfalls kann es immer noch als Fehler passieren.

http://www.sitepoint.com/typing-versus-dynamic-typing/

Dirk Deimeke am :

*Es ist im Grossen und Ganzen auch eine Philosophie-Frage. Es gibt sehr gute Gründe für die verschiedenen Sichtweisen.

Wenn Du von einer Sprache kommst, wirst Du immer Punkte finden, die ungewohnt sind.

Sebastian am :

*Mir ging es primaer darum, dass du im Artikel Python als schwach typisiert bezeichnet hast.

Dirk Deimeke am :

*Du hast natürlich Recht, ich habe das mit expliziter Typisierung durcheinander geworfen.

Kommentar schreiben

Gravatar, Favatar, Pavatar, Identica, Twitter, MyBlogLog Autoren-Bilder werden unterstützt.
BBCode-Formatierung erlaubt
Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
:'(  :-)  :-|  :-O  :-(  8-)  :-D  :-P  ;-) 
Formular-Optionen