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

Ihgitt, ``global``. Alles andere als ein gutes Beispiel.
geordnetS wird doch gar nicht geändert. Global wird überflüssigerweise gebraucht -> Insofern ist das eine Konstante.
so ein Sprung per return aus der Schleife ist nicht gerade fein
Warum? Du suchst solange bis du die Position gefunden hast, dann springst du mit return raus. Sofern man sowas nicht exzessiv verwendet, warum nicht? Die Schleife dann auslaufen zu lassen würde doch nur mehr Ballast hinzufügen. Und mit return kann man keinen Goto Nudel Code erzeugen.
hier das?
Ja.

Code: Alles auswählen

import string
from itertools import repeat
from random import randint

def main():
    secret = "SE"
    buchstaben = string.lowercase
    tries = 0

    while True:
        guess = [buchstaben[thunk_int()] for thunk_int in repeat(lambda: randint(0, 25), len(secret))]
        tries += 1
        print guess 

        if "".join(guess) == secret.lower():
            print "Got: %s" % guess
            print "Tries: %s" % tries
            break

if __name__ == "__main__":
    main()
Wäre zum Beispiel möglich. Nur sollte man wenns schnell werden soll gleich mit Strings arbeiten, aber ich fand die LC so schön. Außerdem ist "raten" natürlich keine gute Suchmethode.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

str1442 hat geschrieben:geordnetS wird doch gar nicht geändert. Global wird überflüssigerweise gebraucht -> Insofern ist das eine Konstante.
Also schlecht und unnötig.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Dann schreibst du also entweder jede Konstante im Programm direkt in die Zeilen oder übergibst jeder Funktion jeden noch so unnötigen Parameter? Zb auch math.pi?
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Kann mir bitte jemand diesen Satz versuchen verständlich zu übersetzen:

[buchstaben[thunk_int()] for thunk_int in repeat(lambda: randint(0, 25), len(secret))]

hab sowas noch nie gesehn


und hat jemand vielleicht noch ein Tip bitte für Python challenge seite 3.
Da ist so ein Buch, weiss net was das soll. Will jetzt nicht das ihr mir laufend irgendwelche lösungen sagt, vielleicht nur kleinen Tip :), wenn jemand das Rätsel kennt
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

chris27 hat geschrieben:und hat jemand vielleicht noch ein Tip bitte für Python challenge seite 3.
Da ist so ein Buch, weiss net was das soll. Will jetzt nicht das ihr mir laufend irgendwelche lösungen sagt, vielleicht nur kleinen Tip :), wenn jemand das Rätsel kennt
Jetzt fang doch nicht noch eine Baustelle an! Was ist mit deinem Zahlenraten? Eine anständige finale Fassung hast du noch nicht gezeigt. Daran könnte man eine ganze Menge lernen, indem man es entsprechend ausbaut. Konkretes dazu wurde schon gepostet.

Wenn du das Zahlenraten nicht hinbekommst, kannst du PythonChallenge knicken! Das ist eine andere Preisklasse. Es hat auch relativ wenig damit zu tun, anständige Python Programme schreiben zu lernen. Weitaus ergiebiger ist das Project Euler.
chris27
User
Beiträge: 33
Registriert: Montag 15. Dezember 2008, 11:01
Kontaktdaten:

Werde heute abend noch das final release meines Zahlenratens posten. versprochen. Will aber jetzt auch net deine K.I. eins zu eins übernehmen, das wäre dann nicht mehr mein Script, aber lasse mir noch was einfallen.
Werde alle mit einem Super Script überraschen. So das man meine ich programmiere seit Jahren.
Jo die Py challenge ist jetzt erst mal egal
wow project euler ist aber harter stoff
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Findest du alles in der Dokumentation. Stichwort List Comprehension, itertools.repeat, lambda.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

str1442 hat geschrieben:Dann schreibst du also entweder jede Konstante im Programm direkt in die Zeilen oder übergibst jeder Funktion jeden noch so unnötigen Parameter? Zb auch math.pi?
Nein, aber ich benutze 1) nicht ``global`` wo es nicht nötig ist 2) ``global`` auch dort nicht wo man sagen würde das es nötig ist eben weil es eine schlechte Lösung ist.

"Super Script", na da bin ich mal gespannt. Ist mir in diesem Forum bischer erst eine Handvoll Mal passiert das mich der Code von einem Neuling positiv überrascht. Also dann, viel Erfolg.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

str1442 hat geschrieben:Findest du alles in der Dokumentation. Stichwort List Comprehension, itertools.repeat, lambda.
Sicher, aber das sind ja auch nicht gerade die Sprachelemente für Anfänger. Und manches versteht man trotz Doku nicht, wenn man es nicht entsprechend einordnen kann, was man wiederum erst kann, wenn gewisse Grundlagen vorhanden sind ...

