Im Oktober halte ich auf der Arbeit einen zweitägigen Python-Kurs für Leute mit Programmierkenntnissen in anderen Sprachen.
Materialien (ganz unten)
Den Anhang plane ich nicht vorzutragen, er ist nur fuer den Fall da, dass ich doch noch Zeit ueberhabe, Fragen dazu aufkommen und fuer Leute, die sich die Materialien nochmal ansehen. Eventuell gibt's noch eini paar mehr Aufgaben zur stdlib.
Ich bin ja mal gespannt, bisher habe ich ja nur sehr wenige Teilnehmer, aber ich freu mich trotzdem schon. Gegen die Java-Dominanz in meiner eigenen Abteilung bin ich aber leider machtlos.
Einfuehrung in Python (fuer Programmierer)
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Rebecca!Rebecca hat geschrieben:Materialien
Ich habe mir "vortrag.pdf" von vorne bis hinten durchgesehen. Finde ich toll.
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
kann man sich da noch anmelden zu dem Kurs?
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:
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:
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.
Um die getter und setter nicht öffentlich zu machen, kann man sie auch mit diesem Trick kapseln:
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.
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:
Code: Alles auswählen
from math import pi as PI, sin
Code: Alles auswählen
In [257]: os.path
Out[257]: <module 'posixpath' from '/usr/lib/python2.5/posixpath.pyc'>
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 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)
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())
"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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Wow, ich sehe du hast das mit Beamer gemacht. Ich werde morgen auch eine Präsentation unter Ausnutzung von Beamer machen, aber so genial schaut die nicht aus Respekt.
Ich war nicht ganz so fleissig wie BlackJack und Gerold und habe die meisten Folien nur überflogen, aber einige Dinge habe ich dennoch gefunden.
Folie 67: Dictionaries hast du klein geschrieben.
Folie 120: Da müsste ``Tk`` hin, denn alles andere sind ja auch Toolkits und nicht die entsprechenden Bindings.
Folie 121: Statt Karrigell würde ich eher Pylons hinschreiben. Oder Werkzeug. Oder auch CherryPy. Statt Kid Genshi. Statt Cheetah vielleicht auch Mako
Ich war nicht ganz so fleissig wie BlackJack und Gerold und habe die meisten Folien nur überflogen, aber einige Dinge habe ich dennoch gefunden.
Folie 67: Dictionaries hast du klein geschrieben.
Folie 120: Da müsste ``Tk`` hin, denn alles andere sind ja auch Toolkits und nicht die entsprechenden Bindings.
Folie 121: Statt Karrigell würde ich eher Pylons hinschreiben. Oder Werkzeug. Oder auch CherryPy. Statt Kid Genshi. Statt Cheetah vielleicht auch Mako
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hallo Leonidas!Leonidas hat geschrieben:Statt Cheetah vielleicht auch Mako
Aber jetzt übertreib mal nicht.
lg
Gerold
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Sieht wirklich top aus.
Auch von mir einige Anmerkungen:
10: Evtl. string+int zeigen -> TypeError.
12: Link zu docs.python.org/dev (Momentan frisch, shameless plug
16: complex.real und complex.imag erwähnen? Leerzeichen nach "größeren".
18: "s.index"?
Ein sehr wichtiger Punkt fürs Verständnis ist oft, dass es keinen grundlegenden Unterschied zwischen "mutablen" und "immutablen" Typen gibt und der Unterschied nur in der Verfügbarkeit von ändernden Operationen liegt.
29: break und continue?
39: iterieren über Dateiobjekte?
44: Man kann erwähnen, dass auch "def" und "class" Toplevel-Anweisungen sind.
67, 68: sollte man die "iter...()"-Methoden nicht erwähnen, zumindest iteritems().
78: "__le__" zweimal aufgelistet.
84: "Methoden werden nur nach ihrem Namen unterschieden,
nicht nach Art und Anzahl Parameter!" ist IMHO etwas irreführend. Wenn das Publikum mit Java vertraut ist, vielleicht "Kein Überladen von Methoden möglich"?
109: Die Semantik von "writeback" ist recht speziell (mutable vs. immutable); evtl. weglassen?
127: "Dictionairies" (2x), "Paramter".
136: "iterierbares Objekt" als Übersetzung von Iterator? Im Englischen ist ein "iterable" etwas, das __iter__ hat, ein "iterator" etwas, das next (und __iter__) hat.
138: "yield" ist seit 2.5 ein Ausdruck.
Auch von mir einige Anmerkungen:
10: Evtl. string+int zeigen -> TypeError.
12: Link zu docs.python.org/dev (Momentan frisch, shameless plug
16: complex.real und complex.imag erwähnen? Leerzeichen nach "größeren".
18: "s.index"?
Ein sehr wichtiger Punkt fürs Verständnis ist oft, dass es keinen grundlegenden Unterschied zwischen "mutablen" und "immutablen" Typen gibt und der Unterschied nur in der Verfügbarkeit von ändernden Operationen liegt.
29: break und continue?
39: iterieren über Dateiobjekte?
44: Man kann erwähnen, dass auch "def" und "class" Toplevel-Anweisungen sind.
67, 68: sollte man die "iter...()"-Methoden nicht erwähnen, zumindest iteritems().
78: "__le__" zweimal aufgelistet.
84: "Methoden werden nur nach ihrem Namen unterschieden,
nicht nach Art und Anzahl Parameter!" ist IMHO etwas irreführend. Wenn das Publikum mit Java vertraut ist, vielleicht "Kein Überladen von Methoden möglich"?
109: Die Semantik von "writeback" ist recht speziell (mutable vs. immutable); evtl. weglassen?
127: "Dictionairies" (2x), "Paramter".
136: "iterierbares Objekt" als Übersetzung von Iterator? Im Englischen ist ein "iterable" etwas, das __iter__ hat, ein "iterator" etwas, das next (und __iter__) hat.
138: "yield" ist seit 2.5 ein Ausdruck.
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Das haette ich von dir auch nicht anders erwartet.BlackJack hat geschrieben:aber Kritik gibts trotzdem.
Vielen Dank an alle fuer die umfangreiche Kritik, da werde ich mich mal in Ruhe durcharbeiten.
@Leonidas: Ich habe das Theme "Singapore" verwendet, so wie es mitgliefert wird, das ist also nicht mein Verdienst. Die listings-Umgebung hab ich allerdings etwas angepasst, damit das Python-Highlighting schoen bunt ist (sieht jetzt so aehnlich aus wie im Emcas ).
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Hoi Rebecca,
super Vortrag! Drücke die Daumen, daß es alles klappt!
Zum eigentlichen Vortrag kann man nicht mehr viel sagen - das ist ja schon abgegrast . Außer vielleicht, daß ich das "import numeric" vielleicht zu "import numpy" ändern würde: Es gibt Numeric (veraltet) und numpy, aber kein numeric. So stiftest Du mit ein bißchen Pech Verwirrung.
Zu Übung 1:
Übung 1, Aufgabe 2.2: Ändern zu: "Ändern sie das obige Programm, so dass es Folgendes ausgibt:"
Übung 1, Aufgabe 9: Palyndrom -> Palindrom
Wollte mich gerade noch eingehender damit beschäftigen, aber meine Arbeit ruft ...
Gruß,
Christian
super Vortrag! Drücke die Daumen, daß es alles klappt!
Zum eigentlichen Vortrag kann man nicht mehr viel sagen - das ist ja schon abgegrast . Außer vielleicht, daß ich das "import numeric" vielleicht zu "import numpy" ändern würde: Es gibt Numeric (veraltet) und numpy, aber kein numeric. So stiftest Du mit ein bißchen Pech Verwirrung.
Zu Übung 1:
Meiner Erfahrung nach ist so eine Anweisung zu allgemein - Leute bleiben bei so was stecken. Mache doch einfach einen Doppelpunkt und rücke die folgenden Zeilen ein - Damit ist klar, das die folgenden Punkte diese Aufgabe ausmachen. Klingt pingelig, ist es auch, aber machmal gibt es Fragen von Studenten .Machen Sie sich mit den Datentypen int, float, complex und den grundlegenden
Rechenoperationen vertraut.
Übung 1, Aufgabe 2.2: Ändern zu: "Ändern sie das obige Programm, so dass es Folgendes ausgibt:"
Übung 1, Aufgabe 9: Palyndrom -> Palindrom
Wollte mich gerade noch eingehender damit beschäftigen, aber meine Arbeit ruft ...
Gruß,
Christian
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Gibt's schon einen Beamer2Moin-Konverter? Mit Plastex koennte man vielleicht was einfaches basteln.
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
So'n Schiet. Mir fallen da sonst nur third-Party-Beispiele ein...BlackJack hat geschrieben:Folie 43: `os.path` ist ein schlechtes Beispiel für Pakete, weil es gar keins ist:
Oh ja, das ist ein tolles Beispiel. Ich glaube, das packe ich in eine Uebungsaufgabe.BlackJack hat geschrieben: 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.
Jo. Zu 2.5 habe ich gar nichts gesagt, aber with und conditional expressions sind ja auch was feines. Mal sehen...BlackJack hat geschrieben:Folie 129: Nach ``lamda`` hätte man noch "closures" erwähnen können. Und vielleicht `functools.partial()` bei Python 2.5.
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
- Rebecca
- User
- Beiträge: 1662
- Registriert: Freitag 3. Februar 2006, 12:28
- Wohnort: DN, Heimat: HB
- Kontaktdaten:
Der Kurs war letzte Woche. Ich habe noch einige Bugs ausgemerzt und den Kram in der obigen URL aktualisiert.
Wir hatten 13 Teilnehmer, fuer einen Programmierkurs, der nur auf unseren Webseiten angekuendigt ist, ein normaler Schnitt. Mir hat der Kurs total Spass gemacht, ich freue mich ja ueber alles, was hier auf der Arbeit mit Python zu tun hat. Die Leute hatten teilweise sehr unterschiedliche Vorkenntnisse, aber ich denke, alle waren ganz zufrieden. Waehrend des Vortrags selbst war es schon etwas schwierig zu entscheiden, wie schnell ich vorgehe, da auch nur sehr wenig Fragen kamen. Aber die Uebungsaufgaben konnte ja jeder mit seiner Geschwindigkeit und nach seinem Geschmack angehen.
Positiv ueberrascht war ich von unserem neuen Ausbildungsraum: 25 Arbeitsplaetze, aber himmlische Ruhe, da sich in derm Raum nur Terminals, keine Rechner oder Workstations befinden.
Danke jedenfalls nochmal fuer eure Hinweise!
Wir hatten 13 Teilnehmer, fuer einen Programmierkurs, der nur auf unseren Webseiten angekuendigt ist, ein normaler Schnitt. Mir hat der Kurs total Spass gemacht, ich freue mich ja ueber alles, was hier auf der Arbeit mit Python zu tun hat. Die Leute hatten teilweise sehr unterschiedliche Vorkenntnisse, aber ich denke, alle waren ganz zufrieden. Waehrend des Vortrags selbst war es schon etwas schwierig zu entscheiden, wie schnell ich vorgehe, da auch nur sehr wenig Fragen kamen. Aber die Uebungsaufgaben konnte ja jeder mit seiner Geschwindigkeit und nach seinem Geschmack angehen.
Positiv ueberrascht war ich von unserem neuen Ausbildungsraum: 25 Arbeitsplaetze, aber himmlische Ruhe, da sich in derm Raum nur Terminals, keine Rechner oder Workstations befinden.
Danke jedenfalls nochmal fuer eure Hinweise!
Offizielles Python-Tutorial (Deutsche Version)
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei