Python căn bản cho người dùng Claude Code — đọc hiểu để điều khiển
Claude Code sinh ra code Python, diff xanh-đỏ, lỗi đỏ — bạn gật đại vì không đọc được? Bài nền tảng cho người làm Marketing & Sales: học đủ Python để ĐỌC (biến, vòng lặp, hàm, kiểu dữ liệu, class), rồi dùng cái nền đó để duyệt diff, đọc traceback và biết khi nào nên dừng Claude lại. Không cần tự viết code.
PythonPlaybook này dành cho ai?
Bạn làm marketing, sales hay content, và đang dùng — hoặc định dùng — Claude Code. Rồi sẽ tới lúc trên màn hình hiện ra một đoạn chữ lạ: một file .py, vài dòng tô xanh tô đỏ Claude xin bạn duyệt, hay một khối chữ đỏ báo lỗi. Bạn gật đại vì "chắc nó biết nó làm gì" — và đó đúng là lúc bạn mất quyền kiểm soát.
Bài này cho bạn hai thứ, theo đúng thứ tự đó:
- Nền tảng Python — đủ để bạn không bị "mù chữ" khi nhìn vào code. Biến, vòng lặp, hàm, kiểu dữ liệu… những viên gạch cơ bản, giải thích cho người chưa từng lập trình.
- Cách đọc để điều khiển Claude Code — phần mình muốn bạn chú ý hơn cả: dùng cái nền ấy để duyệt một diff có cơ sở, đọc một lỗi đỏ, và bắt được khi Claude đi sai.
Nói thẳng một điều: bạn không bắt buộc phải tự viết code — Claude lo phần viết. Nhưng người đọc được code sẽ điều khiển Claude tốt hơn hẳn người gật theo. Học nền tảng ở đây không phải để đi thi tuyển lập trình viên; mà để đọc hiểu và kiểm soát những gì Claude làm.

Bạn sẽ đạt được gì?
- Đọc được nền tảng Python: nhận ra biến, hàm, vòng lặp, kiểu dữ liệu, class — hiểu một đoạn code đại khái làm gì
- Duyệt một diff Claude xin: thấy nó vừa thêm gì, bỏ gì, có khớp ý bạn không
- Đọc một thông báo lỗi (traceback): tìm ra dòng nào là lỗi thật giữa một rừng chữ đỏ
- Hiểu khi Claude nói "thiếu thư viện", "cài package", "môi trường" — và biết đó có đáng lo không
- Nhận ra vài dấu hiệu nên dừng Claude lại ngay trong code, trước khi gật
Bạn cần chuẩn bị gì?
- Không cần cài Python hay gõ lệnh gì để học bài này — bạn chỉ đọc
- Nếu đã có Claude Code và một việc đang làm dở thì càng tốt — vừa đọc vừa soi vào màn hình của chính bạn
- Tinh thần: đừng cố thuộc lòng cú pháp. Mục tiêu là nhận ra, không phải nhớ để gõ
PHẦN A — Nền tảng Python
1. Python hoạt động như thế nào?
Lập trình là việc viết ra các chỉ dẫn cho máy tính làm một việc cụ thể. Máy chỉ hiểu ngôn ngữ nhị phân (0 và 1), nên ngôn ngữ lập trình đóng vai trò "phiên dịch" giữa chữ người viết và thứ máy chạy được. Python là một trong những ngôn ngữ dễ tiếp cận nhất — cú pháp đơn giản, thư viện phong phú, cộng đồng lớn — do Guido van Rossum tạo ra năm 1991.
Python dùng một trình thông dịch (interpreter) để chuyển code thành thứ máy hiểu. Khác với C/C++ phải biên dịch sẵn thành file mã máy riêng, Python chuyển code thành một dạng trung gian gọi là bytecode, rồi một bộ máy ảo (Python Virtual Machine) chạy bytecode đó. Nhờ vậy cùng một file Python chạy được trên Windows, Mac, Linux mà không cần sửa.

