Sử dụng int(), float(), str() ép kiểu trong Python
Python Tutorial | by
Ép kiểu (Type Casting) hay còn gọi là chuyển đổi kiểu dữ liệu. Trong thế giới thực, bạn không thể cộng một quả táo với một quyển sách. Tương tự, trong lập trình, máy tính cần "biết" loại dữ liệu mà nó đang xử lý để thực hiện các thao tác một cách chính xác.Mặc dù Python nổi tiếng với khả năng tự động nhận diện kiểu dữ liệu (tức là bạn không cần khai báo trước), nhưng sẽ có nhiều lúc bạn cần chủ động chuyển đổi dữ liệu từ dạng này sang dạng khác. Ví dụ, khi bạn nhập một số từ bàn phím, Python sẽ coi đó là văn bản. Nếu muốn tính toán, bạn phải "ép" nó thành số.
Bài viết này sẽ hướng dẫn bạn cách sử dụng ba hàm cơ bản nhưng vô cùng mạnh mẽ để ép kiểu: int()
, float()
, và str()
. Chúng ta sẽ cùng tìm hiểu mục đích, quy tắc và các ví dụ thực tế để bạn có thể tự tin "biến hóa" dữ liệu trong các chương trình Python của mình!
Ép kiểu là gì và tại sao cần ép kiểu?
Ép kiểu (Type Casting/Type Conversion): Là quá trình chuyển đổi dữ liệu từ kiểu này sang kiểu khác
Trong Python, mỗi mảnh dữ liệu mà bạn làm việc (ví dụ: số nguyên, số thực, văn bản) đều có một kiểu dữ liệu riêng. Ép kiểu là hành động mà bạn chủ động thay đổi kiểu dữ liệu của một giá trị từ kiểu hiện tại sang một kiểu khác mà bạn mong muốn.
Hãy tưởng tượng bạn có một quả táo (kiểu "trái cây") và một quyển sách (kiểu "vật phẩm đọc"). Bạn không thể "cộng" chúng lại với nhau để ra một kết quả có ý nghĩa. Tương tự, trong lập trình, bạn không thể cộng một số với một đoạn văn bản mà không có bước chuyển đổi. Ép kiểu chính là cách bạn biến đổi quả táo thành một giá trị có thể "tính toán" được với một giá trị số khác, hoặc biến một con số thành văn bản để hiển thị.
Tại sao cần ép kiểu?
Việc ép kiểu là một kỹ thuật thiết yếu trong lập trình Python vì nó giải quyết nhiều vấn đề thực tế:
1. Thực hiện các phép toán đúng: Đảm bảo các kiểu dữ liệu tương thích khi tính toán
Máy tính cần các kiểu dữ liệu phải "hợp nhau" để thực hiện các phép toán một cách chính xác. Bạn không thể thực hiện phép toán số học (như cộng, trừ, nhân, chia) giữa một số và một chuỗi văn bản. Nếu cố gắng, Python sẽ báo lỗi TypeError
.
Ví dụ:
so_luong_sp = 5 # Đây là số nguyên (int) gia_sp = "10000" # Đây là chuỗi văn bản (str) # lenh_loi = so_luong_sp + gia_sp # print(lenh_loi) # => Nếu chạy dòng trên, bạn sẽ nhận lỗi TypeError: unsupported operand type(s) for +: 'int' and 'str' # (Không thể cộng một số nguyên và một chuỗi) # Ép kiểu để phép toán đúng gia_sp_so = int(gia_sp) # Chuyển chuỗi "10000" thành số nguyên 10000 tong_tien = so_luong_sp * gia_sp_so print(f"Tổng tiền cần trả: {tong_tien} VNĐ") # Kết quả: Tổng tiền cần trả: 50000 VNĐ
Trong ví dụ này, việc ép kiểu gia_sp
từ str
sang int
là bắt buộc để có thể thực hiện phép nhân toán học.
2. Thay đổi cách dữ liệu được hiểu: Biến một số thành văn bản để hiển thị, hoặc ngược lại
Đôi khi bạn có một giá trị số, nhưng bạn muốn hiển thị nó như một phần của câu văn bản. Hoặc ngược lại, bạn có một đoạn văn bản trông giống một số, và bạn muốn thực hiện tính toán trên đó. Ép kiểu giúp bạn thay đổi "ngữ cảnh" của dữ liệu.
Ví dụ:
# Biến số thành văn bản để nối chuỗi tuoi = 25 # Đây là số nguyên ten = "An" # lenh_loi = "Tên tôi là " + ten + ", tuổi " + tuoi # print(lenh_loi) # => Nếu chạy dòng trên, bạn sẽ nhận lỗi TypeError: can only concatenate str (not "int") to str # (Chỉ có thể nối chuỗi với chuỗi) thong_tin = "Tên tôi là " + ten + ", tuổi " + str(tuoi) # Ép kiểu 'tuoi' sang chuỗi print(thong_tin) # Kết quả: Tên tôi là An, tuổi 25
Ở đây, str(tuoi)
biến số 25
thành chuỗi "25"
, cho phép nó được nối với các chuỗi khác.
3. Xử lý dữ liệu đầu vào: Dữ liệu người dùng nhập vào thường là văn bản, cần chuyển sang số để tính toán
Một trong những ứng dụng phổ biến nhất của ép kiểu là khi bạn lấy dữ liệu từ người dùng thông qua hàm input()
. Hàm input()
luôn trả về giá trị dưới dạng chuỗi (string), kể cả khi người dùng nhập vào một con số. Nếu bạn muốn thực hiện phép tính với giá trị đó, bạn phải ép kiểu nó sang int
hoặc float
.
Ví dụ:
# Lấy tuổi từ người dùng (input() luôn trả về chuỗi) tuoi_nhap_vao = input("Bạn bao nhiêu tuổi? ") # Giả sử người dùng nhập "30" # Kiểm tra kiểu dữ liệu sau khi nhập print(f"Giá trị bạn nhập: {tuoi_nhap_vao}, Kiểu dữ liệu: {type(tuoi_nhap_vao)}") # Kết quả: Giá trị bạn nhập: 30, Kiểu dữ liệu: <class 'str'> # Ép kiểu sang số nguyên để có thể thực hiện phép tính tuoi_dang_so = int(tuoi_nhap_vao) print(f"Tuổi của bạn sau 5 năm nữa là: {tuoi_dang_so + 5} tuổi.")
Nếu không ép kiểu tuoi_nhap_vao
sang int
, bạn sẽ gặp lỗi khi cố gắng cộng 5
vào một chuỗi.
Ép kiểu sang số nguyên (int()
) trong Python
Khi bạn cần biến một giá trị nào đó thành một số nguyên (tức là số không có phần thập phân), bạn sẽ sử dụng hàm int()
. Đây là một công cụ mạnh mẽ nhưng cũng cần bạn nắm rõ các quy tắc của nó để tránh gặp lỗi.
Mục đích: Chuyển đổi một giá trị sang kiểu số nguyên
Hàm int()
nhận vào một đối số (giá trị bạn muốn chuyển đổi) và cố gắng trả về một phiên bản số nguyên của giá trị đó.
Quy tắc ép kiểu sang int()
:
1. Ép kiểu từ số thực (float
): Bỏ đi phần thập phân (làm tròn xuống)
Khi bạn ép kiểu một số thực (float
) sang số nguyên (int
), Python sẽ luôn loại bỏ phần thập phân và chỉ giữ lại phần nguyên. Điều này có nghĩa là nó sẽ làm tròn xuống (truncate), không phải làm tròn theo quy tắc toán học thông thường.
Ví dụ:
-
int(3.14)
sẽ cho kết quả3
. -
int(3.99)
cũng sẽ cho kết quả3
(phần thập phân bị bỏ đi). -
int(-2.7)
sẽ cho kết quả-2
(làm tròn lên theo hướng 0, tức là bỏ phần thập phân).
Code minh họa:
# Ép kiểu float dương sang int so_thuc_duong_1 = 3.14 ket_qua_1 = int(so_thuc_duong_1) print(f"int({so_thuc_duong_1}) = {ket_qua_1}") # Kết quả: 3 so_thuc_duong_2 = 3.99 ket_qua_2 = int(so_thuc_duong_2) print(f"int({so_thuc_duong_2}) = {ket_qua_2}") # Kết quả: 3 # Ép kiểu float âm sang int so_thuc_am_1 = -2.7 ket_qua_3 = int(so_thuc_am_1) print(f"int({so_thuc_am_1}) = {ket_qua_3}") # Kết quả: -2 so_thuc_am_2 = -2.1 ket_qua_4 = int(so_thuc_am_2) print(f"int({so_thuc_am_2}) = {ket_qua_4}") # Kết quả: -2
2. Ép kiểu từ chuỗi (str
): Chuỗi phải chứa hoàn toàn các chữ số và không có dấu chấm thập phân
Khi bạn cố gắng ép kiểu một chuỗi (str
) sang số nguyên (int
), chuỗi đó phải tuân thủ nghiêm ngặt các quy tắc sau:
-
Nó phải chứa hoàn toàn các chữ số (tức là chỉ có
0-9
, có thể có dấu+
hoặc-
ở đầu). -
Nó không được chứa bất kỳ ký tự nào khác (như chữ cái, dấu cách, ký hiệu đặc biệt).
-
Quan trọng: Nó không được chứa dấu chấm thập phân (
.
), ngay cả khi đó là một số nguyên (ví dụ:"3.0"
sẽ gây lỗi).
Nếu chuỗi không tuân thủ các quy tắc này, Python sẽ báo lỗi ValueError
(lỗi giá trị).
Code minh họa:
# Ép kiểu chuỗi chứa số nguyên hợp lệ chuoi_so_1 = "123" ket_qua_str_1 = int(chuoi_so_1) print(f"int(\"{chuoi_so_1}\") = {ket_qua_str_1}") # Kết quả: 123 chuoi_so_2 = "-45" ket_qua_str_2 = int(chuoi_so_2) print(f"int(\"{chuoi_so_2}\") = {ket_qua_str_2}") # Kết quả: -45 chuoi_so_3 = "0" ket_qua_str_3 = int(chuoi_so_3) print(f"int(\"{chuoi_so_3}\") = {ket_qua_str_3}") # Kết quả: 0 # Các trường hợp gây lỗi ValueError # chuoi_loi_1 = "3.14" # print(int(chuoi_loi_1)) # Lỗi: ValueError: invalid literal for int() with base 10: '3.14' # (Chuỗi này có dấu chấm thập phân) # chuoi_loi_2 = "abc" # print(int(chuoi_loi_2)) # Lỗi: ValueError: invalid literal for int() with base 10: 'abc' # (Chuỗi này chứa chữ cái) # chuoi_loi_3 = "123 " # Có dấu cách ở cuối # print(int(chuoi_loi_3)) # Lỗi: ValueError: invalid literal for int() with base 10: '123 ' # (Chuỗi này có dấu cách)
Ép kiểu sang số thực (float()
) trong Python
Khi bạn cần biến một giá trị nào đó thành một số thực (tức là số có phần thập phân), bạn sẽ sử dụng hàm float()
. Hàm này rất hữu ích khi bạn làm việc với các phép đo lường, tiền tệ, hoặc bất kỳ dữ liệu nào yêu cầu độ chính xác sau dấu phẩy.
Mục đích: Chuyển đổi một giá trị sang kiểu số thực
Hàm float()
nhận vào một đối số (giá trị bạn muốn chuyển đổi) và cố gắng trả về một phiên bản số thực của giá trị đó.
Quy tắc ép kiểu sang float()
:
1. Ép kiểu từ số nguyên (int
): Thêm .0
vào sau số
Khi bạn ép kiểu một số nguyên (int
) sang số thực (float
), Python sẽ thêm .0
vào sau số đó. Giá trị số học của nó không thay đổi, nhưng kiểu dữ liệu của nó sẽ trở thành float
.
Ví dụ:
-
float(5)
sẽ cho kết quả5.0
. -
float(-10)
sẽ cho kết quả-10.0
.
Code minh họa:
# Ép kiểu int dương sang float so_nguyen_duong = 5 ket_qua_1 = float(so_nguyen_duong) print(f"float({so_nguyen_duong}) = {ket_qua_1}") # Kết quả: 5.0 print(f"Kiểu dữ liệu: {type(ket_qua_1)}") # Kết quả: <class 'float'> # Ép kiểu int âm sang float so_nguyen_am = -10 ket_qua_2 = float(so_nguyen_am) print(f"float({so_nguyen_am}) = {ket_qua_2}") # Kết quả: -10.0
2. Ép kiểu từ chuỗi (str
): Chuỗi phải chứa một số hợp lệ (có thể có dấu chấm thập phân)
Khi bạn cố gắng ép kiểu một chuỗi (str
) sang số thực (float
), chuỗi đó phải biểu diễn một số hợp lệ.
-
Nó có thể chứa dấu chấm thập phân (
.
). -
Nó có thể chứa dấu
+
hoặc-
ở đầu. -
Nó có thể sử dụng ký hiệu khoa học (
e
hoặcE
). -
Nó không được chứa bất kỳ ký tự nào khác ngoài chữ số, dấu
.
và dấu+
/-
/e
/E
.
Nếu chuỗi không tuân thủ các quy tắc này, Python sẽ báo lỗi ValueError
.
Code minh họa:
# Ép kiểu chuỗi chứa số thực hợp lệ chuoi_thuc_1 = "3.14" ket_qua_str_1 = float(chuoi_thuc_1) print(f"float(\"{chuoi_thuc_1}\") = {ket_qua_str_1}") # Kết quả: 3.14 # Ép kiểu chuỗi chứa số nguyên (sẽ thành float) chuoi_thuc_2 = "100" ket_qua_str_2 = float(chuoi_thuc_2) print(f"float(\"{chuoi_thuc_2}\") = {ket_qua_str_2}") # Kết quả: 100.0 # Ép kiểu chuỗi chứa số âm chuoi_thuc_3 = "-5.5" ket_qua_str_3 = float(chuoi_thuc_3) print(f"float(\"{chuoi_thuc_3}\") = {ket_qua_str_3}") # Kết quả: -5.5 # Ép kiểu chuỗi chứa ký hiệu khoa học chuoi_thuc_4 = "1.2e-3" # Tức là 0.0012 ket_qua_str_4 = float(chuoi_thuc_4) print(f"float(\"{chuoi_thuc_4}\") = {ket_qua_str_4}") # Kết quả: 0.0012 # Các trường hợp gây lỗi ValueError # chuoi_loi_1 = "abc" # print(float(chuoi_loi_1)) # Lỗi: ValueError: could not convert string to float: 'abc' # (Chuỗi này chứa chữ cái) # chuoi_loi_2 = "3,14" # Dùng dấu phẩy thay vì dấu chấm # print(float(chuoi_loi_2)) # Lỗi: ValueError: could not convert string to float: '3,14' # (Chuỗi này có dấu phẩy thay vì dấu chấm thập phân)
Ép kiểu sang chuỗi (str()
) trong Python
Khi bạn muốn biến bất kỳ loại dữ liệu nào thành văn bản (chuỗi ký tự), bạn sẽ sử dụng hàm str()
. Đây là một hàm vô cùng linh hoạt và thường được dùng để hiển thị thông tin hoặc kết hợp các kiểu dữ liệu khác nhau vào một chuỗi.
Mục đích: Chuyển đổi một giá trị bất kỳ sang kiểu chuỗi (văn bản)
Hàm str()
lấy một đối số (giá trị bạn muốn chuyển đổi) và trả về một phiên bản chuỗi của giá trị đó. Dù là số, giá trị boolean, hay các kiểu dữ liệu phức tạp hơn, str()
đều có thể biến chúng thành dạng văn bản.
Quy tắc: Hầu hết các kiểu dữ liệu đều có thể chuyển đổi thành chuỗi
Đây là một trong những hàm ép kiểu "dễ tính" nhất. Hàm str()
có thể chuyển đổi hầu hết mọi kiểu dữ liệu mà Python hỗ trợ sang chuỗi. Nó sẽ tạo ra một biểu diễn văn bản của giá trị đó.
Code minh họa:
# Ép kiểu số nguyên sang chuỗi so_nguyen = 123 ket_qua_str_int = str(so_nguyen) print(f"str({so_nguyen}) = \"{ket_qua_str_int}\"") # Kết quả: "123" (là chuỗi) print(f"Kiểu dữ liệu: {type(ket_qua_str_int)}") # Kết quả: <class 'str'> print("-" * 30) # Ép kiểu số thực sang chuỗi so_thuc = 3.14 ket_qua_str_float = str(so_thuc) print(f"str({so_thuc}) = \"{ket_qua_str_float}\"") # Kết quả: "3.14" (là chuỗi) print("-" * 30) # Ép kiểu Boolean sang chuỗi gia_tri_boolean = True ket_qua_str_bool = str(gia_tri_boolean) print(f"str({gia_tri_boolean}) = \"{ket_qua_str_bool}\"") # Kết quả: "True" (là chuỗi) print("-" * 30) # Ép kiểu một danh sách (List) sang chuỗi (sẽ học sau) danh_sach = [1, 2, "hello"] ket_qua_str_list = str(danh_sach) print(f"str({danh_sach}) = \"{ket_qua_str_list}\"") # Kết quả: "[1, 2, 'hello']" (là chuỗi) print("-" * 30) # Ứng dụng phổ biến: Nối số vào chuỗi để in ra màn hình tuoi = 25 thong_tin_ca_nhan = "Tuổi của tôi là " + str(tuoi) # Ép kiểu 'tuoi' thành chuỗi để nối print(thong_tin_ca_nhan) # Kết quả: Tuổi của tôi là 25
Tại sao cần ép kiểu trong thực tế? (Ứng dụng)
Việc ép kiểu không chỉ là một khái niệm lý thuyết mà còn là một kỹ thuật cực kỳ quan trọng và được sử dụng hàng ngày trong mọi chương trình Python. Dưới đây là các ứng dụng thực tế chính:
Đọc dữ liệu từ người dùng: Hàm input()
luôn trả về chuỗi
Khi bạn yêu cầu người dùng nhập thông tin từ bàn phím bằng hàm input()
, Python luôn coi dữ liệu đó là một chuỗi (string), ngay cả khi người dùng nhập vào một con số. Nếu bạn muốn thực hiện các phép tính toán học với dữ liệu này, bạn bắt buộc phải ép kiểu nó sang int
hoặc float
.
Ví dụ:
# Yêu cầu người dùng nhập tuổi tuoi_nhap_vao = input("Bạn bao nhiêu tuổi? ") # Giả sử người dùng nhập "30" # Kiểm tra kiểu dữ liệu sau khi nhập print(f"Giá trị bạn nhập: \"{tuoi_nhap_vao}\", Kiểu dữ liệu: {type(tuoi_nhap_vao)}") # Kết quả: Giá trị bạn nhập: "30", Kiểu dữ liệu: <class 'str'> # Thử cộng một số vào biến chưa ép kiểu (sẽ gây lỗi!) # print(f"Tuổi của bạn sau 5 năm nữa là: {tuoi_nhap_vao + 5} tuổi.") # => Sẽ báo lỗi TypeError: can only concatenate str (not "int") to str # Ép kiểu sang số nguyên để có thể thực hiện phép tính tuoi_dang_so = int(tuoi_nhap_vao) # Chuyển "30" thành 30 (số nguyên) print(f"Tuổi của bạn sau 5 năm nữa là: {tuoi_dang_so + 5} tuổi.") # Kết quả: Tuổi của bạn sau 5 năm nữa là: 35 tuổi.
Hiển thị thông tin: Nối số vào chuỗi để in ra màn hình
Khi bạn muốn hiển thị một thông điệp kết hợp cả văn bản và các giá trị số (hoặc boolean), bạn cần đảm bảo tất cả các phần đều là chuỗi trước khi nối chúng lại. Hàm str()
rất hữu ích trong trường hợp này.
Ví dụ:
so_luong_san_pham = 5 ten_san_pham = "Táo" gia_mot_san_pham = 12000.50 con_hang = True # Nối các biến trực tiếp (nếu không ép kiểu sẽ lỗi nếu có số) # print("Có " + so_luong_san_pham + " quả " + ten_san_pham + ", giá " + gia_mot_san_pham + ", còn hàng: " + con_hang) # => Sẽ báo lỗi TypeError # Ép kiểu sang chuỗi để có thể nối thong_tin_kho = "Có " + str(so_luong_san_pham) + " quả " + ten_san_pham + \ ", giá " + str(gia_mot_san_pham) + " VNĐ, còn hàng: " + str(con_hang) + "." print(thong_tin_kho) # Kết quả: Có 5 quả Táo, giá 12000.5 VNĐ, còn hàng: True.
Mẹo: Để in ra thông tin một cách tiện lợi hơn, Python có f-strings (formatted string literals), ra đời từ Python 3.6 trở đi. F-strings tự động ép kiểu các biến thành chuỗi khi bạn nhúng chúng vào trong {}
.
# Sử dụng f-string (cách hiện đại và được khuyên dùng) print(f"Có {so_luong_san_pham} quả {ten_san_pham}, giá {gia_mot_san_pham} VNĐ, còn hàng: {con_hang}.") # Kết quả tương tự, code gọn hơn và không cần dùng str() tường minh.
Phép toán hỗn hợp: Đảm bảo các thành phần có cùng kiểu khi thực hiện tính toán
Mặc dù Python có thể tự động chuyển đổi giữa int
và float
trong một số phép toán (ví dụ: 5 + 3.0
sẽ ra 8.0
), nhưng đối với các kiểu khác hoặc khi cần kiểm soát chặt chẽ, việc ép kiểu là cần thiết.
Ví dụ:
# Tính tổng số sách trong hai kệ (một số nguyên, một chuỗi) sach_ke_1 = 20 # int sach_ke_2_str = "15" # str # tong_sach = sach_ke_1 + sach_ke_2_str # Lỗi TypeError tong_sach = sach_ke_1 + int(sach_ke_2_str) # Ép kiểu chuỗi sang int print(f"Tổng số sách trong hai kệ: {tong_sach} quyển.") # Kết quả: Tổng số sách trong hai kệ: 35 quyển.
Kết bài
Bạn đã cùng tôi timg hiểu một kỹ thuật vô cùng quan trọng trong Python: ép kiểu (Type Casting), hay chuyển đổi kiểu dữ liệu. Bạn đã học cách sử dụng các hàm như int()
, float()
, và str()
để "biến hóa" dữ liệu từ dạng này sang dạng khác, phục vụ cho nhiều mục đích khác nhau trong lập trình.
Hãy luôn ghi nhớ những điểm cốt lõi sau:
-
Ép kiểu là cần thiết để đảm bảo các phép toán được thực hiện đúng và dữ liệu được xử lý theo cách bạn muốn.
-
Hàm
int()
giúp bạn chuyển đổi sang số nguyên, làm tròn bằng cách bỏ đi phần thập phân. -
Hàm
float()
giúp bạn chuyển đổi sang số thực, thêm phần thập phân nếu cần. -
Hàm
str()
là "người bạn" linh hoạt nhất, có thể chuyển đổi hầu hết mọi kiểu dữ liệu sang dạng văn bản. -
Đặc biệt, hãy luôn cẩn trọng khi ép kiểu từ chuỗi sang số (
int()
hoặcfloat()
) vì chuỗi phải có định dạng số hợp lệ để tránh lỗiValueError
.
Việc thành thạo ép kiểu không chỉ giúp bạn tránh được những lỗi phổ biến mà còn mở ra cánh cửa để bạn xử lý dữ liệu đầu vào từ người dùng một cách hiệu quả, hiển thị thông tin đẹp mắt và thực hiện các phép tính phức tạp hơn. Đây là một kỹ năng nền tảng giúp chương trình của bạn trở nên mạnh mẽ và đáng tin cậy hơn rất nhiều.