Me too, aber Kritik gibts trotzdem.
Folie 4: Interpretierter Bytecode (vgl. Java/.NET). Um Kritikern gleich einen
Dämpfer zu verpassen.
Folie 6: Vielleicht `ctypes`, `pyrex`, `numpy` erwähnen.
Folie 7: Wenn ``python hallo_welt.py`` benutzt wird, hätte man sich das ausführbar machen sparen können.
Folie 8: Die Frage könnte man auch bei `raw_input()` mit angeben.
Folie 9 und 10: Wenn die schon Programmiersprachen kennen, könnte man hier vielleicht den Begriff Variable kurz aufdröseln und zum Beispiel Java mit Python vergleichen. Also Variable ist Verbund aus Name, Typ, Objekt und bei Java "hängt" der Typ fest am Namen während er bei Python fest am Objekt hängt. (Bei Java hängt er auch noch einmal am Objekt. Bäh, Redundanz.

)
Folie 22: *Flache* Kopie einer Liste. Evt. ``s2 = list(s1)`` als Alternative.
Folie 23: Andere Objekte von *eingebauten* Datentypen werden zu `True` ausgewertet. Verhalten kann bei Klassen beliebig implementiert werden. (`__len__()` oder `__nonzero__()`)
Folie 28: `range()` liefert *immer* eine Liste. Die Formulierung auf der Folie könnte man so interpretieren, dass `range()` in ``for``-Schleifen keine Liste erzeugt. Evt. `xrange()` erwähnen.
Bei den Folien zu Funktionen könnte man noch erwähnen, das Funktionen selbst Objekte sind und "herumgereicht" werden können.
Folie 41: Der Fall das man mehrere Namen aus einem Modul mit einer Anweisung importieren kann fehlt. Vielleicht das dritte Beispiel um eine Zeile verkürzen:
Folie 43: `os.path` ist ein schlechtes Beispiel für Pakete, weil es gar keins ist:
Code: Alles auswählen
In [257]: os.path
Out[257]: <module 'posixpath' from '/usr/lib/python2.5/posixpath.pyc'>
Das `os`-Modul importiert einfach ein anderes Modul, je nach Betriebssystem zum Beispiel `posixpath` oder `ntpath`, und bindet es an `os.path`.
Folie 66: Evt. ``<``/``>`` für echte Teil- oder Obermenge erwähnen.
Folie 70: Typo: 'zu eigenem Datentyp'
Folie 71: Weiss nicht ob das Anfänger in so einem Vortrag eher verwirrt, aber meine Lieblingsklasse für einfachen ``struct``-Ersatz ist folgende:
Code: Alles auswählen
class Bunch(object):
def __init__(self, **wargs):
self.__dict__.update(kwargs)
punkt = Bunch(x=2.0, y=3.3)
print punkt.x, punkt.y
Folie 72: (pingelig) `__init__()` wird *nach* Erzeugung des Objekts aufgerufen.
Folie 81: Da Dein Publikum Javaprogrammierer enthält, solltest Du hier vielleicht den Sinn von `classmethod`\s und `staticmethod`\s erklären, damit die nicht anfangen aus Gewohnheit simple Funktionen auf biegen und brechen in Klassen zu pferchen.
Gute Beispiele sind alternative Konstruktoren wie zum Beispiel eine `load()`-Methode, die ein Objekt aus einer Datei erstellt. Oder bei einer Punktklasse ein `from_polar()` als Alternative zu kartesischen Koordinaten. Beispiel bei den eingebauten Typen ist `dict.fromkeys()`.
Folie 86 ff.: Ein wenig religiös, aber `__value` sollte man sich reiflich überlegen. `_value` tut es auch. Bei `__value` kann man bei Unterklassen nur noch über getter und setter ohne "Verrenkungen" auf den Wert zugreifen, bei `_value` käme man auch so noch dran. Und wenn man ein `property()` benutzt, würde ich die getter und setter "privat" machen.
Code: Alles auswählen
class Spam(object):
def __init__(self):
self._value = 0
def _get_value(self):
return self._value
def _set_value(self, value):
self._value = max(0, value)
value = property(_get_value, _set_value)
Um die getter und setter nicht öffentlich zu machen, kann man sie auch mit diesem Trick kapseln:
Code: Alles auswählen
class Spam(object):
def __init__(self):
self._value = 0
@apply
def value():
def fget(self):
return self._value
def fset(self, value):
self._value = max(0, value)
return property(**locals())
Folie 106: Beim `cvs` kann man Anwender häufig überzeugen, dass es besser ist als selber zu splitten in dem man mal ein nicht-triviales Beispiel zeigt. Zum Beispiel diesen *einen* Datensatz mit *zwei* Spalten der auf zwei Zeilen verteilt ist:
"Freddie ""Nightmare"" Krueger", Jr.","Elm Street 42,
Springfield"
-> ['Freddie "Nightmare" Krueger, Jr.', 'Elm Street 42,\nSpringfield']
Einen Schreiber/Parser dafür möchte man nicht selbst implementieren.
Folie 108: `pickle`-Dateien im Binärmodus öffnen.
Folie 113: Hier nicht wirklich nötig, aber man sollte "raw"-Zeichenketten nehmen wenn Backslashes im Ausdruck vorkommen.
Folie 128: Typo in Überschrift.
Folie 129: Nach ``lamda`` hätte man noch "closures" erwähnen können. Und vielleicht `functools.partial()` bei Python 2.5.
Folie 134: Optionaler startwert für `reduce()`, damit's auch mit leeren Listen klappt.