Giới thiệu
Trong bài trước, Kteam đã giới thiệu đến bạn hàm print
- một hàm giúp bạn xuất kết quả ra màn hình (Shell). Trong bài này, chúng ta sẽ tiếp tục khám phá về việc nhập và xuất dữ liệu trong Python.
Nội dung
Để hiểu bài viết này tốt nhất, bạn cần:
- Cài đặt môi trường phát triển Python.
- Xem qua bài viết "Cách chạy chương trình Python".
- Nắm cách ghi chú và biến trong Python.
- Hiểu về kiểu dữ liệu list, tuple, set, và dict trong Python.
- Biết cách xử lí file trong Python.
- Biết cách sử dụng hàm
print
trong Python.
Trong bài viết này, chúng ta sẽ tìm hiểu về các nội dung sau:
- Vì sao cần hàm
input
? - Cách sử dụng hàm
input
. - Hàm
input
trong Python 3.X vàraw_input
trong Python 2.X. - Lưu ý khi sử dụng hàm
input
trong Python 2.X.
Vì sao cần hàm input
?
Hãy tưởng tượng bạn là một lập trình viên đơn giản, tên là Tèo. Một ngày, Tèo viết một chương trình in ra dòng chữ "Xin chào Tiên". Và đây là đoạn code Tèo viết:
name = 'Tiên'
print('Xin chào', name)
Mọi thứ diễn ra tốt đẹp, chương trình chạy đúng theo ý Tèo và cũng nhờ đó Tèo đã tạo được cảm tình với Tiên.
Tuy nhiên, sau đó, Tèo lại muốn viết một chương trình tương tự như thế, nhưng lần này in ra dòng chữ "Xin chào Thu". Tèo chỉ cần sửa lại đoạn code như sau:
name = 'Thu'
print('Xin chào', name)
Tuy nhiên, nhiều bạn khác cũng muốn Tèo viết cho họ một chương trình tương tự, với tên riêng của họ như Quỳnh, Nhi, Giao, Như, Uyên, Hương, Loan, Trung, Nam,... Khi đó, Tèo phải sửa code lần này đến lần khác.
Việc này có thể không mất quá nhiều thời gian nếu Tèo viết cho mỗi bạn một chương trình riêng, hoặc là mỗi lần viết là Tèo viết cho một bạn và thay đổi mã nguồn. Tuy nhiên, nếu dung lượng máy của Tèo có hạn hoặc Tèo không có đủ thời gian để chỉnh sửa code lần này tới lần khác, thì sao? Tèo muốn viết một lần và có thể áp dụng cho nhiều người.
Điều này đưa ra cho Tèo một yêu cầu, đó chính là biến name
phải là một biến có dữ liệu được nhập mỗi khi chạy chương trình thay vì được đặt sẵn một giá trị. Và nhờ một hàm có tên là input
, Tèo đã giải quyết được vấn đề này sau ba ngày và ba đêm tìm kiếm trên Google.
Tìm hiểu cách sử dụng hàm input
Theo như Tèo tìm kiếm trong tài liệu trên trang chủ của Python, hàm input
có cú pháp như sau:
input(prompt=None)
Lưu ý: Có lúc bạn có thể nhìn thấy cú pháp của nó là input(prompt=None, /)
. Cái phần thêm vào là kí tự /
chỉ là một kí tự cho biết parameter prompt
chỉ nhận giá trị dưới dạng positional argument. Nghĩa là khi bạn truyền vào cho hàm, bạn không được phép điền thêm chữ prompt
.
Ví dụ:
input('string') # hợp lệ
input(prompt='string') # không hợp lệ
Parameter prompt
là một parameter tùy chọn. Bạn có thể nhập hoặc không, vì nó đã có giá trị mặc định là None.
Công dụng: Hàm này giúp chúng ta đọc một chuỗi từ standard input (hiểu nôm na là việc bạn nhập dữ liệu lên trên Shell) sau đó trả về cho chúng ta. Và vì nó là đọc một chuỗi, nên dù bạn có nhập cái gì đi chăng nữa, thì nó vẫn là một chuỗi dù là số, list, tuple, set, dictionary,...
Việc nhập sẽ kết thúc sau khi bạn nhấn phím enter
. Nếu trong lúc nhập bạn nhấn EOF
(như Ctrl + D
trên hệ điều hành Unix và Ctrl + Z
trên hệ điều hành Windows), thì sẽ sinh lỗi EOFError
.
Nếu prompt
khác None, có nghĩa là bạn gửi cho prompt
một giá trị. Thì giá trị này sẽ được in ra mà không có kí tự newline đi kèm trước khi đọc giá trị nhập vào.
Chúng ta đến với ví dụ. Hãy tạo một file có nội dung như sau:
value = input() # prompt để None
print('first value is =>', value)
next_value = input('please enter one more value: ')
print('The second value is =>', next_value)
Hình ảnh chạy chương trình
Đây là hình ảnh khi chạy chương trình trên. Trong đó:
- Những dòng có mũi tên màu đỏ là những dòng thực hiện hàm
input
. - Những chữ gạch chân màu vàng chính là giá trị nhập vào.
Đầu tiên, chúng ta sẽ được yêu cầu nhập dữ liệu vào cho biến value
. Ở đây, tôi nhập vào giá trị là Kteam
. Và điều đó được kiểm chứng bằng việc ở dòng tiếp theo, giá trị Kteam
được in ra màn hình.
Tiếp đến, chúng ta tiếp tục được yêu cầu nhập dữ liệu. Bạn có thể thấy khác so với lần chúng ta sử dụng hàm input
khi không truyền giá trị vào cho parameter prompt
. Giờ đây, chúng ta có một dòng ghi chú yêu cầu nhập dữ liệu. Và với giá trị nhập vào là Free Education
, giá trị đó đã được in ra ở dòng cuối cùng.
Lưu ý rằng trong ví dụ trên, giá trị trả về luôn luôn là chuỗi.
Hãy thử đoạn code sau:
# reading input
int_num = input('Enter an integer: ')
float_num = input('Enter a float: ')
lst = input('Enter a list: ')
tup = input('Enter a tuple: ')
set_ = input('Enter a set: ')
dict_ = input('Enter a dict: ')
# print out output
print('Type of int_num', type(int_num))
print('Type of float_num', type(float_num))
print('Type of lst', type(lst))
print('Type of tup', type(tup))
print('Type of set_', type(set_))
print('Type of dict_', type(dict_))
Hình ảnh chạy chương trình
Như bạn thấy, tất cả đều thuộc lớp chuỗi. Một điều cần lưu ý là giá trị trả về luôn luôn là chuỗi.
Hãy thử ví dụ sau:
value = input('Enter something => ')
print('You just entered', value)
print('__repr__ method: %r' %value)
Lần này, khi chạy chương trình, hãy chỉ nhấn phím Enter
.
Hình ảnh chạy chương trình
Khi bạn không nhập gì và nhấn phím Enter
, chuỗi bạn nhận được từ hàm input
là một chuỗi rỗng (số kí tự trong chuỗi bằng 0).
Tiếp tục với đoạn code trước đó, lần này hãy nhấn EOF
.
Hình ảnh chạy chương trình
Lỗi EOFError
xuất hiện. Chương trình kết thúc ngay lập tức.
Hàm input
trong Python 3.X và raw_input
trong Python 2.X
Hàm raw_input
không tồn tại trong Python 3.X, nó đã được đổi tên thành input
ở phiên bản Python 3.X.
Lưu ý: giành cho hàm input
trong Python 2.X
Trong Python 2.X, còn một hàm nữa cũng gần giống với hàm raw_input
(chính là hàm input
trong Python 3.X) là hàm input
.
Cú pháp của hàm này hoàn toàn tương tự với hàm input
trong Python 3.X. Nó cũng sẽ nhận vào một chuỗi như hàm input
Python 3.X (hoặc raw_input
trong Python 2.X). Tuy nhiên, chuỗi đó sẽ được truyền vào hàm eval
.
Do đó, hàm input
trong Python 2.X có cú pháp:
input(prompt=None)
Sẽ tương tự:
eval(raw_input(prompt=None))
Và tương đương trong Python 3.X sẽ là:
eval(input(prompt=None))
Hàm eval
có khả năng thực thi một expression với expression đưa vào dưới dạng chuỗi.
Một expression là một giá trị nào đó như một con số, một chuỗi, một list.
Dưới đây là một vài ví dụ về hàm eval
:
eval('123')
eval('[1, 2, 3]')
x = 1
eval('x + 2')
eval('print("This is exec by eval function")') # hàm print là một expression với giá trị là None
eval('a = 3') # đây là một statement. Không phải expression.
Lưu ý: Ở đây, có một lưu ý với các bạn đó là không nên sử dụng hàm eval
trừ khi thực sự rất cần thiết.
Có một số lí do để bạn nên tránh sử dụng hàm eval
:
- Khiến việc debug khó khăn.
- Làm chậm chương trình.
- Luôn có cách tốt hơn thay thế.
- Rất nguy hiểm và không an toàn.
Nếu bạn thắc mắc tại sao lại nguy hiểm. Thì hãy xem ví dụ dưới đây:
Enter something: __import__('shutil').rmtree('/root')
Câu lệnh trên có thể xóa sạch cây thư mục của bạn. Điều này rất nguy hiểm và có thể đánh hỏng hệ thống của bạn.
Do đó, việc sử dụng eval
phải được cân nhắc. Đương nhiên, sẽ có trường hợp eval
không nguy hiểm như trên, hoặc là bạn thật sự cần sử dụng nó. Tuy nhiên, hãy hạn chế!
Kết luận
Qua bài viết này, bạn đã biết về việc yêu cầu người dùng nhập nội dung từ bàn phím trong Python.
Ở bài viết sau, chúng ta sẽ nói về kiểu dữ liệu boolean
trong Python.
Cảm ơn bạn đã theo dõi bài viết. Hãy để lại bình luận hoặc góp ý của mình để chúng tôi cải thiện bài viết tốt hơn.