Sự khác biệt giữa raw_input()
và input()
trong Python 3 là gì?
input
để raw_input
và bỏ qua lỗi tên.
Sự khác biệt giữa raw_input()
và input()
trong Python 3 là gì?
input
để raw_input
và bỏ qua lỗi tên.
Câu trả lời:
Sự khác biệt là raw_input()
không tồn tại trong Python 3.x, trong khi input()
đó. Trên thực tế, cái cũ raw_input()
đã được đổi tên thành input()
, và cái cũ input()
đã biến mất, nhưng có thể dễ dàng được mô phỏng bằng cách sử dụng eval(input())
. (Hãy nhớ rằng đó eval()
là xấu xa. Cố gắng sử dụng các cách an toàn hơn để phân tích cú pháp đầu vào của bạn nếu có thể.)
raw_input
...?" - "Sự khác biệt là không có raw_input
." ... Khá là một sự khác biệt lớn, tôi muốn nói!
eval
(và exec
) nói chung nên tránh vì chúng có thể là một rủi ro bảo mật. Để biết chi tiết, xin vui lòng xem Eval thực sự nguy hiểm bởi Ned Batchelder kỳ cựu của SO. Và tất nhiên lời khuyên đó cũng áp dụng cho Python 2 cũ input
.
eval()
và exec()
, nhưng trước tiên bạn cần hiểu lý do tại sao bạn không nên sử dụng eval()
trước khi quyết định sử dụng nó.
Trong Python 2 , raw_input()
trả về một chuỗi và input()
cố gắng chạy đầu vào dưới dạng biểu thức Python.
Vì nhận được một chuỗi hầu như luôn luôn là những gì bạn muốn, Python 3 thực hiện điều đó với input()
. Như Sven nói, nếu bạn muốn hành vi cũ, hãy eval(input())
làm việc.
raw_input()
.
raw_input()
lấy chính xác những gì người dùng đã gõ và chuyển nó trở lại dưới dạng một chuỗi.
input()
đầu tiên lấy raw_input()
và sau đó thực hiện một eval()
trên nó là tốt.
Sự khác biệt chính là input()
mong đợi một tuyên bố python đúng về mặt cú pháp trong trường hợp raw_input()
không.
raw_input()
đã được đổi tên thành để input()
bây giờ input()
trả về chuỗi chính xác.input()
đã được gỡ bỏ.Nếu bạn muốn sử dụng cái cũ input()
, nghĩa là bạn cần đánh giá đầu vào của người dùng dưới dạng câu lệnh python, bạn phải thực hiện thủ công bằng cách sử dụng eval(input())
.
Trong Python 3, raw_input()
không tồn tại đã được Sven đề cập.
Trong Python 2, input()
hàm đánh giá đầu vào của bạn.
Thí dụ:
name = input("what is your name ?")
what is your name ?harsha
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
name = input("what is your name ?")
File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined
Trong ví dụ trên, Python 2.x đang cố gắng đánh giá harsha như một biến chứ không phải là một chuỗi. Để tránh điều đó, chúng tôi có thể sử dụng dấu ngoặc kép xung quanh đầu vào của chúng tôi như "harsha":
>>> name = input("what is your name?")
what is your name?"harsha"
>>> print(name)
harsha
raw_input ()
Hàm raw_input () `không đánh giá, nó sẽ chỉ đọc bất cứ thứ gì bạn nhập.
Thí dụ:
name = raw_input("what is your name ?")
what is your name ?harsha
>>> name
'harsha'
Thí dụ:
name = eval(raw_input("what is your name?"))
what is your name?harsha
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
name = eval(raw_input("what is your name?"))
File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined
Trong ví dụ trên, tôi chỉ cố gắng đánh giá đầu vào của người dùng bằng eval
hàm.
Tôi muốn thêm một chút chi tiết vào lời giải thích được cung cấp bởi mọi người cho người dùng python 2 .raw_input()
, mà bây giờ, bạn biết rằng đánh giá dữ liệu nào người dùng nhập dưới dạng chuỗi. Điều này có nghĩa là python không cố gắng thậm chí hiểu lại dữ liệu đã nhập. Tất cả những gì nó sẽ xem xét là dữ liệu đã nhập sẽ là chuỗi, cho dù đó là chuỗi thực hay int hay bất cứ thứ gì.
Trong khi input()
trên cố gắng Mặt khác để hiểu được dữ liệu nhập vào bởi người sử dụng. Vì vậy, đầu vào như thế helloworld
thậm chí sẽ hiển thị lỗi là 'helloworld is undefined
'.
Tóm lại, đối với python 2 , để nhập một chuỗi quá, bạn cần nhập nó như ' helloworld
', đó là cấu trúc phổ biến được sử dụng trong python để sử dụng chuỗi.
Nếu bạn muốn đảm bảo, mã của bạn đang chạy với python2 và python3, hãy sử dụng hàm input () trong tập lệnh của bạn và thêm đoạn mã này để bắt đầu tập lệnh của bạn:
from sys import version_info
if version_info.major == 3:
pass
elif version_info.major == 2:
try:
input = raw_input
except NameError:
pass
else:
print ("Unknown python version - input function not safe")