M03 — Biến và Kiểu dữ liệu

← 02 - Chương trình đầu tiên và cú pháp nền tảng | Tiếp theo → 04 - Toán tử và biểu thức

Mục tiêu module

  • Hiểu variable (biến) thực chất là gì trong Python
  • Nắm 5 kiểu dữ liệu cơ bản: int, float, str, bool, None
  • Hiểu dynamic typing (kiểu động) và hệ quả của nó
  • Ép kiểu (type casting) và nhận dữ liệu từ người dùng qua input()

Thời lượng: ~8 giờ | Tuần: 4–5 (chia 2 tuần)

Tuần 4: Mục 1–5 | Tuần 5: Mục 6–10


PHẦN 1 — TUẦN 4

1. Biến là gì?

1.1. Định nghĩa

Variable (biến) là một cái tên trỏ tới một giá trị trong bộ nhớ.

so_luong = 10

Đọc là: “gán giá trị 10 cho biến so_luong”, hoặc “so_luong bây giờ trỏ tới giá trị 10”.

Ký hiệuThuật ngữVai trò
so_luongidentifier (định danh)Tên bạn tự đặt
=assignment operator (toán tử gán)Gán giá trị bên phải cho tên bên trái
10value (giá trị)Dữ liệu thật

Dấu = KHÔNG phải "bằng nhau"

Trong toán học, x = 10 nghĩa là “x bằng 10”. Trong lập trình, = là hành động gán. Để so sánh bằng nhau, Python dùng == (hai dấu bằng) — học ở 04 - Toán tử và biểu thức.

Điều này giống T-SQL: SET @x = 10 là gán, còn WHERE MaKH = 'KH001' là so sánh. Python dùng = cho gán và == cho so sánh, rạch ròi hơn.

1.2. Không cần khai báo kiểu

So sánh cách khai báo biến:

T-SQL:

DECLARE @SoLuong INT;
SET @SoLuong = 10;

C#:

int soLuong = 10;

Python:

so_luong = 10

Python tự suy ra kiểu dữ liệu từ giá trị bạn gán. Đây gọi là type inference (suy luận kiểu).

1.3. Biến trong Python là “nhãn dán”, không phải “cái hộp”

Đây là điểm khác biệt quan trọng so với C# hay Java.

Trong nhiều ngôn ngữ, biến giống một cái hộp có kích thước cố định, chứa giá trị bên trong. Trong Python, biến giống một tờ nhãn dán lên một đối tượng nằm trong bộ nhớ.

a = 100
b = a       # b dán nhãn lên CÙNG một đối tượng với a
print(a, b) # 100 100
 
a = 200     # a được gỡ ra, dán sang đối tượng 200
print(a, b) # 200 100  <- b vẫn dán ở 100

Kiểm chứng bằng hàm id() (trả về địa chỉ đối tượng trong bộ nhớ):

a = 100
b = a
print(id(a))   # ví dụ: 140705234567890
print(id(b))   # cùng số -> cùng một đối tượng
 
a = 200
print(id(a))   # số khác -> đã trỏ sang đối tượng khác
print(id(b))   # vẫn là số cũ

Vì sao cần hiểu điều này ngay từ đầu?

Với số và chuỗi, sự khác biệt không gây hậu quả. Nhưng khi tới list ở 08 - List và Tuple, hiểu nhầm điểm này sẽ khiến bạn gặp lỗi rất khó hiểu (sửa list này thì list kia cũng đổi theo).


2. Quy tắc đặt tên biến

2.1. Bắt buộc (sai là lỗi)

Quy tắcVí dụ đúngVí dụ sai
Bắt đầu bằng chữ cái hoặc _ten, _tam1ten ❌
Chỉ chứa chữ, số, _ma_kh_01ma-kh ❌, ma kh ❌, ma@kh ❌
Không trùng từ khóalop_hocclass ❌, if ❌
Phân biệt hoa/thườngten ≠ Ten ≠ TEN—

2.2. Khuyến nghị theo PEP 8

# ✅ TỐT — snake_case, tên có nghĩa
tong_doanh_thu = 5000000
ma_khach_hang = "KH001"
ngay_lap_chung_tu = "2026-08-08"
 
