Bài 1.5. Biến và kiểu dữ liệu cơ bản của Python (int, str)

Chào mừng các bạn quay trở lại với series học Python cơ bản! Trong các bài trước, chúng ta đã làm quen với môi trường và viết những dòng code Python đầu tiên. Hôm nay, chúng ta sẽ đi sâu vào hai khái niệm cực kỳ quan trọngnền tảng trong bất kỳ ngôn ngữ lập trình nào: biến (variable)kiểu dữ liệu (data type), tập trung vào hai kiểu cơ bản nhất trong Python là int (số nguyên) và str (chuỗi ký tự).

Hãy tưởng tượng bạn đang nấu ăn. Bạn cần các hộp đựng để chứa nguyên liệu: một hộp đựng đường, một hộp đựng muối, một hộp đựng bột mì. Trong lập trình, biến chính là những chiếc hộp đó. Chúng giúp chúng ta lưu trữ thông tin để có thể sử dụng lại hoặc thay đổi trong suốt quá trình chạy chương trình.

1. Biến (Variable) là gì?

Biến trong Python (và các ngôn ngữ lập trình khác) là một cái tên được đặt để tham chiếu đến một vị trí lưu trữ trong bộ nhớ máy tính. Vị trí này chứa một giá trị nào đó (ví dụ: một con số, một dòng chữ,...). Thay vì phải nhớ địa chỉ bộ nhớ phức tạp, chúng ta chỉ cần dùng cái tên (biến) mà mình đã đặt.

Khai báo và Gán giá trị cho biến

Trong Python, việc tạo ra một biến và gán giá trị cho nó vô cùng đơn giản. Bạn chỉ cần dùng dấu bằng (=).

# Cú pháp: ten_bien = gia_tri

so_tuoi = 30
ten_nguoi_dung = "FullhouseDev"
diem_so = 9.5 # Đây là kiểu float, sẽ học sau, nhưng cũng là biến!

Giải thích:

  • so_tuoi = 30: Chúng ta tạo ra một biến tên là so_tuoi và gán cho nó giá trị là số nguyên 30.
  • ten_nguoi_dung = "FullhouseDev": Chúng ta tạo biến ten_nguoi_dung và gán cho nó giá trị là chuỗi ký tự "FullhouseDev".
  • Dấu = ở đây được gọi là toán tử gán (assignment operator), không phải là phép so sánh bằng (sẽ học sau). Nó có nghĩa là "gán giá trị bên phải cho biến bên trái".

Sau khi đã gán giá trị, bạn có thể sử dụng tên biến để truy cập giá trị đó:

so_tuoi = 30
ten_nguoi_dung = "FullhouseDev"

print(so_tuoi)         # In ra giá trị của biến so_tuoi
print(ten_nguoi_dung)  # In ra giá trị của biến ten_nguoi_dung

Kết quả:

30
FullhouseDev

Bạn cũng có thể thay đổi giá trị của biến đã được gán:

so_luong = 5
print("Số lượng ban đầu:", so_luong)

so_luong = 10  # Gán lại giá trị mới cho biến so_luong
print("Số lượng sau khi thay đổi:", so_luong)

Kết quả:

Số lượng ban đầu: 5
Số lượng sau khi thay đổi: 10
Quy tắc đặt tên biến

Việc đặt tên biến không hoàn toàn tùy ý mà cần tuân theo một số quy tắc và quy ước (convention) để code dễ đọc, dễ hiểu:

  • Quy tắc bắt buộc:

    • Tên biến chỉ có thể chứa chữ cái (a-z, A-Z), số (0-9) và dấu gạch dưới (_).
    • Tên biến không được bắt đầu bằng số.
    • Tên biến có phân biệt chữ hoa, chữ thường (age, AgeAGE là ba biến khác nhau).
    • Tên biến không được trùng với các từ khóa (keywords) của Python (ví dụ: if, else, for, while, def, class, True, False, None,...). Bạn có thể xem danh sách từ khóa bằng cách chạy code sau:
      import keyword
      print(keyword.kwlist)
      
  • Quy ước (nên theo):

    • Nên đặt tên biến có ý nghĩa, gợi tả giá trị mà nó lưu trữ (ví dụ: user_name, total_score thay vì x, y, z).
    • Nên sử dụng kiểu viết snake_case: các từ được nối với nhau bằng dấu gạch dưới, tất cả viết thường (ví dụ: first_name, product_price). Đây là quy ước phổ biến nhất trong cộng đồng Python.
    • Tránh sử dụng chữ cái l (thường), O (hoa) hoặc I (hoa) đơn lẻ vì dễ nhầm lẫn với số 10.