Trong Claude Code: bạn không cần lo khâu này. Nhưng khi Claude nói "chạy file Python", đây chính là thứ đang diễn ra bên dưới.
2. Biến
Biến (variable) là tên của một chỗ trong bộ nhớ chứa một giá trị. Hình dung như một cái hộp có dán nhãn: bạn cất một giá trị vào, dán tên lên, rồi gọi lại bằng tên đó.
price = 20
quantity = 60
name = "Ninh"Dấu = ở đây là gán (cất giá trị vào hộp), không phải "bằng nhau" như trong toán. price = 20 nghĩa là "dán nhãn price lên hộp chứa số 20".
Trong Claude Code: Claude gần như luôn đặt tên biến bằng tiếng Anh (
price,total,user_name) — đó là chuyện bình thường, không phải lỗi. Nhìn tên biến là đoán được nó cất gì.
3. Toán tử
Toán tử là các ký hiệu để bảo máy thực hiện một phép tính giữa các giá trị. Ví dụ trong a + b, dấu + là toán tử cộng.
Python có các nhóm toán tử chính:
| Nhóm | Ký hiệu | Dùng để |
|---|---|---|
| Số học | + - * / % ** // |
cộng, trừ, nhân, chia, chia lấy dư, lũy thừa, chia lấy phần nguyên |
| Gán | = += -= *= /= |
cất giá trị / cộng-thêm-rồi-cất… |
| So sánh | == != < > <= >= |
so sánh hai giá trị, cho ra Đúng/Sai |
| Logic | and or not |
nối nhiều điều kiện |
| Thành viên | in not in |
kiểm tra một phần tử có nằm trong danh sách không |
| Định danh | is is not |
kiểm tra hai biến có cùng là một đối tượng không |
Lưu ý hai cái dễ nhầm: = là gán, còn == là so sánh bằng. Đây là một trong những chỗ Claude (và cả con người) hay viết nhầm.
4. Chú thích
Chú thích (comment) là phần mã máy bỏ qua khi chạy — viết cho người đọc hiểu, không ảnh hưởng đến chương trình. Dùng dấu # cho chú thích một dòng:
# Đây là chú thích, máy không chạy dòng này
price = 20 # chú thích cũng đặt được ở cuối dòngVới đoạn giải thích dài nhiều dòng, người ta hay dùng cặp ba nháy ''' ... ''':
'''
Đoạn này giải thích
trên nhiều dòng
'''Nói cho chính xác:
''' '''thực ra tạo ra một chuỗi ký tự (string), không phải chú thích "thật". Nhưng nếu không gán cho biến nào, nó vô hại và thường được dùng như chú thích nhiều dòng. Bạn chỉ cần nhận ra: thấy ba nháy là một khối chữ giải thích.
5. Nhập và xuất dữ liệu
print(...)— xuất (in kết quả ra màn hình)input(...)— nhập (nhận giá trị người dùng gõ vào)
a = 5
b = int(input("Nhập một số: ")) # int() đổi chữ người gõ thành số
tong = a + b
print(tong)Nếu người dùng gõ 10, màn hình in ra 15. Lưu ý input() luôn trả về chữ (string), nên muốn tính toán phải bọc int(...) để đổi sang số.
6. Kiểu dữ liệu
Kiểu dữ liệu (data type) cho máy biết một giá trị thuộc loại gì và dùng vào việc gì. Để kiểm tra kiểu của một biến, dùng type(). Sáu kiểu hay gặp nhất:
1. Số (Number) — số nguyên (int), số thực (float), số phức (complex):
a = 10
print(type(a)) # <class 'int'>
b = 4.5
print(type(b)) # <class 'float'>2. Chuỗi ký tự (String) — chữ, đặt trong nháy đơn hoặc nháy kép:
b = "Python Programming"
print(type(b)) # <class 'str'>3. List (danh sách) — chuỗi phần tử có thứ tự, sửa được; tạo bằng [ ]. Một list chứa được nhiều kiểu khác nhau:
data = [98, "Ninh", 85.6, 98]
print(type(data)) # <class 'list'>4. Tuple — giống list nhưng không sửa được sau khi tạo; tạo bằng ( ). Hữu ích khi muốn bảo vệ dữ liệu khỏi bị đổi nhầm:
data = (9, "Ninh", 79.89, 9)
print(type(data)) # <class 'tuple'>5. Set (tập hợp) — không có thứ tự và không chấp nhận giá trị trùng; tạo bằng { }:
data = {9, 10, 11}
print(type(data)) # <class 'set'>6. Dictionary (từ điển) — tập hợp các cặp khóa : giá trị (key : value); tạo bằng {khóa: giá_trị}. Dùng để tra cứu nhanh theo khóa:
nguoi = {"id": "RF5701", "name": "Ninh", "batch": 572}
print(nguoi.keys()) # in ra tất cả các khóa
print(nguoi.values()) # in ra tất cả các giá trịTrong Claude Code: dictionary và list xuất hiện khắp nơi — file cấu hình
.json, dữ liệu Claude đọc/ghi. Nhận ra{...}là cặp khóa-giá-trị và[...]là danh sách là đủ để đọc hầu hết file dữ liệu.
7. Lấy phần tử (Indexing) và cắt lát (Slicing)
Indexing là lấy giá trị tại một vị trí. Vị trí đếm từ 0: phần tử đầu là index 0. Index âm đếm ngược từ cuối: -1 là phần tử cuối cùng.
Slicing là lấy một khúc, cú pháp [bắt_đầu : kết_thúc : bước]. Giá trị tại vị trí kết_thúc không được lấy. Bước mặc định là 1.
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# Indexing
print(data[0]) # 1 — phần tử đầu
print(data[-1]) # 9 — phần tử cuối
print(data[-3]) # 7 — phần tử thứ ba từ cuối
# Slicing
print(data[1:4]) # [2, 3, 4] — từ index 1 đến trước index 4
print(data[0:8:2]) # [1, 3, 5, 7] — từ index 0 đến trước 8, bước nhảy 2Đây là chỗ bài viết Python trên mạng hay ghi nhầm — nhớ: slicing trả về các giá trị, không phải các index, và không lấy phần tử ở vị trí kết thúc.
8. Chuyển đổi kiểu dữ liệu (ép kiểu)
Đổi một giá trị từ kiểu này sang kiểu khác bằng các hàm int(), float(), str(), list()…:
a = 2 # int
b = float(a) # 2.0 → float
c = str(b) # "2.0" → string
d = list(c) # ['2', '.', '0'] → list9. Câu lệnh điều kiện
Câu lệnh điều kiện cho phép làm việc khác nhau tùy tình huống, dùng if / elif / else:
if troi_mua and sam_chop:
print("Ở nhà")
elif troi_mua:
print("Mặc áo mưa ra ngoài")
else:
print("Đi chơi")Đọc thành lời: nếu mưa VÀ sấm chớp thì ở nhà; nếu chỉ mưa thì mặc áo mưa; còn lại thì đi chơi.
10. Thụt lề — chỗ Python khác mọi thứ bạn từng đọc
Trong Python, khoảng trắng đầu dòng có nghĩa. Những dòng thụt vào cùng một mức là một nhóm việc đi liền nhau — thường là "làm những việc này khi điều kiện ở trên đúng".
if da_tra_tien:
gui_email()
mo_khoa()Hai dòng thụt vào thuộc về if — chỉ chạy khi đã trả tiền. Nếu một dòng không thụt vào, nó nằm ngoài và luôn chạy.
Vì sao bạn cần để ý? Vì thụt lề sai là một trong những lỗi Claude hay tạo ra nhất khi sửa code cũ — nó dời một dòng ra/vào nhầm mức, logic đổi hoàn toàn mà nhìn thoáng qua vẫn thấy có vẻ đúng. Khi duyệt diff, thấy một dòng đổi mức thụt lề thì dừng lại hỏi: "dòng này còn thuộc đúng nhóm không?"