# ⚠️ CHẠY ĐƯỢC NHƯNG XẤU
TongDoanhThu = 5000000      # PascalCase — dành cho class
tongDoanhThu = 5000000      # camelCase — của Java/C#, không phải Python
x = 5000000                 # tên vô nghĩa
tdt = 5000000               # viết tắt khó hiểu
 
# ❌ LỖI
tong-doanh-thu = 5000000    # SyntaxError — dấu gạch ngang là phép trừ
2026_doanh_thu = 5000000    # SyntaxError — bắt đầu bằng số

2.3. Đừng ghi đè tên có sẵn

# ❌ NGUY HIỂM
list = [1, 2, 3]     # Ghi đè hàm list() có sẵn
print = "xin chao"   # Ghi đè hàm print() — chương trình hỏng hoàn toàn
type = "khach le"    # Ghi đè hàm type()
str = "abc"          # Ghi đè hàm str()

Sau khi ghi đè, bạn không thể dùng các hàm đó nữa trong file này:

print = "xin chao"
print("thu in")      # ❌ TypeError: 'str' object is not callable

Cách nhận biết

VS Code sẽ tô màu khác cho các tên có sẵn (built-in). Nếu tên biến bạn định đặt bị tô màu đặc biệt, hãy đổi tên. Ví dụ dùng danh_sach thay cho list, kieu_kh thay cho type.


3. Kiểu dữ liệu int — Số nguyên

3.1. Cơ bản

tuoi = 35
so_luong = 1200
nhiet_do = -5
nam = 2026

3.2. Không giới hạn độ lớn

Đây là điểm mạnh đặc biệt của Python. Trong T-SQL, INT chỉ chứa tới khoảng 2,1 tỷ; BIGINT tới khoảng 9,2 triệu tỷ. Python không có giới hạn (chỉ giới hạn bởi RAM):

so_lon = 999999999999999999999999999999999999
print(so_lon * so_lon)

Kết quả:

999999999999999999999999999999999998000000000000000000000000000000001

Không tràn số (overflow), không cần khai báo BIGINT.

3.3. Dấu gạch dưới cho dễ đọc

tien_luong = 25_000_000     # Đọc là 25 triệu
print(tien_luong)           # In ra: 25000000

Python bỏ qua dấu _, nó chỉ để cho người đọc. Rất tiện khi làm việc với số tiền lớn.

3.4. Hệ cơ số khác

nhi_phan = 0b1010       # 10 trong hệ nhị phân (binary)
bat_phan = 0o17         # 15 trong hệ bát phân (octal)
thap_luc_phan = 0xFF    # 255 trong hệ thập lục phân (hexadecimal)
 
print(nhi_phan, bat_phan, thap_luc_phan)   # 10 15 255

4. Kiểu dữ liệu float — Số thực

4.1. Cơ bản

gia_ban = 15000.50
ty_le_chiet_khau = 0.05
pi = 3.14159
nhiet_do = -12.5

4.2. Ký hiệu khoa học

rat_lon = 1.5e6      # 1.5 × 10^6 = 1500000.0
rat_nho = 2.5e-4     # 2.5 × 10^-4 = 0.00025
print(rat_lon, rat_nho)

4.3. ⚠️ Vấn đề sai số của số thực (RẤT QUAN TRỌNG VỚI DÂN KẾ TOÁN)

Chạy thử đoạn này:

print(0.1 + 0.2)

Kết quả:

0.30000000000000004

Và:

print(0.1 + 0.2 == 0.3)    # False !!!

Nguyên nhân: Máy tính lưu số thực theo chuẩn IEEE 754 dưới dạng nhị phân. Số 0.1 trong hệ thập phân là số vô hạn tuần hoàn trong hệ nhị phân — giống như 1/3 = 0.3333... không biểu diễn hết được trong hệ thập phân. Vì vậy máy chỉ lưu được giá trị gần đúng.

Đây không phải lỗi của Python. Mọi ngôn ngữ dùng float đều vậy: C#, Java, JavaScript, và cả kiểu FLOAT/REAL trong SQL Server.

Tuyệt đối không dùng float cho tiền tệ

Với phần mềm tài chính kế toán, sai số này tích lũy qua hàng triệu bản ghi sẽ gây lệch sổ. Đây chính là lý do trong SQL Server bạn dùng DECIMAL(18,2) hoặc MONEY thay vì FLOAT.

