⭐ Vision Engineer · Chặng 1Bài 2/11Bài học~60 phút

Python cơ bản: biến, kiểu dữ liệu và toán tử

int, float, str, bool qua ví dụ đo lường và OK/NG, f-string định dạng số, ép kiểu và hai cái bẫy về số thực.

Python cơ bản: biến, kiểu dữ liệu và toán tử

Học xong bài này, bạn sẽ

  • Dùng int, float, str, bool đúng chỗ
  • Ép kiểu và định dạng chuỗi bằng f-string
  • Nhận biết lỗi chia số nguyên, làm tròn số thực

Nên học trước: Cài Python, VS Code và chạy chương trình đầu tiên

Nội dung bài viết
  1. 1. Biến: đặt tên cho dữ liệu
  2. 2. Bốn kiểu dữ liệu cơ bản
  3. 3. Toán tử số học
  4. 4. So sánh và logic
  5. 5. Chuỗi và f-string
  6. 6. Ép kiểu và nhập dữ liệu
  7. 7. Hai cái bẫy về số
  8. Tóm tắt
  9. Bài tập

Mọi chương trình đều làm việc với dữ liệu: kích thước ảnh, mã sản phẩm, kết quả OK/NG, nhiệt độ cảm biến. Bài này dạy cách lưu dữ liệu vào biến, bốn kiểu dữ liệu cơ bản và các phép toán. Đây là bộ "từ vựng" bạn dùng trong mọi dòng code về sau.

1. Biến: đặt tên cho dữ liệu

Biến là một cái tên gắn với một giá trị. Dùng dấu = để gán:

chieu_rong = 1920
chieu_cao = 1080
ten_camera = "CAM_01"

so_pixel = chieu_rong * chieu_cao
print(ten_camera, "có", so_pixel, "pixel")
CAM_01 có 2073600 pixel

Dấu = trong lập trình không có nghĩa "bằng nhau" như toán học, mà là "gán giá trị bên phải cho tên bên trái". Vì thế viết dem = dem + 1 là hợp lệ: lấy giá trị cũ cộng 1 rồi gán lại.

Quy tắc đặt tên

  • Chỉ gồm chữ cái không dấu, chữ số, dấu gạch dưới; không bắt đầu bằng số: anh_1 đúng, 1_anh sai.
  • Phân biệt chữ hoa, chữ thường: Dem và dem là hai biến khác nhau.
  • Theo quy ước Python, dùng snake_case: chữ thường nối bằng gạch dưới (so_san_pham_loi).
  • Đặt tên có nghĩa: nguong_sang tốt hơn x. Ba tháng sau đọc lại bạn sẽ cảm ơn chính mình.

2. Bốn kiểu dữ liệu cơ bản

KiểuÝ nghĩaVí dụ trong Vision
intSố nguyênsố sản phẩm, tọa độ pixel x = 320
floatSố thực (có phần thập phân)kích thước đo được 12.48 mm
strChuỗi văn bảnmã lô "LOT2026-10", đường dẫn ảnh
boolĐúng/sai: True hoặc Falsesản phẩm đạt hay không

Hàm type() cho biết kiểu của một giá trị:

so_san_pham = 1250
duong_kinh = 12.48
ma_lo = "LOT2026-10"
dat_chuan = True

print(type(so_san_pham), type(duong_kinh), type(ma_lo), type(dat_chuan))
<class 'int'> <class 'float'> <class 'str'> <class 'bool'>

3. Toán tử số học

