Lists are a workhorse data type in Python, and many programs manipulate a list at some point. Two common operations on lists are to loop over them, and either pick out the elements that meet a certain criterion, or apply some function to each element. For example, given a list of strings, you might want to pull out all the strings containing a given substring, or strip off trailing whitespace from each line.
The existing map() and filter() functions can be used for this purpose, but they require a function as one of their arguments. This is fine if there’s an existing built-in function that can be passed directly, but if there isn’t, you have to create a little function to do the required work, and Python’s scoping rules make the result ugly if the little function needs additional information. Take the first example in the previous paragraph, finding all the strings in the list containing a given substring. You could write the following to do it:
Steht im What's New zu 2.0, ich hatte darauf doch auch verlinkt:
http://docs.python.org/whatsnew/2.0.htm ... rehensions
Konkret steht im PEP 202 ja etwas von verschachtelten For Schleifen um Listen zu erzeugen. Das kann alles bedeuten was man auch mit map und filter machen kann, was allerdings auch dummy Variablen einschließt. Gesetzt folgende Anwendung von map:
Code: Alles auswählen
file_object = open("filename.end", "wb")
a = map(lambda dummy: file_object.readline(), [1, 2, 3]) # Get three Lines from File
Das ist doch praktisch das ausnutzen eines Seiteneffektes um eine Liste zu generieren. Wo ist hier der Unterschied zu einer Anwendung mit randint oder anderem? Bei einem richtigem Seiteneffekt wäre die herauskommende Liste nichtmal relevant, aber macht das nun so einen Unterschied? Das sieht für mich einfach "falsch" aus.
Zählvariable + ``while``? Du magst es echt gerne unnötig kompliziert, oder?
Nein, aber ich (genau wie du, schätze ich mal) mag ich es nicht, Dinge zu "missbrauchen".
In dem oben genannten Beispiel kommt es noch nichtmal auf die Zahlen an. Es konnte dort ja alles stehen. zb auch list(string.lowercase[:3]). xrange / range macht natürlich Sinn, wenn ich wirklich mit der Variable etwas anfangen will, denn dann ist es ja eine Art Zählvariable. Aber so ganz ohne und nur als dummy erscheint es mir unsauber und unpräzise.
Andererseits existiert in einer while Schleife die Zählvariable nur zum Selbstzweck, insofern werde ich mich wohl besinnen, und die (extrem seltenen) Fälle, wen ich "dummy" Variablen brauche, mit {x,}range arbeiten.
@numerix:
Hatte deinen Beitrag gestern nicht mehr gesehen. Ich hätte vielleicht sagen sollen, daß lambdas und LC's *an sich* relativ einfach sind, sofern man denn in der "Programmiererdenke" drin ist. chris27 ist aber deutlich ambitionierter als andere Anfänger, und er hat random.sample verwendet. Da kommt im Gegensatz zu itertools.repeat einiges an tollen Wörtchen vor, also hatte ich ihm eine gewisse Kenntnis von "Objektverhaltensarten" (zb "Iterator", der ja als einziger genannt wurde in itertools.repeat.__doc__) zugetraut.