Giải pháp trong Python: dùng module decimal

from decimal import Decimal
 
# ❌ Sai số
print(0.1 + 0.2)                                  # 0.30000000000000004
 
# ✅ Chính xác — chú ý truyền vào dạng CHUỖI
print(Decimal("0.1") + Decimal("0.2"))            # 0.3
print(Decimal("0.1") + Decimal("0.2") == Decimal("0.3"))   # True

Ví dụ thực tế tính hóa đơn:

from decimal import Decimal
 
don_gia = Decimal("15000.50")
so_luong = 3
thanh_tien = don_gia * so_luong
thue_suat = Decimal("0.1")
tien_thue = thanh_tien * thue_suat
 
print("Thanh tien:", thanh_tien)     # 45001.50
print("Tien thue :", tien_thue)      # 4500.150
print("Tong cong :", thanh_tien + tien_thue)   # 49501.650

Luôn truyền chuỗi vào Decimal()

Decimal(0.1)      # ❌ Decimal('0.1000000000000000055511151231257827021181583404541015625')
Decimal("0.1")    # ✅ Decimal('0.1')

Nếu truyền số float, sai số đã có sẵn từ trước sẽ được giữ nguyên.

Decimal là tương đương của DECIMAL/NUMERIC trong SQL. Tài liệu: https://docs.python.org/3/library/decimal.html

4.4. Khi nào dùng float, khi nào dùng Decimal?

Trường hợpKiểu nên dùng
Tiền tệ, kế toán, thuếDecimal
Đo lường vật lý, khoa học, thống kêfloat
Tỷ lệ, phần trăm để hiển thịfloat (đủ dùng)
Bài tập học tập trong lộ trình nàyfloat (trừ khi bài nói rõ)

5. Kiểu dữ liệu str — Chuỗi ký tự

Phần này chỉ giới thiệu cơ bản. Chi tiết đầy đủ ở 05 - Chuỗi ký tự (String).

5.1. Tạo chuỗi

ten = "Nguyen Van A"           # Nháy kép
dia_chi = 'Hue, Viet Nam'      # Nháy đơn — tương đương

Python chấp nhận cả hai. PEP 8 không bắt buộc chọn loại nào, nhưng hãy nhất quán trong một dự án.

5.2. Vì sao có 2 loại nháy?

Để lồng nhau mà không cần escape:

cau_1 = "Anh ay noi: 'Xin chao'"      # Nháy đơn bên trong nháy kép
cau_2 = 'File ten la "bao_cao.txt"'   # Nháy kép bên trong nháy đơn
print(cau_1)
print(cau_2)

5.3. Chuỗi nhiều dòng

mo_ta = """Dong 1
Dong 2
Dong 3"""
print(mo_ta)

5.4. Số nằm trong nháy là CHUỖI, không phải số

a = 10        # int
b = "10"      # str
 
print(a + a)  # 20      (phép cộng số học)
print(b + b)  # 1010    (phép nối chuỗi)
print(a + b)  # ❌ TypeError: unsupported operand type(s) for +: 'int' and 'str'

Đây là lỗi phổ biến nhất của người mới. Ghi nhớ: có nháy = chuỗi.


PHẦN 2 — TUẦN 5

6. Kiểu dữ liệu bool — Luận lý

6.1. Hai giá trị duy nhất

da_thanh_toan = True
da_huy = False

Viết hoa chữ cái đầu

Python dùng True và False — chữ T và F viết hoa. Viết true/false (như JavaScript, SQL) sẽ báo NameError.

6.2. bool thực chất là số nguyên

print(True + True)      # 2
print(True + 1)         # 2
print(False * 100)      # 0
print(int(True))        # 1
print(int(False))       # 0

Trong Python, bool là lớp con của int, với True == 1 và False == 0. Điều này cho phép mẹo đếm nhanh:

danh_sach_da_duyet = [True, False, True, True, False]
print(sum(danh_sach_da_duyet))    # 3 — đếm số True

6.3. Truthy và Falsy

Mọi giá trị trong Python đều có thể coi như đúng/sai khi đặt vào ngữ cảnh điều kiện.

Các giá trị FALSY (được coi là sai):

