Seite 1 von 1

Wieder mal random

Verfasst: Mittwoch 2. Mai 2007, 07:17
von rolgal_reloaded
Hallo zusammen,

könnte mir vorstellen, dass man das noch besser machen könnte.
Vor allem schiesst sich random sehr oft auf die gleiche Zahl ein.

Code: Alles auswählen

# -*- coding: cp1252 -*-

import random
zahlenliste = [34, 67, 23, 44, 87, 13]
zahl = random.choice(zahlenliste)

versuche = 1
while True:
    eingabe = raw_input("Wie heißt die Zahl ? ")

    try:
        if int(eingabe) == zahl:
            print "Bravo, die Zahl ist richtig"
            break
        elif int(eingabe) < zahl:
            print "Tut mir leid, ihre Zahl ist zu klein"
            versuche = versuche + 1
        elif int(eingabe) > zahl:
            print "Tur mir leid, ihre Zahl ist zu groß"
            versuche = versuche + 1
    except ValueError:
        print eingabe, "ist eine ungültige Eingabe!"
        


if versuche > 1:
    print "Anzahl der Versuche: ", versuche
else:
    print "Bravo, sie haben nur einen Versuch gebraucht!"
    
print "Ende des Programms"
Liebe Grüße

rolgal_reloaded

Verfasst: Mittwoch 2. Mai 2007, 08:12
von pyStyler
Hallo,

ich könnte dir das hier anbieten

Code: Alles auswählen

# -*- coding: cp1252 -*-
import random

#~ zahlenliste = [34, 67, 23, 44, 87, 13]
#~ zahl = random.choice(zahlenliste)

def zufall():
    ''' der vorteil ist hier, dass man keine fixe zahlen eingeben muss!'''
    x = random.randrange(1,20)
    return x
zahl = zufall()
    

def _main():
    versuche = 0
    while True:
        eingabe = raw_input("Wie heißt die Zahl ? ")
        try:
            if int(eingabe) == zahl:
                print "Bravo, die Zahl ist richtig"
                break
            elif int(eingabe) < zahl:
                print "Tut mir leid, ihre Zahl ist zu klein"
                versuche = versuche + 1
            elif int(eingabe) > zahl:
                print "Tur mir leid, ihre Zahl ist zu groß"
                versuche = versuche + 1
        except ValueError:
            print eingabe, "ist eine ungültige Eingabe!"
    if versuche > 1:
        print "Anzahl der Versuche: ", versuche
    else:
        print "Bravo, sie haben nur einen Versuch gebraucht!"
       
    print "Ende des Programms"
    
if __name__=='__main__':
    _main()
Gruss
pyStyler

Verfasst: Mittwoch 2. Mai 2007, 08:21
von BlackJack
Mir sind da mal wieder zu viele Wiederholungen von Quelltext drin. Nachdem man etwas eingegeben hat, möchte man eigentlich mit einer Zahl arbeiten. Dass heisst, das Umwandeln von der Eingabe in eine Zahl sollte an *einer* Stelle am besten gleich nach der Eingabe passieren und nicht in jedem ``if``-Zweig auf's neue. Das `int()` würde ich direkt um den `raw_input()`-Aufruf setzen und auch dort die Ausnahmebehandlung machen, mit einem ``continue`` als letzten Befehl im ``except``-Block.

Ähnlich verhält es sich mit dem erhöhen von `versuche`. Das muss nur einmal in der Schleife und nicht zweimal in den ``elif``-Zweigen stehen.

Verfasst: Mittwoch 2. Mai 2007, 08:25
von rolgal_reloaded
pyStyler hat geschrieben:Hallo,

ich könnte dir das hier anbieten

Code: Alles auswählen

# -*- coding: cp1252 -*-
import random

#~ zahlenliste = [34, 67, 23, 44, 87, 13]
#~ zahl = random.choice(zahlenliste)

def zufall():
    ''' der vorteil ist hier, dass man keine fixe zahlen eingeben muss!'''
    x = random.randrange(1,20)
    return x
zahl = zufall()
Das gefällt mir, danke!

Verfasst: Mittwoch 2. Mai 2007, 08:26
von rolgal_reloaded
BlackJack hat geschrieben:Mir sind da mal wieder zu viele Wiederholungen von Quelltext drin. Nachdem man etwas eingegeben hat, möchte man eigentlich mit einer Zahl arbeiten. Dass heisst, das Umwandeln von der Eingabe in eine Zahl sollte an *einer* Stelle am besten gleich nach der Eingabe passieren und nicht in jedem ``if``-Zweig auf's neue. Das `int()` würde ich direkt um den `raw_input()`-Aufruf setzen und auch dort die Ausnahmebehandlung machen, mit einem ``continue`` als letzten Befehl im ``except``-Block.

