Random : 'module' object has no attribute 'randint'

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.
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Hey Leute.
Ich möchte eine Art "Lottospiel" in Python programmieren. Dort sollen zuerst 5 Zahlen abgefragt werden und dann per "random" 5 zahlen generiert werden. Dann sollen diese beide auf Übereinstimmung kontrolliert werden. Jetzt hab ich aber ein Problem das ich nicht verstehe: Das random module macht Probleme. Ich lade wie immer das modul (import random) und rufe es dann auf (z.B.: zahl1= random.randint(1,10)). Nun gibt mir die Konsole allerding folgendes aus: 'module' object has no attribute 'randint'. Dabei habe ich schon das random modul für dutzende programme genau so genuzt.

Hab ich irgendwas übersehen?

Code: Alles auswählen

#!/usr/bin/python3
import random
import sys

zahl1 = int(input("Geben sie ihre erste Zahl ein: "))
if zahl1 >10:
    print("Error, nur zahlen zwischen 1 und 10!")
    sys.exit(1)
zahl2 = int(input("Geben sie ihre zweite Zahl ein: "))
if zahl2 >10:
    print("Error, nur zahlen zwischen 1 und 10!")
    sys.exit(1)
zahl3 = int(input("Geben sie ihre dritte Zahl ein: "))
if zahl3 >10:
    print("Error, nur zahlen zwischen 1 und 10!")
    sys.exit(1)
zahl4 = int(input("Geben sie ihre vierte Zahl ein: "))
if zahl4 >10:
    print("Error, nur zahlen zwischen 1 und 10!")
    sys.exit(1)
zahl5 = int(input("Geben sie ihre fünfte Zahl ein: "))
if zahl5 >10:
    print("Error, nur zahlen zwischen 1 und 10!")
    sys.exit(1)

zahl11 = random.randint(0,11)
Freu mich über alle antworten :lol:
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Funktioniert bei mir(mal von falscher Codierung abgesehen).
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

darktrym hat geschrieben:Funktioniert bei mir(mal von falscher Codierung abgesehen).
Komisch bei mir wird abgebrochen sobald ich zu der generierung der zahl1_1 komme..

Ja die codierung ist nicht optimal bin auch noch ganz am Anfang des Programms.

Edit: Kann man in einer Schleife jedem durchlauf eine variabel zu weisen?

Das heisst beim ersten durchlauf kommt zum Beispiel 3 raus dann ist zahl1 = 3 beim zweiten durchlauf kommt 7 raus dann ist zahl2 = 7.
Geht das?
BlackJack

@nfehren: Ich habe da so eine Vermutung wie Du Dein Modul genannt hast. Gib das Modulobjekt doch gleich nach dem Importieren mit `print()` aus und schau Dir an welches Modul das ist.

Wenn Du den gesamten Traceback gezeigt hättest, dann müssten wir da jetzt übrigens nicht raten, denn da steht ja auch Pfad und Name des ausgeführten Moduls drin.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

nfehren hat geschrieben:Komisch bei mir wird abgebrochen sobald ich zu der generierung der zahl1_1 komme..
Fehlermeldung? Traceback?
nfehren hat geschrieben:Edit: Kann man in einer Schleife jedem durchlauf eine variabel zu weisen?
Benutze Schleifen und Listen.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

BlackJack hat geschrieben:@nfehren: Ich habe da so eine Vermutung wie Du Dein Modul genannt hast. Gib das Modulobjekt doch gleich nach dem Importieren mit `print()` aus und schau Dir an welches Modul das ist.

Wenn Du den gesamten Traceback gezeigt hättest, dann müssten wir da jetzt übrigens nicht raten, denn da steht ja auch Pfad und Name des ausgeführten Moduls drin.
Dummer Dateiname.. random.py daran lags ^^

Klappt jetzt auch einwandfrei..
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Ich habe den Code jetzt mal funktionsfähig.

Code: Alles auswählen

#!/usr/bin/python3
import random

zahl1_1 = random.randint(1,9)
zahl2_1 = random.randint(1,9)
zahl3_1 = random.randint(1,9)
zahl4_1 = random.randint(1,9)
zahl5_1 = random.randint(1,9)


