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.
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
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_anhsai. - Phân biệt chữ hoa, chữ thường:
Demvàdemlà 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_sangtốt hơnx. 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ĩa | Ví dụ trong Vision |
|---|---|---|
int | Số nguyên | số sản phẩm, tọa độ pixel x = 320 |
float | Số thực (có phần thập phân) | kích thước đo được 12.48 mm |
str | Chuỗi văn bản | mã lô "LOT2026-10", đường dẫn ảnh |
bool | Đúng/sai: True hoặc False | sả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ột641 // 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.
= 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ằngand,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.


