2013-02-20 40 views
9

Tôi gặp sự cố với chức năng nhập ngẫu nhiên của Python. Có vẻ như import randomfrom random import random đang nhập những thứ khác nhau. Tôi hiện đang sử dụng Python 2.7.3Chức năng ngẫu nhiên của 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' 
>>> 

Trả lời

23

import random nhập ngẫu nhiên mô-đun, có chứa nhiều thứ để làm với việc tạo số ngẫu nhiên. Trong số này là hàm ngẫu nhiên() , tạo số ngẫu nhiên giữa 0 và 1.

Nhập theo cách này yêu cầu bạn sử dụng cú pháp random.random().

Chức năng ngẫu nhiên cũng có thể được nhập khẩu từ các mô-đun riêng biệt:

from random import random 

này cho phép bạn sau đó chỉ cần gọi random() trực tiếp.

9

Vấn đề là có hai điều được gọi ngẫu nhiên ở đây: một là chính mô-đun và một là một hàm trong mô-đun đó. Bạn không thể có hai thứ có cùng tên trong không gian tên của bạn vì vậy bạn phải chọn một cái hoặc cái kia.

13

random module chứa hàm có tên random(), vì vậy bạn cần phải biết liệu bạn đã nhập mô-đun vào không gian tên của mình hay các hàm được nhập từ mô-đun.

import random sẽ nhập mô-đun ngẫu nhiên trong khi from random import random sẽ nhập cụ thể chức năng ngẫu nhiên từ mô-đun.

Vì vậy, bạn sẽ có thể làm một trong các cách sau:

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

hoặc ...

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

Vâng, vâng, họ nhập những thứ khác nhau. import random nhập mô-đun random, from random import random nhập hàm random từ mô-đun random. Đây thực sự là một ví dụ điển hình về lý do tại sao khi thiết kế một API bằng Python, bạn nên tránh đặt tên mô-đun và các thành viên của chúng giống nhau.

4
import random 

bao gồm mô-đun vào không gian tên dưới tên 'ngẫu nhiên'.

from random import random 

bao gồm hàm 'ngẫu nhiên' từ không gian tên 'ngẫu nhiên' vào không gian tên chung.

Vì vậy, trong ví dụ đầu tiên, bạn sẽ gọi random.random và trong ví dụ thứ hai, bạn sẽ gọi ngẫu nhiên. Cả hai sẽ truy cập cùng một chức năng.

Tương tự,

from random import randint 

sẽ nhập khẩu randint vào namespace toàn cục, vì vậy bạn chỉ có thể gọi randint thay vì random.randint.

0

Nếu bạn sử dụng from random import random, bạn phải gọi randint() như vậy: randint(1,5). Nếu bạn sử dụng import random, bạn gọi nó là như vậy: random.randint(1,5).

1

Mô-đun 'ngẫu nhiên' là một gói từ thư viện chuẩn python, cũng như một hàm được định nghĩa trong gói này.

Sử dụng 'nhập ngẫu nhiên' nhập gói, sau đó bạn có thể sử dụng chức năng từ gói này: 'random.random()'. Bạn có thể sử dụng bất kỳ chức năng nào khác từ gói 'ngẫu nhiên'.

Bạn cũng có thể yêu cầu python chỉ nhập riêng hàm ngẫu nhiên từ gói ngẫu nhiên: 'từ ngẫu nhiên nhập ngẫu nhiên'. Sau đó, bạn chỉ có thể sử dụng hàm 'random()' và không nên chỉ định gói đó đến từ đó. Tuy nhiên, bạn không thể sử dụng bất kỳ chức năng nào khác từ gói ngẫu nhiên, vì chúng chưa được nhập nếu bạn sử dụng 'từ ngẫu nhiên nhập ngẫu nhiên'.

0

Nếu bạn đang sử dụng PyDev hoặc IDE thông minh khác, hãy đảm bảo rằng nó không tự động nhập mô-đun, ghi đè quá trình nhập của bạn. Nó có thể đặc biệt khó hiểu ở đây, khi tên mô-đun bằng tên hàm, vì lỗi được ném không phải là NameError. Trong trường hợp của tôi, tôi thêm

import random 

và sau đó sử dụng nó:

r = random.radom() 

nhưng có:

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

Chỉ sau khi tìm kiếm tôi thấy rằng PyDev tự động thêm vào dòng

from random import random 

đến cuối i của tôi mports, vì vậy tôi đã thực sự gọi thuộc tính random của phương thức random. Giải pháp là xóa tự động nhập hoặc sử dụng nó và gọi trực tiếp phương thức random().

Các vấn đề liên quan