@chris27: Bin auch schon gespannt auf das "Super Script" ... 8)
BlackJack

Vor allem ist es unnötig kompliziert. Für jeden Buchstaben eine Funktion erstellen die eine Zufallszahl erzeugt -- einem Anfänger würde man das um die Ohren hauen.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Nein, aber ich benutze 1) nicht ``global`` wo es nicht nötig ist 2) ``global`` auch dort nicht wo man sagen würde das es nötig ist eben weil es eine schlechte Lösung ist.
Achso, deine vorherige Antwort war auf die Verwendung von global bezogen, obwohl es sowieso keinen Unterschied macht? Ich dachte, sie wäre auf die Konstanten bezogen. Von global ist im allgemeinen abzuraten, ja, von Konstanten nicht. :arrow:
Und manches versteht man trotz Doku nicht, wenn man es nicht entsprechend einordnen kann
Also LC's sind eigentlich ganz gut erklärt im Tutorial (welches man schnell bei der Suche nach List Comprehension findet, es gibt scheinbar keinen Eintrag unter Language Reference), lambdas sind auch nichts besonderes und unter Data Model erklärt. Und einfache Funktionsdokumentation wie für itertools.repeat sollte er schon verstehen, sonst würde er random nicht kennen.
Vor allem ist es unnötig kompliziert. Für jeden Buchstaben eine Funktion erstellen die eine Zufallszahl erzeugt -- einem Anfänger würde man das um die Ohren hauen.
Ja, ist natürlich etwas redundant. Sowas hier wäre naheliegender gewesen:

Code: Alles auswählen

[buchstaben[randint(0, 25)] for dummy in xrange(len(secret))]
Aber mit das ginge im konkreten Fall am Sinn einer LC vorbei (zumal das auch redundant ist wg. der Zuweisung und ich es auch als unelegant empfinde, dummy Laufvariablen zu benutzen), die ich ja nur gebraucht habe, weil es für das Ersetzen von diesem speziellem c&p Code gepasst hat.
BlackJack

Wieso geht das am Sinn einer LC vorbei?
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Weil man sie nur zur xfachen Wiederholung benutzt und mit der Variable nichts anfängt. Man zählt die Variable noch nichtmal hoch, sondern lässt sie einfach jede Wiederholung einen neuen Wert über xrange / range annehmen, und schmeißt sie am Ende weg (für die man also auch jedes andere beliebige Element nehmen können, zb repeat(True, len(secret)) oder ähnlich). Das kann man zwar machen, hat aber mit dem "mappen" einer Liste nichts mehr zu tun. Und wenn ein Anfänger sein erstes LC Beispiel mit einer dummy Variable sieht, fehlt der ganze "mapping" Kontext, der LC's eigentlich ausmacht. Insofern empfand ich es besser ein "lambda" zur "Lazy evaluation" einzusetzen, und dann wirklich zu "mappen". (Bis 2000 Durchläufe scheint die lambda Variante sogar etwas schneller zu sein?)
BlackJack

LCs sind zum erstellen von Listen und genau das wird gemacht. Am Sinn vorbeigehen würde eine LC, die nur wegen der Seiteneffekte des Ausdrucks am Anfang verwendet wird und wo man die Liste an keinen Namen bindet.

Deine Variante ist einfach nur deutlich komplexer um eine "dummy"-Variable zu vermeiden!?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

str1442 hat geschrieben:Also LC's sind eigentlich ganz gut erklärt im Tutorial (welches man schnell bei der Suche nach List Comprehension findet, es gibt scheinbar keinen Eintrag unter Language Reference), lambdas sind auch nichts besonderes und unter Data Model erklärt. Und einfache Funktionsdokumentation wie für itertools.repeat sollte er schon verstehen, sonst würde er random nicht kennen.
Ich teile deine Einschätzung nicht. LCs sind für Anfänger keine einfache Sache, lambdas schon gar nicht. Und Funktion ist nicht Funktion!

itertools.repeat:
Make an iterator that returns object over and over again. Runs indefinitely unless the times argument is specified. Used as argument to imap() for invariant function parameters. Also used with izip() to create constant fields in a tuple record.
random.randint:
Return a random integer N such that a <= N <= b.
Wer letzteres versteht, muss ersteres noch lange nicht verstehen.

Und dann auch noch alle drei Sprachelemente in *einem* Ausdruck. Das versteht kein Anfänger, trotz aller Doku!
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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

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:

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: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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:

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.
Antworten