print(bool(0))          # False — số 0
print(bool(0.0))        # False — số thực 0
print(bool(""))         # False — chuỗi rỗng
print(bool([]))         # False — list rỗng
print(bool({}))         # False — dict rỗng
print(bool(()))         # False — tuple rỗng
print(bool(None))       # False — None

Mọi thứ khác đều TRUTHY (được coi là đúng):

print(bool(1))          # True
print(bool(-5))         # True — số âm vẫn là True
print(bool("0"))        # True — chuỗi "0" KHÔNG rỗng nên là True
print(bool("False"))    # True — chuỗi "False" KHÔNG rỗng nên là True
print(bool([0]))        # True — list có 1 phần tử
print(bool(" "))        # True — chuỗi có 1 dấu cách, không rỗng

Bẫy hay gặp

bool("0") và bool("False") đều trả về True, vì đó là chuỗi không rỗng. Chỉ có chuỗi rỗng "" mới là falsy.

Khái niệm này sẽ dùng nhiều ở 06 - Cấu trúc rẽ nhánh (if-elif-else).


7. None — Không có giá trị

7.1. Định nghĩa

None là một giá trị đặc biệt, nghĩa là “không có giá trị” hoặc “chưa xác định”.

ngay_thanh_toan = None      # Chưa thanh toán nên chưa có ngày
ghi_chu = None              # Không có ghi chú

7.2. So sánh với NULL trong SQL

SQL NULLPython None
Ý nghĩaKhông có giá trịKhông có giá trị
Cách kiểm traWHERE Col IS NULLif x is None:
NULL = NULLTrả về UNKNOWN (không phải TRUE)None == None trả về True
Trong phép tính5 + NULL = NULL (lan truyền)5 + None → ❌ TypeError

Khác biệt lớn nhất

Trong SQL, NULL lan truyền âm thầm qua phép tính. Trong Python, dùng None trong phép tính sẽ báo lỗi ngay:

x = None
print(x + 5)    # ❌ TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'

Đây là ưu điểm: lỗi lộ ra ngay thay vì âm thầm cho ra kết quả sai.

7.3. Kiểm tra None — dùng is, không dùng ==

x = None
 
if x is None:          # ✅ ĐÚNG — cách chuẩn
    print("Chua co gia tri")
 
if x == None:          # ⚠️ Chạy được nhưng KHÔNG chuẩn
    print("Chua co gia tri")

PEP 8 quy định rõ: so sánh với None phải dùng is hoặc is not.

Lý do: is so sánh danh tính đối tượng (có phải cùng một đối tượng trong bộ nhớ không), còn == so sánh giá trị. Vì None là đối tượng duy nhất (singleton), is vừa nhanh hơn vừa chính xác hơn.

gia_tri = None
if gia_tri is not None:
    print("Da co gia tri")
else:
    print("Chua co gia tri")

7.4. None khác với 0 và ""

a = None      # Chưa có giá trị
b = 0         # Có giá trị, giá trị đó là số 0
c = ""        # Có giá trị, giá trị đó là chuỗi rỗng
 
print(a is None)   # True
print(b is None)   # False
print(c is None)   # False

Trong nghiệp vụ kế toán, sự phân biệt này rất có ý nghĩa: so_du = 0 (tài khoản có số dư bằng 0) khác hoàn toàn so_du = None (chưa xác định được số dư).


8. type() và Dynamic Typing

8.1. Kiểm tra kiểu bằng type()

print(type(10))           # <class 'int'>
print(type(10.5))         # <class 'float'>
print(type("abc"))        # <class 'str'>
print(type(True))         # <class 'bool'>
print(type(None))         # <class 'NoneType'>

8.2. Kiểm tra bằng isinstance() (khuyến nghị)

x = 10
print(isinstance(x, int))          # True
print(isinstance(x, str))          # False
print(isinstance(x, (int, float))) # True — kiểm tra nhiều kiểu cùng lúc

isinstance() được ưa dùng hơn type() vì nó hiểu cả quan hệ kế thừa.

8.3. Dynamic Typing — Kiểu động

Python là ngôn ngữ dynamically typed: một biến có thể đổi kiểu bất cứ lúc nào.

x = 10
print(x, type(x))       # 10 <class 'int'>
 
x = "xin chao"
print(x, type(x))       # xin chao <class 'str'>
 
