2013-02-20 15 views
9

Sto riscontrando problemi con la funzione casuale di importazione di Python. Sembra che import random e from random import random stiano importando cose diverse. Attualmente sto usando Python 2.7.3Funzione casuale Python

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> random() 

Traceback (most recent call last): 
File "<pyshell#0>", line 1, in <module> 
    random() 
NameError: name 'random' is not defined 
>>> random.randint(1,5) 

Traceback (most recent call last): 
File "<pyshell#1>", line 1, in <module> 
random.randint(1,5) 
NameError: name 'random' is not defined 
>>> import random 
>>> random() 

Traceback (most recent call last): 
File "<pyshell#3>", line 1, in <module> 
random() 

TypeError: 'module' object is not callable 
>>> random.randint(1,5) 
2 
>>> from random import random 
>>> random() 
0.28242411635200193 
>>> random.randint(1,5) 

Traceback (most recent call last): 
File "<pyshell#7>", line 1, in <module> 
random.randint(1,5) 
AttributeError: 'builtin_function_or_method' object has no attribute 'randint' 
>>> 

risposta

23

import random importa il modulo casuale, che contiene una varietà di cose da fare con la generazione di numeri casuali. Tra questi è il casuale() funzione, che genera numeri casuali tra 0 e 1.

Facendo l'importazione in questo modo questo richiede di utilizzare la sintassi random.random().

La funzione random possono anche essere importati dal modulo separatamente:

from random import random 

Ciò consente di poi basta chiamare random() direttamente.

9

Il problema è che ci sono due cose chiamate casuale qui: uno è il modulo stesso, e uno è una funzione all'interno di quel modulo. Non puoi avere due cose con lo stesso nome nel tuo spazio dei nomi, quindi devi scegliere l'una o l'altra.

13

Il random module contiene una funzione denominata random(), quindi è necessario essere a conoscenza se il modulo è stato importato nel proprio spazio dei nomi o le funzioni importate dal modulo.

import random importa il modulo casuale mentre from random import random importa in modo specifico la funzione casuale dal modulo.

Così sarete in grado di fare una delle seguenti:

import random 
a = random.random() 
b = random.randint(1, 5) 
# you can call any function from the random module using random.<function> 

o ...

from random import random, randint # add any other functions you need here 
a = random() 
b = randint(1, 5) 
# those function names from the import statement are added to your namespace 
3

Beh, sì, importano cose diverse. import random importa il modulo random, from random import random importa la funzione random dal modulo random. Questo è in realtà un buon esempio del perché quando si progetta un'API in Python, è spesso una buona idea cercare di evitare di denominare i moduli e i loro membri la stessa cosa.

4
import random 

include il modulo nello spazio dei nomi sotto il nome "casuale".

include la funzione 'casuale' dallo spazio dei nomi 'casuale' nello spazio dei nomi globale.

Quindi nel primo esempio, chiameresti random.random, e nel secondo, chiameresti casuale. Entrambi avrebbero accesso alla stessa funzione.

Allo stesso modo,

from random import randint 

sarebbe importare randint nel namespace globale, quindi si può semplicemente chiamare randint invece di random.randint.

0

Se si utilizza from random import random, è necessario chiamare randint() in questo modo: randint(1,5). Se si utilizza import random, lo si chiama in questo modo: random.randint(1,5).

1

Il modulo 'random' è un pacchetto dalla libreria standard python, nonché una funzione definita in questo pacchetto.

L'utilizzo di "importazione casuale" importa il pacchetto, che è quindi possibile utilizzare la funzione da questo pacchetto: "random.random()". Puoi usare qualsiasi altra funzione dal pacchetto 'random'.

Si può anche dire a python di importare in modo specifico solo la funzione casuale dal pacchetto casuale: "da casuale a caso". Quindi puoi usare solo la funzione 'random()', e non specificare il pacchetto da cui proviene. Tuttavia non è possibile utilizzare altre funzioni dal pacchetto casuale, perché non sono state importate se si utilizza 'dall'importazione casuale casuale'.

0

Se si utilizza PyDev o altri IDE intelligenti, assicurarsi che non abbia importato automaticamente il modulo, ignorando l'importazione. Può essere particolarmente confuso qui, quando il nome del modulo è uguale a un nome di funzione, perché l'errore generato non è un NameError. Nel mio caso ho aggiunto

import random 

e in seguito usato:

r = random.radom() 

ma ho ottenuto:

AttributeError: 'builtin_function_or_method' object has no attribute 'random' 

Solo dopo la ricerca ho scoperto che PyDev automaticamente aggiunto alla linea

from random import random 

fino alla fine della mia i mports, quindi in effetti stavo chiamando l'attributo random del metodo random. La soluzione è eliminare l'importazione automatica o usarla e chiamare direttamente il metodo random().