Ví dụ về tên biến hợp lệ và không hợp lệ:

# Hợp lệ
my_variable = 10
user_name = "Alice"
_age = 25       # Bắt đầu bằng gạch dưới là hợp lệ (thường có ý nghĩa đặc biệt)
count1 = 100

# KHÔNG hợp lệ
# 1count = 100     # Bắt đầu bằng số
# user-name = "Bob" # Chứa dấu gạch nối
# my variable = 5  # Chứa dấu cách
# class = "Python" # Trùng từ khóa

2. Kiểu dữ liệu (Data Type)

Khi bạn tạo một biến và gán giá trị cho nó, Python sẽ tự động xác định kiểu của giá trị đó. Kiểu dữ liệu quy định loại thông tin mà biến có thể lưu trữ và những phép toán nào có thể thực hiện trên dữ liệu đó. Ví dụ, bạn có thể cộng hai con số, nhưng việc cộng một con số với một dòng chữ không phải lúc nào cũng có ý nghĩa (mặc dù Python có thể làm được trong một số trường hợp đặc biệt, nhưng thường gây lỗi).

Python là một ngôn ngữ có kiểu động (dynamically typed). Điều này có nghĩa là bạn không cần phải khai báo tường minh kiểu dữ liệu của biến khi tạo ra nó. Python sẽ tự động nhận diện kiểu dữ liệu dựa trên giá trị được gán.

Bạn có thể sử dụng hàm type() để kiểm tra kiểu dữ liệu của một biến:

so_nguyen = 100
chuoi_ky_tu = "Hello Python"
so_thuc = 3.14

print( type(so_nguyen) )
print( type(chuoi_ky_tu) )
print( type(so_thuc) )

Kết quả:

<class 'int'>
<class 'str'>
<class 'float'>

Trong bài này, chúng ta sẽ tập trung vào hai kiểu đầu tiên: intstr.

3. Kiểu số nguyên: int (Integer)

Kiểu int đại diện cho các số nguyên, bao gồm số 0, các số nguyên dương và các số nguyên âm, không có phần thập phân.

nam_hien_tai = 2024
so_luong_hang = 50
nhiet_do_am = -10
zero = 0

print(nam_hien_tai, type(nam_hien_tai))
print(so_luong_hang, type(so_luong_hang))
print(nhiet_do_am, type(nhiet_do_am))
print(zero, type(zero))

Kết quả:

2024 <class 'int'>
50 <class 'int'>
-10 <class 'int'>
0 <class 'int'>
Các phép toán cơ bản với int

Bạn có thể thực hiện các phép toán số học thông thường với các biến kiểu int:

  • + : Phép cộng
  • - : Phép trừ
  • * : Phép nhân
  • / : Phép chia (luôn trả về kiểu float - số thực, ngay cả khi chia hết)
  • //: Phép chia lấy phần nguyên (chỉ lấy phần nguyên của kết quả chia)
  • % : Phép chia lấy phần dư (modulo)
  • **: Phép lũy thừa
a = 15
b = 4

tong = a + b        # 15 + 4 = 19
hieu = a - b        # 15 - 4 = 11
tich = a * b        # 15 * 4 = 60
thuong = a / b      # 15 / 4 = 3.75 (kết quả là float)
chia_nguyen = a // b # 15 // 4 = 3 (chỉ lấy phần nguyên)
chia_du = a % b     # 15 % 4 = 3 (phần dư của 15 chia 4)
luy_thua = b ** 2   # 4 mũ 2 = 16