zahl1 = int(input("Geben sie ihre erste Zahl ein: "))
zahl2 = int(input("Geben sie ihre zweite Zahl ein: "))
zahl3 = int(input("Geben sie ihre dritte Zahl ein: "))
zahl4 = int(input("Geben sie ihre vierte Zahl ein: "))
zahl5 = int(input("Geben sie ihre fünfte Zahl ein: "))

i = 0
if zahl1 == zahl1_1:
    i = i+1
if zahl2 == zahl2_1:
    i = i+1
if zahl3 == zahl3_1:
    i = i+1
if zahl4 == zahl4_1:
    i = i+1
if zahl5 == zahl5_1:
    i = i+1

print("\n\nSie haben {0} Zahlen richtig getippt! Ihr zahlen lauteten: {1}|{2}|{3}|{4}|{5}. Die richtige Zahlenfolge war: {6}|{7}|{8}|{9}|{10}.".format(i, zahl1, zahl2, zahl3, zahl4, zahl5, zahl1_1, zahl2_1, zahl3_1, zahl4_1, zahl5_1))

Ich finde aber nirgends erklärt wie man jedem durchlauf einer schleife eine variable zuweist.

Edit: Dann könnte ich die generierung und die abfrage der Zahlen in 2 schleifen packen
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So, nun erweitere das mal auf 10 Zahlen!

Danach hast Du gelernt, wie man es *nicht* machen sollte, quasi auf die "harte Tour" oder wie didaktisch im recht guten Tutorial "Learn Python the hard way" oftmals vorgegangen wird.

Als nächstes schaust Du Dir mal die grundlegenden Datenstrukturen an; beginne mit den Listen :-)

Dann wirst Du (hoffentlich) wissen, wie man dein Programm wesentlich besser gestalten kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Mich hat's in den Fingern gejuckt... :mrgreen:

Code: Alles auswählen

import random

def guess(counts):
    numbers = [random.randint(1, 9) for _ in range(counts)]
    results = [
        int(input("Number: ")) == number for number in numbers
    ]
    print('Sie haben {} mal richtig getippt!\n'
          'Die richtigen Zahlen waren: {}'.format(sum(results), numbers))
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

mutetella hat geschrieben:Mich hat's in den Fingern gejuckt... :mrgreen:

Code: Alles auswählen

import random

def guess(counts):
    numbers = [random.randint(1, 9) for _ in range(counts)]
    results = [
        int(input("Number: ")) == number for number in numbers
    ]
    print('Sie haben {} mal richtig getippt!\n'
          'Die richtigen Zahlen waren: {}'.format(sum(results), numbers))
mutetella
Danke. Habe den Code noch ein wenig umgeändert:

Code: Alles auswählen

import random
zahlen = [random.randint(1,9) for i in range (1,6)]
versuch = [int(input("Zahl: ")) == zahlen for zahlen in zahlen]
print("Sie haben {0} mal richtig getippt!\nDie richtigen Zahlen waren: {1}".format(sum(versuch), zahlen))
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

nfehren hat geschrieben: Danke. Habe den Code noch ein wenig umgeändert:

Code: Alles auswählen

import random
zahlen = [random.randint(1,9) for i in range (1,6)]
versuch = [int(input("Zahl: ")) == zahlen for zahlen in zahlen]
print("Sie haben {0} mal richtig getippt!\nDie richtigen Zahlen waren: {1}".format(sum(versuch), zahlen))
Wo genau liegt darin eine Verbesserung? Abgesehen davon, dass Du nun PEP8 verletzt, hast Du auch noch eine Magic-Number eingebaut (die "6")... Zudem hast Du alles auf Modul-Ebene geholt, indem Du die Funktion abgeschafft hast.

Summa Summarum: Kein gelungenes Refactoring...

Und das wichtigste von allem: Du verstehst ja sicherlich nicht, *was* da abläuft und *wieso* man das so schreiben kann, oder?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@nfehren
Was versprichst Du Dir von

Code: Alles auswählen

[random.randint(1,9) for i in range (1,6)]
vs.

Code: Alles auswählen

[random.randint(1, 9) for _ in range(5)]

Code: Alles auswählen

[int(input("Zahl: ")) == zahlen for zahlen in zahlen]
Und, schon mal einen Treffer gelandet...? :twisted: Ich vermute, damit rennst Du gegen die Wand!

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Hyperion hat geschrieben:
nfehren hat geschrieben: Danke. Habe den Code noch ein wenig umgeändert:

