Seite 1 von 2
Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 09:55
von nfehren
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

Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 10:18
von darktrym
Funktioniert bei mir(mal von falscher Codierung abgesehen).
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 10:21
von nfehren
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?
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 10:33
von 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.
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 10:33
von mutetella
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
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 10:38
von nfehren
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..
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 11:10
von nfehren
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
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 11:24
von Hyperion
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.
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 11:28
von mutetella
Mich hat's in den Fingern gejuckt...
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
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 12:13
von nfehren
mutetella hat geschrieben:Mich hat's in den Fingern gejuckt...
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))
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 12:27
von Hyperion
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?
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 12:29
von mutetella
@nfehren
Was versprichst Du Dir von
vs.
Und, schon mal einen Treffer gelandet...?

Ich vermute, damit rennst Du gegen die Wand!
mutetella
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 12:47
von nfehren
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.
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 13:31
von Hyperion
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!

Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 13:49
von nfehren
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.
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 14:06
von mutetella
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
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 14:12
von snafu
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.
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 14:31
von cofi
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
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 15:35
von nfehren
Ich bin gerade dabei ein mastermind spiel zu programmieren, ich hoffe ihr kennt das alle noch
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: "))
Re: Random : 'module' object has no attribute 'randint'
Verfasst: Donnerstag 13. Februar 2014, 15:43
von 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`.