Thread Python rockz! (82 answers)
Opened by pktm at 2007-06-03 17:08

pktm
 2007-06-03 17:08
#23740 #23740
User since
2003-08-07
2921 articles
BenutzerIn
[Homepage]
user image
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
Quote
1. 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:
Code: (dl )
1
2
3
4
5
6
7
Python example

import sys
for line in sys.stdin.readlines():
for word in line.split():
if word.endswith(&’ing&’):
print word


Code: (dl )
1
2
3
4
5
6
7
8
9
Perl exapmle

while (<>) {
foreach my $word (split) {
if ($word =~ /ing$/) {
print "$word\n";
}
}
}


Zu Perl gibts dann och die uns allen bekannten Schwächen:
Quote
1. 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:

Code: (dl )
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:

Code: (dl )
1
2
3
# 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/):

Quote
Die 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
http://www.intergastro-service.de (mein erstes CMS :) )

View full thread Python rockz!