x = [1, 2, 3]
print(x, type(x))       # [1, 2, 3] <class 'list'>
 
x = None
print(x, type(x))       # None <class 'NoneType'>

Trong T-SQL, DECLARE @x INT thì @x mãi mãi là INT. Python không như vậy.

Ưu điểmNhược điểm
Dynamic typingViết nhanh, linh hoạt, ít code rườm ràLỗi kiểu chỉ lộ ra khi chạy tới dòng đó

Mặt trái của dynamic typing

tong = 0
tong = "0"          # Vô tình gán nhầm chuỗi
tong = tong + 100   # ❌ TypeError — nhưng chỉ phát hiện KHI CHẠY TỚI ĐÂY

Trong chương trình dài, lỗi này có thể nằm ở dòng 500 và chỉ xuất hiện trong một trường hợp hiếm gặp. Đây là lý do người ta phát triển type hints (gợi ý kiểu) — bạn sẽ học sau khi hoàn thành lộ trình.

8.4. Type hints — Xem trước (chưa cần dùng)

so_luong: int = 10
ten: str = "Nguyen Van A"
gia: float = 15000.5

Dấu : int là type hint. Python không ép buộc nó — bạn vẫn gán được kiểu khác, nhưng VS Code sẽ cảnh báo. Đây là chủ đề nâng cao, cứ ghi nhớ là có, chưa cần dùng ngay.


9. Type Casting — Ép kiểu

9.1. Các hàm ép kiểu

HàmChuyển sangVí dụ
int(x)Số nguyênint("10") → 10
float(x)Số thựcfloat("10.5") → 10.5
str(x)Chuỗistr(10) → "10"
bool(x)Luận lýbool(0) → False

9.2. Ví dụ

# Chuỗi -> Số
print(int("100"))          # 100
print(float("15.5"))       # 15.5
 
# Số -> Chuỗi
print(str(100))            # "100"
print("Tuoi: " + str(35))  # Tuoi: 35
 
# Số thực -> Số nguyên (CẮT BỎ phần thập phân, KHÔNG làm tròn)
print(int(9.99))           # 9   <- không phải 10!
print(int(-9.99))          # -9  <- cắt về phía 0
print(int(9.5))            # 9
 
# Muốn làm tròn thì dùng round()
print(round(9.99))         # 10
print(round(9.5))          # 10
print(round(2.5))          # 2   <- chú ý! xem mục 9.4
print(round(15.6789, 2))   # 15.68 — làm tròn 2 chữ số thập phân

9.3. Ép kiểu thất bại

print(int("abc"))          # ❌ ValueError: invalid literal for int() with base 10: 'abc'
print(int("10.5"))         # ❌ ValueError — int() không nhận chuỗi có dấu chấm
print(int(""))             # ❌ ValueError
print(int(None))           # ❌ TypeError

Cách xử lý đúng cho "10.5":

print(int(float("10.5")))  # 10 — qua float trước, rồi mới sang int

Xử lý an toàn với try/except sẽ học ở 11 - Xử lý lỗi (Exception).

9.4. ⚠️ round() dùng làm tròn ngân hàng

print(round(0.5))     # 0   <- KHÔNG phải 1!
print(round(1.5))     # 2
print(round(2.5))     # 2   <- KHÔNG phải 3!
print(round(3.5))     # 4

Python dùng banker’s rounding (làm tròn ngân hàng, còn gọi là round half to even — làm tròn về số chẵn gần nhất). Quy tắc này được chuẩn IEEE 754 quy định, nhằm tránh thiên lệch khi cộng dồn hàng triệu số.

Nếu cần làm tròn theo kiểu “0.5 lên trên” như thông thường:

from decimal import Decimal, ROUND_HALF_UP
 
def lam_tron_thuong(so, chu_so=0):
    """Làm tròn theo quy tắc 0.5 làm tròn lên."""
    return Decimal(str(so)).quantize(Decimal("1." + "0" * chu_so) if chu_so else Decimal("1"),
                                      rounding=ROUND_HALF_UP)
 
print(lam_tron_thuong(2.5))        # 3
print(lam_tron_thuong(15.675, 2))  # 15.68

Liên hệ với SQL Server

