Einfuehrung in Python (fuer Programmierer)

Gute Links und Tutorials könnt ihr hier posten.
Antworten
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

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. :(
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Rebecca hat geschrieben:Materialien
Hallo Rebecca!

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.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

kann man sich da noch anmelden zu dem Kurs? :)
BlackJack

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:

Code: Alles auswählen

from math import pi as PI, sin
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.
Leonidas
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 ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Leonidas hat geschrieben:Statt Cheetah vielleicht auch Mako ;)
Hallo Leonidas!

Aber jetzt übertreib mal nicht. :lol:

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

BlackJack hat geschrieben:aber Kritik gibts trotzdem. :-)
Das haette ich von dir auch nicht anders erwartet. :wink:

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wow, eine wirklich Ausführliche Sammlung, kompakt zusammen gefasst.

Wie wäre es, wenn man das in's Wiki packen würde? Als Grundlage für [wiki]Tutorial[/wiki]?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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:
Machen Sie sich mit den Datentypen int, float, complex und den grundlegenden
Rechenoperationen vertraut.
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 :roll: .

Ü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
Benutzeravatar
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
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

BlackJack hat geschrieben:Folie 43: `os.path` ist ein schlechtes Beispiel für Pakete, weil es gar keins ist:
So'n Schiet. Mir fallen da sonst nur third-Party-Beispiele ein...
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. ;-)
Oh ja, das ist ein tolles Beispiel. Ich glaube, das packe ich in eine Uebungsaufgabe.
BlackJack hat geschrieben:Folie 129: Nach ``lamda`` hätte man noch "closures" erwähnen können. Und vielleicht `functools.partial()` bei Python 2.5.
Jo. Zu 2.5 habe ich gar nichts gesagt, aber with und conditional expressions sind ja auch was feines. Mal sehen...
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BlackJack

Echte Standard-Packages: `xml`, `email`, `email.mime`, `encodings`, `logging`.
Benutzeravatar
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!
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Antworten