Man muss sich einfach vorstellen dass die ``i``-Varianten der ``itertools`` zum Standard werden. Daher habe ich im Beispiel oben auch ``imap`` und ``list`` verwendet, wo auch ein normales ``map`` gereicht hätte.
Zum Thema ``partial``: das ist generell ein recht interessantes Thema. In Python kann es verwendet werden um positionelle Argumente zu setzen, mit dem linken startend. Das entspricht wie ich erst vor paar Tagen festgestellt habe, ``curry`` in Scheme. Weiterhin nimmt Pythons ``partial`` auch Keyword-Argumente (siehe auch das Beispiel in meinen Folien, da wird das verwendet), so dass man auch die Möglichkeit hat die Funktions-Parameter von rechts aufzufüllen (in Scheme macht man das mit ``curryr``, was aber eigentlich nicht so flexibel ist). Wozu man das braucht? Nun, ich wollte aus einer aufsteigenden Zahlenreihe (xrange) Zyklen von 0 bis 4 machen, also jedes Element Modulo 5 rechnen. Mit ``partial(mod, 5)`` bekommt man aber ``5 % zahl``. Somit kann man sich hier mit ``partial(mod, b=5)`` abhelfen, wo dann ``zahl % 5`` rauskommt.
Ein weitere nette Anwendung von Currying sind funktionale Sprachen die nur Funktionen mit einem Argument haben. Ich meine dass da Haskell dazugehört, denn dort ist ein ``add = lambda a, b: a+b`` ein ``add = lambda b: lambda a: a+b``. Dies bedeutet, dass wenn man dieser Funktion keine zwei Parameter sondern nur einen mitgibt, man automatisch so eine partielle Funktion bekommt: ``add(5)`` ist dann ``lambda a: a+5`` und wenn man ``add(5)(1)`` ausführt dann bekommt man regulär 6 als Ergebnis. Natürlich gibt es dafür syntaktischen Zucker, man muss seine Funktionen nicht selbst verschachteln