Ähnlich verhält es sich mit dem erhöhen von `versuche`. Das muss nur einmal in der Schleife und nicht zweimal in den ``elif``-Zweigen stehen.
:arrow: am ausprobieren ist.
int() um raw_input():
Es ist halt wieder mal eine Sache zwischen besser programmiert und leichter zum Lesen für Anfänger.
Das betrifft auch den letzten Beitrag bez. der globalen Geschichte im Adressbuch.
Das mit den Versuchen war wieder mal barocker Programmierstil

Ich habe da jetzt was seltsames:

Code: Alles auswählen

zahl = 50
while True:

    try:
        eingabe = int(raw_input("Wie heißt die Zahl ? "))

    except ValueError:
        print eingabe, "ist eine ungültige Eingabe!"


Krieg ich das auf der Konsole:

Code: Alles auswählen

Wie heißt die Zahl ? asgf
50 ist eine ungültige Eingabe!
Wie heißt die Zahl ? 
Warum gibt er 50 aus?

Und im Linuxraum gibt er das aus, was er logischerweise ausgeben muss:
Traceback (most recent call last):
File "<pyshell#8>", line 5, in ?
print eingabe, "ist ungültig"
NameError: name 'eingabe' is not defined

Das heisst, int() um raw_input() zu legen ist in dem Fall vielleicht doch nicht die beste Idee, oder?
Weil eingabe nicht angelegt wird. und es daher zum NameError kommen muss.

Verfasst: Mittwoch 2. Mai 2007, 09:38
von rolgal_reloaded
@pystyler:

Warum setzt du versuche = 0 ??

LG

r_r

So macht es momentan für meinen Zweck am meisten Sinn:

Code: Alles auswählen

import random

zahl = random.randrange(1,20) 

versuche = 1
while True:
    eingabe = raw_input("Wie heißt die Zahl ? ")

    try:
        if int(eingabe) == zahl:
            print "Bravo, die Zahl ist richtig"
            break
        elif int(eingabe) < zahl:
            print "Tut mir leid, ihre Zahl ist zu klein"
        elif int(eingabe) > zahl:
            print "Tur mir leid, ihre Zahl ist zu groß"
        versuche += 1
    except ValueError:
        print eingabe, "ist eine ungültige Eingabe!"

if versuche > 1:
    print "Anzahl der Versuche: ", versuche
else:
    print "Bravo, sie haben nur einen Versuch gebraucht!"
    
print "Ende des Programms"

Verfasst: Mittwoch 2. Mai 2007, 09:55
von BlackJack
Warum 50 statt eine `NameError` ausgegeben wird, kann ich nicht sagen. Das darf bei dem gezeigten Stück Quelltext nicht passieren, wenn man im ersten Schleifendurchlauf etwas anderes als eine ganze Zahl eingibt.

Wenn man die falsche Eingabe nochmal ausgeben möchte, dann muss man die beiden Schritte natürlich trennen.

Code: Alles auswählen

zahl = 50
while True:
    try:
        eingabe = raw_input("Wie heißt die Zahl ? ")
        eingabe = int(eingabe)
    except ValueError:
        print eingabe, "ist eine ungültige Eingabe!"
        continue
Man könnte sich natürlich für die Eingabe als Zeichenkette noch einen anderen Namen ausdenken.

Verfasst: Mittwoch 2. Mai 2007, 09:57
von pyStyler
war ein versehen.....

Verfasst: Mittwoch 2. Mai 2007, 10:05
von rolgal_reloaded
BlackJack hat geschrieben:Warum 50 statt eine `NameError` ausgegeben wird, kann ich nicht sagen. Das darf bei dem gezeigten Stück Quelltext nicht passieren, wenn man im ersten Schleifendurchlauf etwas anderes als eine ganze Zahl eingibt.

Wenn man die falsche Eingabe nochmal ausgeben möchte, dann muss man die beiden Schritte natürlich trennen.

Code: Alles auswählen

zahl = 50
while True:
    try:
        eingabe = raw_input("Wie heißt die Zahl ? ")
        eingabe = int(eingabe)
    except ValueError:
        print eingabe, "ist eine ungültige Eingabe!"
        continue