print("Tổng:", tong)
print("Hiệu:", hieu)
print("Tích:", tich)
print("Thương:", thuong, type(thuong)) # Lưu ý kiểu dữ liệu của phép chia /
print("Chia lấy nguyên:", chia_nguyen)
print("Chia lấy dư:", chia_du)
print("Lũy thừa:", luy_thua)

Kết quả:

Tổng: 19
Hiệu: 11
Tích: 60
Thương: 3.75 <class 'float'>
Chia lấy nguyên: 3
Chia lấy dư: 3
Lũy thừa: 16

Lưu ý: Phép chia / luôn trả về kiểu float, ngay cả khi phép chia đó chia hết (ví dụ: 10 / 2 sẽ là 5.0).

4. Kiểu chuỗi ký tự: str (String)

Kiểu str dùng để biểu diễn dữ liệu văn bản (text), hay còn gọi là chuỗi ký tự. Một chuỗi có thể chứa chữ cái, số, ký tự đặc biệt, dấu cách,...

Để tạo một chuỗi trong Python, bạn đặt nội dung văn bản bên trong cặp dấu nháy đơn (' ') hoặc dấu nháy kép (" ").

loi_chao = "Xin chào các bạn!"
ten_sach = 'Lập trình Python cơ bản'
thong_bao = "Bạn nhận được '1' tin nhắn mới." # Dùng nháy kép nếu chuỗi chứa nháy đơn
mo_ta = 'Cuốn sách có tên là "Python Crash Course".' # Dùng nháy đơn nếu chuỗi chứa nháy kép

print(loi_chao, type(loi_chao))
print(ten_sach, type(ten_sach))
print(thong_bao)
print(mo_ta)

Kết quả:

Xin chào các bạn! <class 'str'>
Lập trình Python cơ bản <class 'str'>
Bạn nhận được '1' tin nhắn mới.
Cuốn sách có tên là "Python Crash Course".

Python không phân biệt ý nghĩa giữa việc dùng nháy đơn hay nháy kép. Bạn có thể chọn loại nào tùy thích, miễn là nhất quánđúng quy tắc (mở bằng nháy đơn thì kết thúc bằng nháy đơn, mở bằng nháy kép thì kết thúc bằng nháy kép). Quy ước chung là dùng nháy kép "" thường xuyên hơn.

Chuỗi nhiều dòng (Multi-line Strings)

Nếu bạn cần tạo một chuỗi kéo dài trên nhiều dòng, bạn có thể dùng cặp ba dấu nháy kép (""" """) hoặc ba dấu nháy đơn (''' '''):

bai_tho = """Đây là dòng thứ nhất.
Đây là dòng thứ hai.
Và đây là dòng cuối cùng."""

mo_ta_dai = '''
Ứng dụng này cho phép người dùng:
- Quản lý công việc.
- Đặt lịch hẹn.
- Gửi thông báo.
'''

print(bai_tho)
print("---")
print(mo_ta_dai)

Kết quả:

Đây là dòng thứ nhất.
Đây là dòng thứ hai.
Và đây là dòng cuối cùng.
---

Ứng dụng này cho phép người dùng:
- Quản lý công việc.
- Đặt lịch hẹn.
- Gửi thông báo.

Lưu ý rằng các ký tự xuống dòng cũng được giữ nguyên trong chuỗi nhiều dòng.

Các phép toán cơ bản với str

Hai phép toán phổ biến nhất với chuỗi là:

  • + : Nối chuỗi (Concatenation) - Ghép hai hay nhiều chuỗi lại với nhau.
  • * : Lặp lại chuỗi (Repetition) - Tạo ra một chuỗi mới bằng cách lặp lại chuỗi gốc một số lần (nhân với một số nguyên).
