Wieder mal random

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.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 2. Mai 2007, 07:17

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
Zuletzt geändert von rolgal_reloaded am Mittwoch 2. Mai 2007, 09:29, insgesamt 1-mal geändert.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Mittwoch 2. Mai 2007, 08:12

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
BlackJack

Mittwoch 2. Mai 2007, 08:21

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.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 2. Mai 2007, 08:25

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!
Zuletzt geändert von rolgal_reloaded am Mittwoch 2. Mai 2007, 09:42, insgesamt 1-mal geändert.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 2. Mai 2007, 08:26

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.
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 2. Mai 2007, 09:38

@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"
BlackJack

Mittwoch 2. Mai 2007, 09:55

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.
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Mittwoch 2. Mai 2007, 09:57

war ein versehen.....
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 2. Mai 2007, 10:05

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
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 2. Mai 2007, 10:09

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
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Mittwoch 2. Mai 2007, 10:46

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:......
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 2. Mai 2007, 11:10

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
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Mittwoch 2. Mai 2007, 11:33

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/
rolgal_reloaded
User
Beiträge: 312
Registriert: Dienstag 24. Oktober 2006, 19:31

Mittwoch 2. Mai 2007, 12:04

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
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Mittwoch 2. Mai 2007, 13:17

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