11. Vòng lặp
Vòng lặp giúp làm một việc lặp lại nhiều lần mà không phải viết đi viết lại. Python có hai loại chính.
Vòng lặp for — lặp qua một dãy:
for i in range(0, 10):
print(i) # in các số từ 0 đến 9range(đầu, cuối)tạo dãy số từđầuđến trướccuối, tăng dần 1 đơn vị.enumerate(...)cho bạn cả vị trí lẫn giá trị khi lặp:
ds = [10, 20, 30]
for vi_tri, gia_tri in enumerate(ds):
print("Tại vị trí", vi_tri, "giá trị là", gia_tri)Vòng lặp while — lặp cho đến khi điều kiện không còn đúng:
i = 0
while i < 10:
i = i + 1 # chạy 10 lần, đến khi i = 10 thì dừng12. Hàm
Hàm (function) là một đoạn code đóng gói để làm một việc cụ thể, gọi lại được nhiều lần. Tạo hàm bằng từ khóa def. Muốn hàm trả kết quả ra ngoài, dùng return:
def cong(x, y):
return x + y
print(cong(6, 9)) # 15Nếu hàm không có
return, nó không trả lại giá trị nào —print(cong(6, 9))khi đó sẽ in raNone. Đây là lỗi rất hay gặp khi đọc code: hàm "quên" return.
Hàm đệ quy
Hàm đệ quy là hàm tự gọi chính nó. Điều cần để ý không phải nó gọi bao nhiêu lần, mà là nó phải có một điều kiện dừng (base case) — thiếu điều kiện này, nó gọi mãi không ngừng và chương trình sẽ treo.
def kiem_tra_doi_xung(tu):
if len(tu) < 2:
return True # điều kiện dừng
if tu[0] != tu[-1]:
return False
return kiem_tra_doi_xung(tu[1:-1]) # tự gọi với phần ở giữa
print(kiem_tra_doi_xung("152")) # FalseHàm Lambda
Lambda là một hàm ngắn gọn, không cần đặt tên bằng def, chỉ chứa một biểu thức duy nhất:
kiem_tra_chan = lambda so: so % 2 == 0
print(kiem_tra_chan(5)) # False13. Package và pip
Package là cách tổ chức nhiều file Python lại với nhau cho gọn — như một thư mục chứa code. Bạn không cần tự viết mọi thứ; có vô số package người khác viết sẵn để dùng lại.
pip là công cụ tải và cài package từ internet — như một "cửa hàng ứng dụng" cho Python:
pip install pandasTrong Claude Code: khi Claude báo thiếu một thư viện rồi xin chạy
pip install ..., đa số là việc bình thường — nó chỉ tải công cụ còn thiếu. (Chi tiết khi nào nên hỏi lại ở Phần B.)
14. Module random
random là một công cụ có sẵn của Python để tạo số ngẫu nhiên. Chỉ cần import random ở đầu là dùng được:
import random
print(random.randint(1, 10)) # số nguyên ngẫu nhiên 1–10
print(random.random()) # số thực ngẫu nhiên 0–1
print(random.choice([1, 2, 3, 4, 5])) # chọn ngẫu nhiên một phần tử15. Tệp & thao tác với tệp
Tệp là nơi lưu thông tin trên máy. Làm việc với tệp: mở bằng open(), làm xong thì đóng. Vài chế độ mở hay gặp: đọc ("r"), ghi đè ("w"), ghi nối thêm vào cuối ("a").
Cách tốt nhất là dùng with — nó tự đóng tệp giúp bạn khi xong:
with open("duong_dan/ten_tep.txt", "a", encoding="utf-8") as f:
f.write("một dòng mới\n")
# ra khỏi khối with là tệp tự đóng
encoding="utf-8"quan trọng với tiếng Việt — thiếu nó, chữ có dấu dễ bị lỗi font.
16. Class & Object
Class (lớp) là một bản mẫu; Object (đối tượng) là thứ được tạo ra từ bản mẫu đó. Ví dụ: "Nhân viên" là một class (bản mẫu chung), còn mỗi nhân viên thật — với tuổi, lương cụ thể — là một object.
class NhanVien:
def __init__(self, tuoi, luong): # hàm khởi tạo, chạy khi tạo object
self.tuoi = tuoi
self.luong = luong
def hien_thi(self):
print(self.tuoi, self.luong)
nv = NhanVien(29, 3000) # tạo một object
nv.hien_thi() # 29 3000- Hàm bên trong class gọi là phương thức (method); biến bên trong gọi là thuộc tính (attribute).
__init__là phương thức đặc biệt, tự chạy khi object được tạo, dùng để đặt giá trị ban đầu.selflà cách object tự trỏ tới chính nó.
Bạn hiếm khi cần viết class. Nhưng đọc được
class,def,selfgiúp bạn nhận ra "đây là một bản mẫu, kia là một thứ tạo ra từ nó" khi lướt qua code Claude viết.
PHẦN B — Đọc để điều khiển Claude Code
Đây là phần biến nền tảng ở trên thành quyền kiểm soát. Bạn sẽ không viết gì — chỉ đọc và đặt câu hỏi đúng lúc.
17. Đọc một diff Claude xin duyệt
Claude không tự sửa sau lưng bạn — mỗi lần định đổi file, nó cho xem trước: dòng đỏ là thứ bỏ đi, dòng xanh là thứ thêm vào.
def tinh_giam_gia(gia):
- return gia * 0.9
+ return gia * 0.8Đọc: hàm tính giảm giá, Claude bỏ dòng nhân 0.9 (giảm 10%), thay bằng 0.8 (giảm 20%). Bạn không cần biết viết hàm — chỉ cần thấy "nó đang đổi mức giảm giá từ 10% thành 20%." Nếu bạn chỉ nhờ "sửa lỗi chính tả" mà diff lại đụng vào con số giảm giá → cờ đỏ, dừng lại hỏi.
Ba câu để duyệt một diff (không cần biết lập trình):
- Diff có khớp việc bạn nhờ không? Nhờ A mà sửa B là dấu hiệu hiểu sai ý.
- Có con số / chữ quan trọng nào bị đổi không? Giá, email, đường dẫn, tên file — soi kỹ.
- Có dòng nào đổi mức thụt lề không? (xem mục 10)
18. Đọc lỗi đỏ (traceback) — đừng hoảng
Khi có gì gãy, Python phun ra một khối chữ đỏ dài. Nó có một quy luật: thứ quan trọng nhất nằm ở dòng cuối cùng.
Traceback (most recent call last):
File "tai_phu_de.py", line 12, in <module>
mo_file(duong_dan)
FileNotFoundError: khong tim thay file 'video.txt'Bỏ phần giữa, đọc dòng cuối: FileNotFoundError: không tìm thấy file 'video.txt'. Vậy là máy đi tìm file video.txt mà không có — có thể bạn để sai chỗ hoặc gõ sai tên. Bạn vừa tự chẩn đoán một lỗi mà không viết dòng nào.
Vài dòng-cuối hay gặp, dịch sang tiếng người:
| Dòng cuối báo | Nghĩa thật |
|---|---|
FileNotFoundError |
Không tìm thấy file — sai tên hoặc sai chỗ |
ModuleNotFoundError |
Thiếu một thư viện — cần cài (xem mục 19) |
IndentationError |
Thụt lề sai (xem mục 10) |
KeyError / IndexError |
Đòi một thứ không tồn tại trong dữ liệu |
PermissionError |
Máy không cho đụng vào file/thư mục đó |
Khi đưa lỗi cho Claude sửa, dán nguyên dòng cuối thay vì nói "nó lỗi rồi" — Claude sửa trúng hơn hẳn.
19. "Thiếu thư viện", "cài package", "môi trường"
Như đã thấy ở mục 13, Claude hay dùng lại thư viện người khác viết sẵn và cài bằng pip. Khi nó báo ModuleNotFoundError rồi xin chạy pip install ..., đa số là bình thường — bạn gật được.
Một chữ nữa sẽ nghe: "môi trường" (environment / venv). Hiểu nôm na: mỗi dự án có một ngăn tủ riêng chứa thư viện của nó, không lẫn sang dự án khác. Bạn không phải quản lý cái này; chỉ cần biết khi Claude nhắc "môi trường", nó nói về cái ngăn tủ đó, không phải lỗi của bạn.
Khi nào nên hỏi lại thay vì gật? Khi lệnh pip install đi kèm thứ bạn không nhờ — ví dụ đang làm việc nội dung mà nó đòi cài cả chục thư viện lạ. Hỏi "vì sao cần những cái này?" — câu trả lời tốt nghe có lý; mơ hồ là cờ vàng.
20. Vài dấu hiệu nên dừng Claude lại
Không cần đọc được mọi dòng để bắt được những thứ này. Thấy trong diff hoặc code Claude vừa viết, hãy dừng và hỏi:
- Xóa file / thư mục — chỗ nào có
delete,remove,rm,unlinkđụng vào file của bạn. Hỏi nó xóa cái gì, vì sao. - Mật khẩu, khóa, token nằm thẳng trong code — một chuỗi ký tự dài trông như mật khẩu viết thẳng vào file là thói quen xấu và rủi ro. Code an toàn cất những thứ này ở chỗ riêng.
- Gửi dữ liệu đi đâu đó — chữ như
requests.post,upload, một linkhttp...lạ. Hỏi "gửi cái gì, đi đâu?" - Diff đụng vào file bạn không nhờ — nhờ sửa một file mà nó đổi năm file khác.
Không cái nào đòi bạn biết lập trình. Chúng đòi bạn đọc và đặt một câu hỏi đúng lúc — đúng thứ cái nền ở Phần A trang bị cho bạn.
Tóm lại
Bạn vừa đi qua hai lớp. Phần A dựng nền: biến, kiểu dữ liệu, điều kiện, vòng lặp, hàm, class — đủ để nhìn một đoạn Python và hiểu nó đại khái làm gì. Phần B biến cái nền đó thành quyền kiểm soát: soi một diff trước khi gật, dịch một dòng lỗi đỏ sang tiếng người, và biết lúc nào nên dừng Claude lại.
Đó là khác biệt giữa người để Claude tự làm rồi gật đại và người đọc hiểu để kiểm soát Claude. Bạn không cần biết tự viết code — chỉ cần đọc được những gì Claude viết ra. Giờ bạn đọc được rồi.