ho = "Nguyễn Văn "
ten = "An"

ho_ten = ho + ten # Nối chuỗi
print("Họ tên:", ho_ten)

dau_gach = "-" * 20 # Lặp lại chuỗi "-" 20 lần
print(dau_gach)

# Lưu ý: Bạn không thể cộng trực tiếp chuỗi với số
# loi = "Tuổi: " + 25  # Dòng này sẽ gây lỗi TypeError

# Bạn cần chuyển số thành chuỗi trước khi nối (sẽ học ở phần sau)
tuoi_chuoi = str(25) # Chuyển số 25 thành chuỗi "25"
thong_tin = "Tuổi: " + tuoi_chuoi
print(thong_tin)

Kết quả:

Họ tên: Nguyễn Văn An
--------------------
Tuổi: 25

Quan trọng: Phép cộng + có ý nghĩa khác nhau tùy thuộc vào kiểu dữ liệu của toán hạng. Với số (int, float), nó là phép cộng số học. Với chuỗi (str), nó là phép nối chuỗi. Python đủ thông minh để hiểu ngữ cảnh này.

5. Ép kiểu (Type Conversion)

Đôi khi, bạn cần chuyển đổi dữ liệu từ kiểu này sang kiểu khác. Ví dụ, khi nhận dữ liệu nhập từ người dùng (thường là str), bạn có thể cần chuyển nó thành int để tính toán. Quá trình này gọi là ép kiểu.

Python cung cấp các hàm tích hợp để thực hiện việc này:

  • int(x): Chuyển x thành số nguyên. x có thể là một số thực (sẽ bị cắt bỏ phần thập phân) hoặc một chuỗi chứa ký tự số hợp lệ.
  • str(x): Chuyển x thành chuỗi. x có thể là số nguyên, số thực, hoặc các kiểu dữ liệu khác.
  • float(x): Chuyển x thành số thực (sẽ học kỹ hơn sau).
# Chuyển chuỗi thành số nguyên
so_luong_str = "100"
so_luong_int = int(so_luong_str)
print(so_luong_int, type(so_luong_int))

# Cộng số nguyên vừa chuyển đổi
ket_qua = so_luong_int + 50
print("Kết quả cộng:", ket_qua)

# Thử chuyển chuỗi không hợp lệ thành số nguyên sẽ gây lỗi ValueError
# gia_tri_loi = int("abc") # Dòng này sẽ gây lỗi!

# Chuyển số nguyên thành chuỗi
nam_sinh = 1998
nam_sinh_str = str(nam_sinh)
print(nam_sinh_str, type(nam_sinh_str))

# Nối chuỗi với chuỗi vừa chuyển đổi
thong_bao_ns = "Năm sinh của bạn là: " + nam_sinh_str
print(thong_bao_ns)

# Chuyển số thực thành số nguyên (cắt bỏ phần thập phân)
diem_tb = 8.75
diem_tb_int = int(diem_tb)
print(diem_tb_int, type(diem_tb_int)) # Chỉ lấy phần nguyên

Kết quả:

100 <class 'int'>
Kết quả cộng: 150
1998 <class 'str'>
Năm sinh của bạn là: 1998
8 <class 'int'>

Việc hiểu và sử dụng ép kiểu là rất quan trọng, đặc biệt khi xử lý dữ liệu đầu vào và chuẩn bị dữ liệu cho các phép toán khác nhau.


Qua bài học này, bạn đã nắm được những kiến thức cơ bản nhưng vô cùng thiết yếu về biến - cách đặt tên và lưu trữ dữ liệu, cùng với hai kiểu dữ liệu phổ biến là int (số nguyên) và str (chuỗi ký tự) trong Python. Bạn cũng đã biết cách thực hiện các phép toán cơ bản và chuyển đổi giữa hai kiểu dữ liệu này. Đây là nền tảng vững chắc để bạn tiếp tục khám phá thế giới lập trình Python đầy thú vị!

Comments

There are no comments at the moment.