Sự khác biệt giữa `raw_input ()` và `input ()` trong Python 3 là gì?


362

Sự khác biệt giữa raw_input()input()trong Python 3 là gì?


3
Làm thế nào để bạn tạo một chương trình có đầu vào tương thích cả Python 2 và Python 3?
Solomon Ucko

2
Để làm điều đó bạn cố gắng để thiết lập inputđể raw_inputvà bỏ qua lỗi tên.
Solomon Ucko

3
Tra cứu thư viện 'sáu' để tương thích với python 2 và 3.
Jack Homan

Câu trả lời:


418

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ể.)


93
"Sự khác biệt giữa 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!
ivan_pozdeev

9
Trong Python 2 tôi đoán họ giả định rằng các lập trình viên thực sự muốn "thực thi" như một lệnh đầu vào của người dùng, vì ban đầu (tôi đoán) yêu cầu đầu vào từ người dùng có thể chỉ dành cho điều đó. Nhưng khi họ nhận ra các lập trình viên cũng có thể muốn có được đầu vào "thô", họ đã thiết kế một hàm khác gọi là "raw_input". Trong Python 3, họ nhận thấy điều ngu ngốc đó là gì và chỉ cần xóa thực thi mặc định của đầu vào ban đầu, chỉ mang lại một hàm đơn giản.
JC Rocamonde

1
Altern.it, chạy Py3.5.1 có raw_input () làm từ khóa.
OldBunny2800

2
Cần phải nói rằng 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.
PM 2Ring

1
@ PM2Ring Tôi đã thêm một cảnh báo cho câu trả lời. Tất nhiên có những trường hợp sử dụng hợp lệ cho cả hai eval()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ó.
Sven Marnach

192

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.


7
Bạn nên thêm rằng Python 3 không có raw_input().
Martin Thoma

việc sử dụng chạy đầu vào như biểu thức python là gì?
Akshay Vijay Jain

1
@AkshayVijayJain, có lẽ nó được dự định để nhập số. Nhưng nó hoàn toàn không an toàn.
MarSoft

112

Con trăn 2:

  • 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.

Con trăn 3:

  • 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()).


26

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 evalhàm.


7

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ế helloworldthậ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.


3

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")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.