Hallo!
Ich dachte mit, ich beglücke euch auch mal mit der Erkenntnis, dass Python einfach besser ist.
In meinem Kurs zu statistischen Methoden in der CL wurde dieses Semester auf Python gewechselt, weil
Quote1. whitespace: nesting lines of code; scope
2. object-oriented: attributes, methods (e.g. line)
3. readable
und dem eigentlichen Grund (und das ist der einzig gute Grund): nltk, ein Toolkit zur Verarbeitung natürlicher Sprache.
Aber weil man sowas nicht einfach zugeben kann wurde noch ein objektiver Vergleich zwischen Perl und Python heran gezogen:
Python example
import sys
for line in sys.stdin.readlines():
for word in line.split():
if word.endswith(&âing&â):
print word
Perl exapmle
while (<>) {
foreach my $word (split) {
if ($word =~ /ing$/) {
print "$word\n";
}
}
}
Zu Perl gibts dann och die uns allen bekannten Schwächen:
Quote1. syntax is obscure: what are: <> $ my split ?
2. &âit is quite easy in Perl to write programs that simply look like raving gibberish, even to experienced Perl programmers&â (Hammond Perl Programming for Linguists 2003:47)
3. large programs difficult to maintain, reuse
Auf jeden Fall ist Python besser, wie ich jetzt festgestellt habe. Denn, im letzten Kurs wurde dieses tolle Stück Kode erschaffen um Buchstaben-Ngramme zu erstellen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def ngram(n, file):
    text = open(file).read()
    # n-1 Leerzeichen vor und nach Text einfuegen
    text = (n-1)*' ' + text + (n-1)*' '
    # Zaehler initialisieren
    C_h = {}   # Zaehler fuer Kontext/History
          #  (z.B. bei Trigram:  C(w1 w2)   )
    C_ngr = {}  # Zaehler fuer Ngram
          #  (z.B. bei Trigram:  C(w1 w2 w3)  )
          #  dictionary ueber Tupel aus h und letztem w
    vocab = {}  # Vokabular (dictionary mit Zaehlern)
    # Fenster von n Zeichen ueber den Text schieben
    for Ngram in [ text[i:i+n] for i in range(len(text)-n+1)]:
        # print 'Ngram: ' + Ngram
        (h, w) = (Ngram[:-1],Ngram[-1:])
        if w not in vocab:
            vocab[w] = 0.0
        vocab[w] += 1
        # Zaehler erhoehen (bzw. wenn noetig zuerst initialisieren)
        if h not in C_h:
            C_h[h] = 0.0
        C_h[h] += 1
       Â
        if (h,w) not in C_ngr:
            C_ngr[(h,w)] = 0.0
        C_ngr[(h,w)] += 1
    # Ergebnis: Tupel aus n und dictionaries von Zaehlern
    return (n, C_h, C_ngr, vocab)
Besonders gut hat mir dabei das ohne weiteres zu lesende Kostrukt hier gefallen:
# Fenster von n Zeichen ueber den Text schieben
for Ngram in [ text[i:i+n] for i in range(len(text)-n+1)]:
(h, w) = (Ngram[:-1],Ngram[-1:])
Das ist gleich viel leserlicher (für jemanden, der Python kann versteht sich)!
Ich bin ja mal echt gespannt wer das am Ende des Kurses so alles gut findet.
Ich hoffe, wir kommen noch von unseren Anfänger-Schwächen weg. So ist es z.B. unschön die verwendeten Variablen zu deklarieren (wenn man das so nennen möchte). Dazu aus einem Python-Forum (
http://forum.ubuntuusers.de/topic/78874/):
QuoteDie Frage ist, wie oft man solche Fehler [tipfhlr] macht, und ob das die Zeit rechtfertigt für alle Namen, bei denen man den Fehler nicht macht eine Deklaration vornehmen zu müssen.
AuÃerdem kommen wir den empfohlenen 50 Zeilen Kode pro Methode schon verdächtig nahe...
Aber ich gebe nicht auf. Als jemand dem Perl gut gefällt habe ich zwar so meine Probleme in Python rein zu kommen, aber es ist durchaus machbar. Ich vermisse die regulären Ausdrücke in bischen, dafür kann ich aber Strings als Objekte ansprechen. Nur Listen haben keine length() - Methode. Dafür gibt es len(Liste).
Nun gut, es wird schon gehen - bis zum Semesterende.
GrüÃe, pktm