Man könnte sich natürlich für die Eingabe als Zeichenkette noch einen anderen Namen ausdenken.
Wozu brauchst du hier eigentlich das continue,....sorry es hat noch nicht geklingelt.

LG

rolgal_reloaded

Verfasst: Mittwoch 2. Mai 2007, 10:09
von rolgal_reloaded
pyStyler hat geschrieben:war ein versehen.....
Was mich auch noch verwirrt:
Wäre es, wenn du es in Funktionen packst, nicht sinnvoller den Aufruf
zahl = zufall() an anderer Stelle zu machen?

LG

r_r

Verfasst: Mittwoch 2. Mai 2007, 10:46
von pyStyler
initalisiere die Funtion doch mal innerhalb der while Schleife . :D

Code: Alles auswählen

while True:
        zahl = zufall()
        eingabe = raw_input("Wie heißt die Zahl ? ")
        try:......

Verfasst: Mittwoch 2. Mai 2007, 11:10
von rolgal_reloaded
pyStyler hat geschrieben:initalisiere die Funtion doch mal innerhalb der while Schleife . :D

Code: Alles auswählen

while True:
        zahl = zufall()
        eingabe = raw_input("Wie heißt die Zahl ? ")
        try:......
Wie wäre es vor der while Schleife???

Oder überseh ich was?

LG

r_r

Verfasst: Mittwoch 2. Mai 2007, 11:33
von pyStyler
rolgal_reloaded hat geschrieben: Wie wäre es vor der while Schleife???
das würde auch gehen.
Du könntest der _main die 'zahl' als variable übergeben und die Funtion zufall() in der main initalisieren.
z.b

Code: Alles auswählen


def _main(zahl):
    print zahl
    # zahl = zufall() ist auch ok
    versuche = 1
    while True:
    #.........
if __name__=='__main__':
    zahl = zufall()
    main = _main(zahl)
Gruss
pyStyler

edit: link hinzugefügt
http://paste.pocoo.org/show/1469/

Verfasst: Mittwoch 2. Mai 2007, 12:04
von rolgal_reloaded
pyStyler hat geschrieben:
rolgal_reloaded hat geschrieben: Wie wäre es vor der while Schleife???
das würde auch gehen.
Du könntest der _main die 'zahl' als variable übergeben und die Funtion zufall() in der main initalisieren.
z.b

Code: Alles auswählen


def _main(zahl):
    print zahl
    # zahl = zufall() ist auch ok
    versuche = 1
    while True:
    #.........
if __name__=='__main__':
    zahl = zufall()
    main = _main(zahl)
Gruss
pyStyler

edit: link hinzugefügt
http://paste.pocoo.org/show/1469/
Gehen tut vieles:-)

Wenn man es aber vom Coder her streng auf Funktionen ausrichtet, dann gehört es meiner Meinung nach dahin, wo bei dir jetzt print zahl steht.

Denn bei deiner Variante bleibt es doch so oder so global, oder?

LG

r__r

Verfasst: Mittwoch 2. Mai 2007, 13:17
von pyStyler
rolgal_reloaded hat geschrieben: Gehen tut vieles:-)
ja ok ich habe dich falsch zitiert! Ich hab es eher auf die Frage bezogen
rolgal_reloaded hat geschrieben: Wie wäre es vor der while Schleife???
( wenn du das überhaupt meinst. )
rolgal_reloaded hat geschrieben: Wenn man es aber vom Coder her streng auf Funktionen ausrichtet, dann gehört es meiner Meinung nach dahin, wo bei dir jetzt print zahl steht.
ja ist richtig!
rolgal_reloaded hat geschrieben: Denn bei deiner Variante bleibt es doch so oder so global, oder?
ja genau so oder so :wink:

Verfasst: Mittwoch 2. Mai 2007, 13:25
von rolgal_reloaded
rolgal_reloaded hat geschrieben: Wie wäre es vor der while Schleife???
( wenn du das überhaupt meinst. )
Für einen Moment dachte ich, wir wären uns einig, aber......
Was meinst du mit "wenn du das überhaupt meinst"
:?:

LG

rolgal_reloaded

Verfasst: Mittwoch 2. Mai 2007, 13:34
von pyStyler
naja, ich dachte du wüsstest nicht, was ich mit "das würde auch gehen"
gemeint habe.

Aber ansonsten sind wir uns schon einig( hoff ich mal ). :D

Gruss
pyStyler