Hàm ROUND() trong T-SQL dùng round half away from zero (0.5 làm tròn ra xa số 0), tức ROUND(2.5, 0) = 3. Python mặc định khác. Khi viết chương trình đối chiếu số liệu với hệ thống ERP, đây là nguồn lệch số rất dễ bỏ sót.

9.5. Ép kiểu ngầm định (implicit conversion)

Python tự nâng kiểu trong một số trường hợp:

print(10 + 5.5)        # 15.5  — int tự nâng thành float
print(type(10 + 5.5))  # <class 'float'>
print(True + 10)       # 11    — bool tự nâng thành int

Nhưng không tự chuyển giữa số và chuỗi:

print("10" + 5)        # ❌ TypeError
print("10" * 3)        # "101010" — đây là NHÂN BẢN chuỗi, không phải phép nhân số!

10. input() — Nhận dữ liệu từ người dùng

10.1. Cơ bản

ten = input("Nhap ten cua ban: ")
print("Xin chao,", ten)

Chạy:

Nhap ten cua ban: Nguyen Van A
Xin chao, Nguyen Van A

10.2. ⚠️ input() LUÔN trả về chuỗi

Đây là lỗi kinh điển của người mới:

tuoi = input("Nhap tuoi: ")     # Người dùng gõ: 35
print(type(tuoi))               # <class 'str'>  <- CHUỖI, không phải số!
print(tuoi + 1)                 # ❌ TypeError

Cách đúng — ép kiểu ngay:

tuoi = int(input("Nhap tuoi: "))
print("Nam sau ban", tuoi + 1, "tuoi")
gia = float(input("Nhap don gia: "))
so_luong = int(input("Nhap so luong: "))
print("Thanh tien:", gia * so_luong)

10.3. Chương trình hoàn chỉnh — Tính lương

"""Chương trình tính lương thực lĩnh."""
 
# Hằng số
NGAY_CONG_CHUAN = 26
TY_LE_BHXH = 0.08
TY_LE_BHYT = 0.015
TY_LE_BHTN = 0.01
 
# Nhập liệu
print("=== TINH LUONG THUC LINH ===")
ho_ten = input("Ho ten nhan vien: ")
luong_co_ban = float(input("Luong co ban (VND): "))
ngay_cong = float(input("So ngay cong thuc te: "))
phu_cap = float(input("Phu cap (VND): "))
 
# Xử lý
luong_theo_ngay = luong_co_ban / NGAY_CONG_CHUAN
luong_thuc_te = luong_theo_ngay * ngay_cong
tong_thu_nhap = luong_thuc_te + phu_cap
 
bhxh = luong_co_ban * TY_LE_BHXH
bhyt = luong_co_ban * TY_LE_BHYT
bhtn = luong_co_ban * TY_LE_BHTN
tong_bao_hiem = bhxh + bhyt + bhtn
 
thuc_linh = tong_thu_nhap - tong_bao_hiem
 
# Xuất kết quả
print()
print("=" * 45)
print("BANG LUONG:", ho_ten)
print("=" * 45)
print("Luong co ban    :", round(luong_co_ban))
print("Ngay cong       :", ngay_cong, "/", NGAY_CONG_CHUAN)
print("Luong theo cong :", round(luong_thuc_te))
print("Phu cap         :", round(phu_cap))
print("-" * 45)
print("Tong thu nhap   :", round(tong_thu_nhap))
print("BHXH (8%)       :", round(bhxh))
print("BHYT (1.5%)     :", round(bhyt))
print("BHTN (1%)       :", round(bhtn))
print("Tong bao hiem   :", round(tong_bao_hiem))
print("=" * 45)
print("THUC LINH       :", round(thuc_linh))
print("=" * 45)

Đọc lại code này sau mỗi module

Chương trình trên dùng đúng những gì bạn đã học. Sau khi học 06 - Cấu trúc rẽ nhánh (if-elif-else), bạn sẽ biết thêm cách kiểm tra dữ liệu nhập; sau 10 - Hàm (Function) bạn sẽ tách nó thành các hàm; sau 11 - Xử lý lỗi (Exception) bạn sẽ làm nó không sập khi người dùng gõ chữ vào ô số.

10.4. Gán nhiều biến cùng lúc

# Gán song song
a, b, c = 1, 2, 3
print(a, b, c)      # 1 2 3
 
