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

Beitragvon str1442 » Donnerstag 18. Dezember 2008, 23:07

LCs sind zum erstellen von Listen und genau das wird gemacht.


Laut dem Python 2.0 What's New sind List Comprehension eingeführt worden, um map() und filter() zu ersetzen, zum puren Erstellen von Listen, die nicht aus anderen Listen aufgebaut sind, sind LCs eher nicht zu gebrauchen, außer man nutzt dummy Variablen (und vielleicht kann man das als eine Art Seiteneffekt auffassen -> Man nutzt die Wiederholungen, um eine Liste zu generieren, hat aber mit dem eigentlichen Grund der Wiederholungen (nämlich die Iteration über eine andere Liste, mit der man ansonsten gar nichts macht) nichts zu tun).

http://docs.python.org/whatsnew/2.0.htm ... rehensions

Deine Variante ist einfach nur deutlich komplexer um eine "dummy"-Variable zu vermeiden!?


Meine Variante ist komplexer damit chris27 LCs nicht als pures Looping Konstrukt begreift (und es ist zweifelhaft, ob ich sowas wirklich in richtigem Code anwenden würde - da würde ich vermutlich eine "richtige" Zählvariable + while benutzen.)
BlackJack

Beitragvon BlackJack » Donnerstag 18. Dezember 2008, 23:51

Zählvariable + ``while``? Du magst es echt gerne unnötig kompliziert, oder? :roll:

Zu Python 2.0 finde ich kein `What's new`-Dokument. Im PEP 202 steht unter `Rationale`:

List comprehensions provide a more concise way to create lists in situations where map() and filter() and/or nested loops would currently be used.


Es geht also um einen kürzeren Weg, im Sinne von Quelltext, um Listen zu erzeugen. Und zwar nicht nur um `map()` und `filter()` zu ersetzen, sondern auch ``for``-Schleifen in denen eine Liste erzeugt wird. Vor LCs hätte man das mit einer ``for``-Schleife geschrieben:

Code: Alles auswählen

result = list()
for dummy in xrange(len(secret)):
    result.append(random.choice(string.lowercase))


Und ab 2.0 ist der offensichtliche Weg das in Python auszudrücken eben eine LC.
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Beitragvon chris27 » Freitag 19. Dezember 2008, 02:11

Es ist soweit das langerwartete, stark umstrittene, polarisierende Final Release von Zahlenraten ist soeben fertig geworden. Mit stolz präsentiere ich Zahlenraten.V.4.0, writen by chris27
Folgendes noch dazu zu sagen.Ich habe wirklich ernsthaft versucht die Tipps aller User hier umzusetzen, natürlich ist dies mir nicht ganz gelungen. Und ich hab mich wirklich für dieses Prog. bemüht. Müssen jetzt an die drei Tage sein, wo daran arbeite. Ich bedanke mich nochmals das mir alle hier so viel geholfen und Tipps gegeben haben.
Also wenn jemand mal eine positive Kritik hat, darf er diese ruhig auch mal äussern, obwohl ich das eher nicht glaube. Ich bin halt noch blutiger Anfänger und meine Codes und mein Coding-Style sind nicht gut. Das wurde mir schon deutlich gemacht. Aber ich bessere mich. Was ich eigentlich sagen will vereisst mein Script vielleicht nicht wieder ganz in der Luft :).
Nein mal im ernst, schreibt eure ehrliche Meinung wie ihrs immer tut, kann die Kritik ja auch gebrauchen. Also viel SPass beim gamen.



Da das Script wirklich gross geworden ist hier ein link:
http://paste.pocoo.org/show/95983/


Des weitern wird es euch freuen das ich das Spiel als Open-Source-Anwendungen frei ins Netz stelle. Jeder von euch kann es spielen ohne
dafür zu bezahlen. Als Dank für eure Hilfe biete ich euch nun Grenzenlosen Spielspass
Dank an meine Ratgeber und an meine Fans
Ohne euch hätte ich dieses Meisterwerk nie programmieren können.
mfg chris
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Freitag 19. Dezember 2008, 11:58

chris27 hat geschrieben:Status: One of the most powerfull User from www.Python-forum.de

OMG :-D

Also ich würde das nicht final nennen! Die "4" KIs sind wieder copy & paste! Versuche das doch dynamisch zu lösen!

Am Anfang wählt der Spieler die Anzahl Mitspieler und welche davon von der KI übernommen werden. Dann sollte Dein programm eben eine dynamische Anzahl menschlicher und KI gesteuerter Spieler übernehmen können. Das wäre doch mal ein schöner Ansatz (bei dem Du sicherlich einiges über Datenstrukturen und Funtkionen lernen könntest!)

Und Du hast wieder nicht die elementaren Tipps umgesetzt:

Code auf Modulebene!!! Das hatten wir nun schon oft genug.

Multiline prints brauchen kein "\n" - zumindest ich finde das unschön.

Die Funktionen sind unschön benannt. Du bringst da eine Variation rein über Nummern, die nichts aussagen:

Code: Alles auswählen

def test1():
    # Code
def test2():
    # Code

Mit so was kann wohl niemand etwas anfangen!

Also arbeite da weiter dran!
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Beitragvon chris27 » Freitag 19. Dezember 2008, 13:19

hatte versucht das mit der modul ebene zu vermeiden, aber hatte das menue vergessen. Nun in Anbetracht deiner letzten Nachricht gebe ich nun bekkant das es noch ein Final Release von meinem Zahlenraten geben wird, werde versuchen es so dynamisch zu gestalten wie von dir beschrieben.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Beitragvon str1442 » Freitag 19. Dezember 2008, 20:11

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

Beitragvon numerix » Freitag 19. Dezember 2008, 21:29

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

Beitragvon BlackJack » Freitag 19. Dezember 2008, 21:35

@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

Beitragvon str1442 » Samstag 20. Dezember 2008, 23:03

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

Beitragvon BlackJack » Samstag 20. Dezember 2008, 23:53

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

Beitragvon str1442 » Sonntag 21. Dezember 2008, 21:25

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.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]