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, 18:04

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 18. Dezember 2008, 18:14

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 Modvoice
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Beitragvon str1442 » Donnerstag 18. Dezember 2008, 18:32

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:

Beitragvon chris27 » Donnerstag 18. Dezember 2008, 18:44

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

Beitragvon numerix » Donnerstag 18. Dezember 2008, 19:13

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:

Beitragvon chris27 » Donnerstag 18. Dezember 2008, 19:16

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

Beitragvon str1442 » Donnerstag 18. Dezember 2008, 19:54

Findest du alles in der Dokumentation. Stichwort List Comprehension, itertools.repeat, lambda.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 18. Dezember 2008, 20:04

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

Beitragvon numerix » Donnerstag 18. Dezember 2008, 20:19

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

Beitragvon BlackJack » Donnerstag 18. Dezember 2008, 21:25

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

Beitragvon str1442 » Donnerstag 18. Dezember 2008, 22:16

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

Beitragvon BlackJack » Donnerstag 18. Dezember 2008, 22:22

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

Beitragvon str1442 » Donnerstag 18. Dezember 2008, 22:39

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

Beitragvon BlackJack » Donnerstag 18. Dezember 2008, 22:53

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

Beitragvon numerix » Donnerstag 18. Dezember 2008, 23:05

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!

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]