Pokerspiel und Zahlenraten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

str1442 hat geschrieben: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.
Nachdem, was chris27 uns bisher hier gezeigt hat, muss diese Annahme wohl revidiert werden ... :wink:
BlackJack

@str1442: Statt `xrange()` mit einer Dummy-Variable müsste es eine ``repeat``- oder ``times``-Anweisung geben, was in der englishsprachigen Newsgroup soweit ich mich erinnere schon öfter mit dem Hinweis abgelehnt wurde, das damit kein echter Mehrwert vorhanden ist.

Und es ist einfach idiomatisches Python. ``a = [[spam() for dummy in xrange(width)] for dummy in xrange(height)]`` ist *die* kanonische Antwort auf die Frage wie man "2D Arrays" in Python erzeugt. Beliebte Anfängerfrage, wird immer in diesem Stil beantwortet.

Dein `map()`-Beispiel hat IMHO zwei Probleme: Das ``lambda`` und die explizite Liste mit drei Elementen. Gegen ``a = [file_object.readline() for dummy in xrange(3)]`` ist aber IMHO nichts einzuwenden. Es macht einen Unterschied ob man eine Liste generiert, also das macht wofür LCs gedacht sind, oder einfach nur eine ``for``-Schleife in eine Zeile quetschen will.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

die explizite Liste mit drei Elementen.
Klar, aber so sieht man besser, daß es egal ist, was die Liste nun wirklich enthält, und warum mir die Iteration über eine Liste zur Wiederholung eines Ausdrucks doch etwas fragwürdig erscheint. Aber gut, ich nenne die "dummy" Variable einfach immer i und freue mich, das ich immer Zugriff auf einen Index habe, sofern ich ihn brauche :)
BlackJack

Iteration über eine Liste zur Wiederholung würde ich auch nicht machen. Ein `xrange`-Exemplar ist ja keine Liste.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

s/Liste/beliebige Sequenz/g @mein vorheriger Post. Aber da es sowieso nur mit xrange / range in Python 3.0 Sinn macht, numerische Schleifen (Wikipedia Deutsch) durchzuführen, ist der Einwand natürlich eher theoretischer Natur, wenn er auch vorhanden ist.
Antworten