Code: Alles auswählen

import random
zahlen = [random.randint(1,9) for i in range (1,6)]
versuch = [int(input("Zahl: ")) == zahlen for zahlen in zahlen]
print("Sie haben {0} mal richtig getippt!\nDie richtigen Zahlen waren: {1}".format(sum(versuch), zahlen))
Wo genau liegt darin eine Verbesserung? Abgesehen davon, dass Du nun PEP8 verletzt, hast Du auch noch eine Magic-Number eingebaut (die "6")... Zudem hast Du alles auf Modul-Ebene geholt, indem Du die Funktion abgeschafft hast.

Summa Summarum: Kein gelungenes Refactoring...

Und das wichtigste von allem: Du verstehst ja sicherlich nicht, *was* da abläuft und *wieso* man das so schreiben kann, oder?
Das mit den funktionen versteh ich noch nicht, nein.
aber sonst versteh ich den Code größtenteils.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

nfehren hat geschrieben: Das mit den funktionen versteh ich noch nicht, nein.
aber sonst versteh ich den Code größtenteils.
Ganz ehrlich: Glaub ich Dir nicht! ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Hyperion hat geschrieben:
nfehren hat geschrieben: Das mit den funktionen versteh ich noch nicht, nein.
aber sonst versteh ich den Code größtenteils.
Ganz ehrlich: Glaub ich Dir nicht! ;-)
Ich probiere gerade nach dem ähnlichen prinzip ein mastermind spiel zu erstellen, klappt auch ganz gut soweit ich muss nur noch die listen miteinander vergleichen.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Wobei ich mein "... gegen die Wand fahren" zurücknehmen muss. Arbeitet eine LC in einem eigenen Namensraum?

Code: Alles auswählen

>>> zahlen = [1, 2, 3, 4, 5]
>>> zahlen_ = [zahlen for zahlen in zahlen]
>>> zahlen_
[1, 2, 3, 4, 5]
>>> zahlen
[1, 2, 3, 4, 5]
>>> zahlen_ = []
>>> for zahlen in zahlen:
...     zahlen_.append(zahlen)
... 
>>> zahlen_
[1, 2, 3, 4, 5]
>>> zahlen
5
mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

mutetella hat geschrieben:Arbeitet eine LC in einem eigenen Namensraum?
Jepp:

Code: Alles auswählen

>>> zahlen = [1, 2, 3, 4, 5]
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> [x for x in zahlen]
[1, 2, 3, 4, 5]
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
Demgegenüber:

Code: Alles auswählen

>>> for x in zahlen:
...     print(x)
... 
1
2
3
4
5
>>> x
5
Ist IMHO ein ungewöhnliches Verhalten, aber so war wohl die Design-Entscheidung der Python-Entwickler.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dass LCs nicht in den Namensraum leaken ist aber etwas anderes und gilt auch erst ab Python3. Python2.7.6:

Code: Alles auswählen

In [3]: zahlen = [1, 2, 3, 4, 5]

In [4]: [zahlen for zahlen in zahlen]
Out[4]: [1, 2, 3, 4, 5]

In [5]: [zahlen for zahlen in zahlen]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-20478e008e28> in <module>()
----> 1 [zahlen for zahlen in zahlen]

TypeError: 'int' object is not iterable
nfehren
User
Beiträge: 98
Registriert: Donnerstag 31. Oktober 2013, 15:11

Ich bin gerade dabei ein mastermind spiel zu programmieren, ich hoffe ihr kennt das alle noch :P
Blos steh ich grad auf dem Schlauch wie ich die Listen miteinander vergleichen kann..

könnt ihr mir sagen welche syntax ich mir anschauen sollte?

hier mein code bis jetzt:

Code: Alles auswählen

import random

lösung = [random.sample(["rot", "blau", "gelb", "grün", "grau", "pink"],4)]

eingabe = []
for i in range(4):
    eingabe.append(input("Farbe: "))
BlackJack

@nfehren: Der Struktur von `lösung` macht nicht viel Sinn. Da ist eine Liste zu viel.

Was die ”Syntax” betrifft, dazu braucht man unter anderem Schleifen und vielleicht auch „list comprehension”. An Funktionen wird `zip()` und `len()` nützlich sein und an Datentypen der Mengentyp `set`.
Antworten