a, b = 17, 5
print(a + b)    # cộng: 22
print(a - b)    # trừ: 12
print(a * b)    # nhân: 85
print(a / b)    # chia: 3.4  (luôn ra float)
print(a // b)   # chia lấy phần nguyên: 3
print(a % b)    # chia lấy dư: 2
print(a ** 2)   # lũy thừa: 289

Hai phép rất hay dùng trong xử lý ảnh:

  • // để tìm tâm ảnh: ảnh rộng 641 pixel thì tâm ở cột 641 // 2 = 320 (tọa độ pixel phải là số nguyên).
  • % để làm việc theo chu kỳ, ví dụ cứ 100 ảnh thì lưu một ảnh mẫu: if so_anh % 100 == 0.

4. So sánh và logic

Phép so sánh trả về bool. Đây là nền tảng của mọi tiêu chí OK/NG:

duong_kinh = 12.48
dat = 12.40 <= duong_kinh <= 12.60     # Python cho phép viết so sánh liên tiếp
print("Đạt dung sai:", dat)

co_vet_xuoc = False
san_pham_ok = dat and not co_vet_xuoc
print("Sản phẩm OK:", san_pham_ok)
Đạt dung sai: True
Sản phẩm OK: True

Các toán tử: == (bằng), != (khác), <, <=, >, >=; và ba toán tử logic and, or, not.

Đừng nhầm = và === là gán giá trị, == là so sánh. Viết if ket_qua = "OK": sẽ báo SyntaxError.

5. Chuỗi và f-string

Chuỗi đặt trong nháy đơn hoặc nháy kép. Cách tốt nhất để ghép dữ liệu vào chuỗi là f-string: thêm chữ f trước dấu nháy và đặt biến trong {}:

ma_sp = "SP-0042"
duong_kinh = 12.4837
thoi_gian_ms = 38.2

print(f"Sản phẩm {ma_sp}: đường kính {duong_kinh:.2f} mm, xử lý {thoi_gian_ms:.0f} ms")
print(f"Ảnh số {7:05d}")          # thêm số 0 phía trước cho đủ 5 chữ số
print(f"Tỉ lệ lỗi: {0.0123:.1%}")  # định dạng phần trăm
Sản phẩm SP-0042: đường kính 12.48 mm, xử lý 38 ms
Ảnh số 00007
Tỉ lệ lỗi: 1.2%

Ba định dạng cần nhớ: :.2f (2 chữ số thập phân), :05d (số nguyên đủ 5 chữ số, thêm 0 phía trước, rất hợp để đặt tên file ảnh anh_00007.png), :.1% (phần trăm).

Một số thao tác chuỗi hay dùng:

ten_file = "  SP-0042_NG.PNG  "
ten = ten_file.strip().lower()        # bỏ khoảng trắng hai đầu, đổi chữ thường
print(ten)                            # sp-0042_ng.png
print(ten.endswith(".png"))           # True
print(ten.split("_"))                 # ['sp-0042', 'ng.png']
print("_ng" in ten)                   # True: kiểm tra chuỗi con
print(ten.replace(".png", ".jpg"))    # sp-0042_ng.jpg
print(len(ten))                       # độ dài chuỗi: 14

6. Ép kiểu và nhập dữ liệu

Hàm input() luôn trả về chuỗi, kể cả khi người dùng gõ số. Muốn tính toán phải ép kiểu bằng int() hoặc float():

so_luong = int(input("Số sản phẩm đã kiểm: "))
ty_le_loi = float(input("Tỉ lệ lỗi (%): "))
so_loi = so_luong * ty_le_loi / 100
print(f"Số sản phẩm lỗi ước tính: {so_loi:.0f}")
Số sản phẩm đã kiểm: 25
Tỉ lệ lỗi (%): 3.5
Số sản phẩm lỗi ước tính: 1

Ép kiểu còn dùng khi đọc dữ liệu từ file, từ PLC hay từ tên file ảnh: int("0042") cho ra 42, str(42) cho ra "42". Gõ chữ vào chỗ cần số sẽ gây ValueError; bài 6 sẽ dạy cách bắt lỗi này.

7. Hai cái bẫy về số

Số thực không chính xác tuyệt đối

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

import math
print(math.isclose(0.1 + 0.2, 0.3))   # True: so sánh số thực đúng cách
print(round(12.4837, 2))              # 12.48

Máy tính lưu số thực dạng nhị phân nên có sai số rất nhỏ. Khi so sánh kích thước đo được, không dùng == với số thực, hãy dùng khoảng dung sai như ví dụ ở mục 4 hoặc math.isclose().

round() làm tròn "về số chẵn"

print(round(2.5), round(3.5))   # 2 4  (không phải 3 4)

Python dùng quy tắc làm tròn của ngân hàng: số .5 làm tròn về số chẵn gần nhất để giảm sai lệch tích lũy. Khi hiển thị, dùng f-string :.2f; khi tính toán, giữ nguyên độ chính xác đến bước cuối.

Tóm tắt

  • Biến gán bằng =, đặt tên snake_case có nghĩa.
  • Bốn kiểu cơ bản: int, float, str, bool.
  • / luôn ra float, // lấy phần nguyên, % lấy dư.
  • So sánh trả về bool; kết hợp bằng and, or, not.
  • Dùng f-string với :.2f, :05d, :.1% để in đẹp.
  • input() trả về chuỗi; không so sánh số thực bằng ==.

Bài tập

Bài 1. Kích thước trường nhìn

Camera 2448 × 2048 pixel nhìn một vùng rộng 122,4 mm. Tính độ phân giải theo mm/pixel và pixel/mm, in với 3 chữ số thập phân.

Xem đáp án
rong_px = 2448
rong_mm = 122.4
mm_moi_px = rong_mm / rong_px
print(f"{mm_moi_px:.3f} mm/pixel")
print(f"{1 / mm_moi_px:.3f} pixel/mm")
0.050 mm/pixel
20.000 pixel/mm

Mỗi pixel tương ứng 0,05 mm. Con số này quyết định bạn đo chính xác được đến đâu (chặng 6 sẽ học kỹ).

Bài 2. Kiểm tra dung sai

Kích thước danh nghĩa 25,00 mm, dung sai ±0,05 mm. Với giá trị đo do = 25.062, in ra OK hoặc NG bằng một biểu thức so sánh (chưa cần dùng if).

Xem đáp án
danh_nghia = 25.00
dung_sai = 0.05
do = 25.062
dat = danh_nghia - dung_sai <= do <= danh_nghia + dung_sai
print("OK" if dat else "NG")   # biểu thức điều kiện một dòng, bài sau sẽ học kỹ
NG

Bài 3. Đặt tên file ảnh

Với ma_tram = "ST3", so_thu_tu = 128, ket_qua = "NG", tạo tên file ST3_000128_NG.png bằng f-string.

Xem đáp án
ma_tram = "ST3"
so_thu_tu = 128
ket_qua = "NG"
ten_file = f"{ma_tram}_{so_thu_tu:06d}_{ket_qua}.png"
print(ten_file)
ST3_000128_NG.png

Bài 4. Đọc thông tin từ tên file

Cho ten = "ST3_000128_NG.png". Tách ra mã trạm, số thứ tự (dạng int) và kết quả.

Xem đáp án
ten = "ST3_000128_NG.png"
phan = ten.replace(".png", "").split("_")
ma_tram = phan[0]
so_thu_tu = int(phan[1])
ket_qua = phan[2]
print(ma_tram, so_thu_tu, ket_qua)
ST3 128 NG

phan[0] lấy phần tử đầu tiên của danh sách. Bài 4 (list, dict) sẽ học kỹ về danh sách.

Bài tiếp theo
Ban biên tập HọcFree

Chúng tôi viết những bài hướng dẫn dễ hiểu, thực tế để ai cũng có thể tự học lập trình và ngoại ngữ, hoàn toàn miễn phí.