Roman hat geschrieben:1. Was sind diese öminösen lambda-Konstrukte??
2. Was macht "iter"?
Hi Roman!
Hier zuerst mal ein Beispiel ohne "iter" und ohne "lambda":
Code: Alles auswählen
f_in = file("test.mp3", "rb")
f_out = file("test.mp3.crypted", "wb")
while True:
part = f_in.read(1024 * 1000)
if not part:
break
vals = []
for val in part:
vals.append(chr((ord(val) + 3) % 256))
f_out.write("".join(vals))
f_in.close()
f_out.close()
Das sollte einfacher zu verstehen sein.
Und jetzt zu *iter()*.
http://docs.python.org/lib/built-in-funcs.html#l2h-42
Mit iter() kann ich z.B. eine Funktion in einer Schleife so oft aufrufen, bis das Abbruchargument zutrifft. In meinem vorherigen Beispiel, wird damit also die Lambda-Funktion so oft aufgerufen, bis "" zurück kommt.
Die Methode f.read() kann ohne Argumente aufgerufen werden. Allerdings möchte ich als Argument die Länge der Daten übergeben, die mir f.read() zurück liefern soll. An die Funktion iter() kann aber nur eine Referenz zu einer Funktion übergeben werden. Ich habe keine Möglichkeit, die Argumente zu übergeben. Jetzt könnte ich eine eigene Funktion definieren, in der die richtigen Argumente übergeben werden. Diese Funkton könnte ich an iter() übergeben. Das könnte z.B. so aussehen:
Code: Alles auswählen
f_in = file("test.mp3", "rb")
f_out = file("test.mp3.crypted", "wb")
def read_part():
return f_in.read(1024 * 1000)
for part in iter(read_part, ""):
vals = []
for val in part:
vals.append(chr((ord(val) + 3) % 256))
f_out.write("".join(vals))
f_in.close()
f_out.close()
Allerdings bin ich faul und möchte gerne auf die Definition einer eigenen Funktion verzichten. Deshalb verwende ich in solchen Fällen gerne **lambda**. Mit lambda erstellt man **namenlose** Funktionen.
Allerdings wird lambda immer mehr aus der Dokumentation verdrängt. Man sollte es wohl sparsam einsetzen.
http://docs.python.org/ref/lambdas.html
mfg
Gerold