# Hoán đổi giá trị — không cần biến trung gian
x, y = 10, 20
x, y = y, x
print(x, y)         # 20 10
 
# Gán cùng một giá trị cho nhiều biến
p = q = r = 0
print(p, q, r)      # 0 0 0

Cú pháp hoán đổi x, y = y, x là đặc trưng rất được ưa chuộng của Python. Trong các ngôn ngữ khác bạn phải viết 3 dòng với biến tạm.


11. Thực hành bắt buộc

Bài 1 — Khám phá kiểu dữ liệu

Viết file tuan-04/kieu_du_lieu.py, in ra giá trị và kiểu của từng biểu thức:

print(10, type(10))
print(10.0, type(10.0))
print("10", type("10"))
print(True, type(True))
print(None, type(None))
print(10 == 10.0, type(10 == 10.0))
print(10 + True, type(10 + True))
print("10" * 3, type("10" * 3))

Ghi vào nhật ký: kết quả nào làm bạn bất ngờ?

Bài 2 — Chuyển đổi kiểu

Dự đoán kết quả trước khi chạy, sau đó chạy để đối chiếu:

print(int("42"))
print(int(3.99))
print(int(-3.99))
print(float("3"))
print(str(3.14) + " la so pi")
print(bool(""))
print(bool(" "))
print(bool("0"))
print(bool([]))
print(round(2.5))
print(round(3.5))
print(round(1.2345, 2))

Bài 3 — Diện tích và chu vi

Viết chương trình nhận vào chiều dài, chiều rộng hình chữ nhật, in ra diện tích và chu vi.

Nhap chieu dai (m): 5.5
Nhap chieu rong (m): 3.2
Dien tich: 17.6 m2
Chu vi   : 17.4 m

Bài 4 — Đổi tiền

Nhập số tiền VND và tỷ giá, in ra số tiền quy đổi sang USD, làm tròn 2 chữ số.

Bài 5 — Tách giờ phút giây

Nhập vào tổng số giây, in ra dạng giờ:phút:giây.

Nhap so giay: 7385
7385 giay = 2 gio 3 phut 5 giay

Gợi ý: dùng phép chia lấy nguyên // và chia lấy dư % — chi tiết ở 04 - Toán tử và biểu thức.

Bài 6 — Hóa đơn có VAT

Nhập tên hàng, đơn giá, số lượng, thuế suất (%). In hóa đơn đầy đủ. Dùng Decimal cho các phép tính tiền.

Bài 7 — Cố tình gây lỗi

Chạy từng dòng, ghi lại tên lỗi vào Lỗi thường gặp và cách đọc lỗi:

print(int("abc"))
print("10" + 5)
print(None + 1)
print(bien_chua_ton_tai)
print(True and "abc")   # <- không lỗi, nhưng kết quả bất ngờ, hãy giải thích

12. Tự kiểm tra

  • Tôi giải thích được biến trong Python là “nhãn dán” chứ không phải “cái hộp”
  • Tôi phân biệt được = và ==
  • Tôi biết 5 kiểu dữ liệu cơ bản và cách kiểm tra bằng type()
  • Tôi hiểu vì sao 0.1 + 0.2 != 0.3 và biết dùng Decimal thay thế
  • Tôi biết None tương ứng với NULL và phải kiểm tra bằng is None
  • Tôi biết input() luôn trả về chuỗi, phải ép kiểu
  • Tôi biết round() của Python dùng banker’s rounding
  • Tôi phân biệt được truthy và falsy

13. Tài liệu chính thức

NguồnNội dungLink
Built-in TypesToàn bộ kiểu dữ liệu có sẵnhttps://docs.python.org/3/library/stdtypes.html
Tutorial — NumbersSố học cơ bảnhttps://docs.python.org/3/tutorial/introduction.html#numbers
decimal moduleSố thập phân chính xáchttps://docs.python.org/3/library/decimal.html
Floating Point ArithmeticGiải thích sai số số thựchttps://docs.python.org/3/tutorial/floatingpoint.html
Built-in Functionsint(), float(), str(), input(), round(), type()https://docs.python.org/3/library/functions.html
PEP 8 — Naming ConventionsQuy tắc đặt tênhttps://peps.python.org/pep-0008/#naming-conventions

Tiếp theo → 04 - Toán tử và biểu thức