Función aleatoria de Python

Estoy teniendo problemas con la función aleatoria de importación de Python. Parece que las import random y las from random import random están importando cosas diferentes. Actualmente estoy usando Python 2.7.3

 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 "", line 1, in  random() NameError: name 'random' is not defined >>> random.randint(1,5) Traceback (most recent call last): File "", line 1, in  random.randint(1,5) NameError: name 'random' is not defined >>> import random >>> random() Traceback (most recent call last): File "", line 1, in  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 "", line 1, in  random.randint(1,5) AttributeError: 'builtin_function_or_method' object has no attribute 'randint' >>> 

import random importa el módulo aleatorio, que contiene una variedad de cosas que hacer con la generación de números aleatorios. Entre ellas se encuentra la función random (), que genera números aleatorios entre 0 y 1.

Hacer la importación de esta manera requiere que uses la syntax random.random() .

La función aleatoria también se puede importar del módulo por separado:

 from random import random 

Esto te permite llamar directamente a random() .

El módulo aleatorio contiene una función llamada random() , por lo que debe saber si ha importado el módulo a su espacio de nombres o funciones importadas desde el módulo.

import random importará el módulo aleatorio mientras que from random import random importará específicamente la función aleatoria desde el módulo.

Así podrás hacer uno de los siguientes:

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

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 

El problema es que hay dos cosas que se llaman aleatorias aquí: una es el propio módulo y otra es una función dentro de ese módulo. No puede tener dos cosas con el mismo nombre en su espacio de nombres, por lo que debe elegir una u otra.

 import random 

incluye el módulo en el espacio de nombres bajo el nombre ‘random’.

 from random import random 

incluye la función ‘al azar’ del espacio de nombres ‘aleatorio’ al espacio de nombres global.

Entonces, en el primer ejemplo, llamarías random.random, y en el segundo, llamarías random. Ambos accederían a la misma función.

Similar,

 from random import randint 

importaría randint en el espacio de nombres global, por lo que simplemente podría llamar a randint en lugar de random.randint.

Pues sí, importan cosas diferentes. import random importa el módulo random , from random import random importa la función random desde el módulo random . Este es en realidad un buen ejemplo de por qué al diseñar una API en Python, a menudo es una buena idea tratar de evitar nombrar a los módulos y sus miembros de la misma manera.

El módulo ‘aleatorio’ es un paquete de la biblioteca estándar de Python, así como una función definida en este paquete.

Al usar ‘importar al azar’ se importa el paquete, que luego puede usar la función de este paquete: ‘random.random ()’. También puede utilizar cualquier otra función del paquete ‘aleatorio’.

También puede decirle a python que importe específicamente solo la función aleatoria del paquete aleatorio: ‘desde importación aleatoria aleatoria’. Entonces solo puede usar la función ‘random ()’, y no debe especificar el paquete del que proviene. Sin embargo, no puede utilizar ninguna otra función del paquete aleatorio, ya que no se han importado si utiliza ‘desde importación aleatoria aleatoria’.

Si utiliza from random import random , debe llamar a randint () así: randint(1,5) . Si usas import random , la llamas así: random.randint(1,5) .

Si está utilizando PyDev u otro IDE inteligente, asegúrese de que no importó el módulo automáticamente, anulando su importación. Puede ser especialmente confuso aquí, cuando el nombre del módulo es igual al nombre de una función, porque el error que se produce no es un NameError . En mi caso he añadido.

 import random 

y luego lo usé:

 r = random.radom() 

pero consiguió

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

Solo después de buscar encontré que PyDev agregó automáticamente la línea

 from random import random 

hasta el final de mis importaciones, así que de hecho estaba llamando atributo random of method random . La solución es eliminar la importación automática o usarla y llamar directamente al método random() .

Debe importar la función aleatoria, desde el módulo aleatorio antes de poder usarla.

 In [1]: from random import random In [2]: random() Out[2]: 0.5607917948041573