30/09/2018, 16:36
Sự khác biệt giữa `input` và `raw_input` trong Python?
Mình đang học python và mình thắc mắc sự khác biệt giữa hàm input
với hàm raw_input
. Theo quyển Learn Python The Hard Way
thì mình thấy tác giả Zed Shaw bảo là không nên dùng input
vì lý do bảo mật.
Mọi người có thể giải thích giúp mình điểm này không?
Bài liên quan
Trong
python 2
thìraw_input
sẽ đọc 1 dòng từ stdin (bỏ đi kí tự'\n'
cuối cùng). Còninput
sẽeval
từraw_input
đọc được.###ví dụ:
Ở
python 3
thì họ không dùngraw_input
nữa mà dùnginput
tương đương vớiraw_input
ởpython 2
Lí do bảo mật chắc là
eval
từinput
rồiÀ, đã hiểu, cảm ơn @Gio nhé. Vậy ở Python 3 người ta đã bỏ
eval
từintput
rồi đúng không?stdin và eval có nghĩa là gì vậy anh ?
stdin
là standard input. Có thể hiểu là các thông tin nhập vào từ bàn phím. Nhưng thực ra nó cũng có thể làPipe
. Google tiếp nhé, đừng hỏipipe
là gì ^^eval
là chỉ việc python thực thi một dòng lệnh nào đấy. Trong trường hợp này thì mình nhập cái gì vào từstdin
thì python sẽ coi thông tin đó là code và sẽ chạy nó.cool quá
Vì thử sự khác nhau giữa ‘raw_input’ với ‘input’ trên cả 2 phiên bản python 2 và python 3 mà mình phát hiện ra là riêng với lệnh print ở 2 phiên bản khá khác nhau.
Python 2: viết print hay print() đều được
Python 3: bắt buộc phải viết print() lệnh mới chạy.
Về cơ bản là mình thích Python 3 hơn vì đơn giản, tinh gọn hơn. Ấy vậy mà lão tác giả cứ bắt học python 2
Đây là bài code tìm số lớn thứ 2 trong dãy i số đc nhập:
i = int(input())
lis = list(map(int, raw_input().split()))[:i]
z = max(lis)
while max(lis) == z:
lis.remove(max(lis))
print max(lis)
Python 2 vẫn dùng đc cả raw_input() và input().Mọi người phân biệt giúp mình với
Trong python 2 thì input sẽ chạy đoạn text mình nhập vào như 1 đoạn code, raw_input thì ko chạy mà lưu những gì mình nhập vào thành 1 string.
Trong Python2
input([prompt])
tương đương vớieval(raw_input([prompt]))
. Và bạn sẽ đi tìm hiểu hàmeval()
(evaluate - nó xem dữ liệu bạn đưa vào là code và thực thi nó) Và rằng bạn sẽ được khuyến cáo là không nên dùnginput()
trong python2 (vì lý do bảo mật), cho nên bạn phải dùngraw_input()
trong tất cả các bài tập của bạn.Một vài ví dụ đơn giản với
eval
:Output:
Bạn thấy đó, nếu bạn dùng nó trong cách script của bạn thì nguy hiểm biết chừng nào khi họ lợi dụng nó như lỗ hỗng để thực thi lệnh bất hợp pháp.
python 2 sao mình dùng input k đc pạn?
bạn code python 2, hay 3 vậy, sao mình code theo như bạn mak dùng python 2 nó báo lỗi
Python 2 nhé bạn. Python 3 không chạy được đâu
sao mình dùng python 2 nó lại báo lỗi chỗ intput ta, nếu thay = raw_input() thì hết lỗi
Bạn phải làm giống y như mình làm thì mới được bạn ơi :v
Đó là vì input() trong python2 tương đương với eval(raw_input()). Hàm eval nhận vào một string và định giá trị của string đó, cho nên giả sử bạn có câu lệnh
name = input()
mà mình đánh vào là hung thì nó sẽ eval(hung) xem biến hung này có giá trị là gì thì gán giá trị của hung cho name ngược lại nếu ko có biến nào là hung thì sẽ báo lỗi. Hàm input trong python2 có thể được dùng “chỉ để nhập số” vì eval() nếu nhận vào chuỗi vd như 12345 hoặc 123.45 thì cho ra giá trị của số luôn.