← Lập trình Python cơ bản

Bài 2 · Cơ bản · 18 phút· Cập nhật 11/06/2026

Làm quen Python & cách nó chạy

Biên soạn bởi Nguyễn Anh Tuấn

REPL, chương trình Python đầu tiên; Python thông dịch (interpreted) ra sao: mã nguồn → bytecode → máy ảo CPython - học Python cho người mới.

Python nổi tiếng gọn và dễ đọc. Chương trình đầu tiên - in ra một dòng chữ - chỉ cần đúng một dòng, không cần khai báo gì thêm:

hello.py

print("Xin chao, Python!")

Kết quả khi chạy

Xin chao, Python!

So với C (cần #include, main(), dấu ;), Python lược bỏ gần hết “thủ tục”. Thêm vài dòng và một chú thích (bắt đầu bằng #):

hoc.py

# Chuong trinh dau tien cua toi
print("Toi dang hoc Python")
print("That thu vi!")

Kết quả khi chạy

Toi dang hoc Python
That thu vi!
  • print(...) in ra màn hình; str đặt trong dấu nháy "..." hoặc '...'.
  • Không cần “;” cuối câu, không cần “{}” - Python dùng xuống dòng & thụt lề.
  • # bắt đầu một chú thích - Python bỏ qua phần sau nó.

REPL: thử nhanh không cần tạo file

python (hoặc python3) trong terminal để vào REPL - môi trường tương tác. Gõ một biểu thức, nó in kết quả ngay: 2 + 35, len("Python")6. Rất hợp để thử ý tưởng.

Chạy file: python hay uv

Chạy một tệp: python hello.py (hoặc python3), hay uv run hello.py nếu dùng uv (khuyên dùng cả khoá). Cách cài Python và chọn bản cài đã ở bài “Cài đặt Python & chọn bản cài”; còn môi trường ảo & quản lý thư viện ở bài “Module, gói & môi trường ảo”.

Nhìn thì như Python “đọc và chạy thẳng” file của bạn. Thực ra có vài chặng. Bấm Tiếp → để đi qua từng chặng, và đổi tab sang C để thấy khác biệt cốt lõi:

Mã nguồn hello.py
print("Xin chao")
Bạn viết - văn bản người đọc được.
★ Khác biệt: Python thêm một lớp máy ảo đọc bytecode - nhờ vậy “viết một lần, chạy mọi nơi có Python”, đổi lại chậm hơn chạy thẳng mã máy.
  • Python KHÔNG chạy thẳng dòng chữ: nó biên dịch sang BYTECODE trước.
  • Máy ảo CPython (vòng lặp viết bằng C) mới là thứ thực thi bytecode.
  • C thì khác: biên dịch thẳng ra mã máy, CPU chạy trực tiếp - không có máy ảo.

Python · CPython · “trình thông dịch”

PythonNGÔN NGỮ - bộ quy tắc cú pháp & ý nghĩa (định trong tài liệu chuẩn). CPythonBẢN CÀI ĐẶT phổ biến nhất của ngôn ngữ đó: một chương trình viết bằng C (vì thế tên CPython) thực sự biên dịch & chạy code của bạn - tải “Python” ở python.org chính là nhận CPython. Người ta hay gọi nó là “trình thông dịch Python”; gọi vậy cũng được, nhưng nhớ CPython biên dịch sang bytecode TRƯỚC rồi máy ảo mới thông dịch bytecode - đúng ra là “trình biên dịch + máy ảo”. Cùng một ngôn ngữ Python còn có bản cài khác: PyPy (có JIT, nhanh hơn), MicroPython (vi điều khiển)… Khoá này dùng CPython, và sẽ luôn gọi đúng tên đó.

Nhiều người gọi Python là ngôn ngữ thông dịch. Chính xác hơn: CPython biên dịch mã nguồn thành bytecode (tập lệnh cho máy ảo), rồi thông dịch bytecode đó. Bytecode được lưu lại trong __pycache__ để lần sau khỏi dịch lại:

sau khi chạy, thư mục có thêm bytecode đã biên dịch

my_project/
├── hello.py
└── __pycache__/
    └── hello.cpython-314.pyc   # bytecode (so 314 = ban CPython 3.14)

Trung thực

.pyc KHÔNG phải mã máy và KHÔNG nhanh hơn khi chạy - nó chỉ giúp bỏ qua bước biên dịch lần sau. Xoá __pycache__ lúc nào cũng được; Python tạo lại. Đừng nhầm “.pyc” với “file chạy được” như C.

Lớp máy ảo ở giữa khiến Python chậm hơn C, nhưng đổi lại nhiều thứ quý:

PythonC
Dịch rabytecode (cho máy ảo)mã máy (cho CPU)
Chạy bởimáy ảo CPythonCPU trực tiếp
Tốc độchậm hơnrất nhanh
Chạy nơi kháccùng file, chỉ cần có Pythonphải biên dịch lại cho mỗi máy
Viếtnhanh, gọn, dễ đọctỉ mỉ, sát phần cứng

Sắp tới

Bài “Bản chất: bytecode & máy ảo CPython” sẽ mổ xẻ chính bytecode đó bằng module dis. Và ở khoá nâng cao, bạn sẽ thấy CPython đang nhanh dần ra sao (trình thông dịch thích ứng, JIT).
  • Thụt lề (indentation) là CÚ PHÁP: sai thụt lề là lỗi, không phải chuyện thẩm mỹ.
  • Phân biệt HOA/thường: Print khác print; True khác true.
  • str phải đóng/mở cùng loại nháy: "..." hoặc '...'.
  • Chạy bằng python hello.py (hoặc python3 trên Mac/Linux) - đúng thư mục chứa file.

Đọc thông báo lỗi

Khi sai, Python in một Traceback chỉ rõ tệp và số dòng. Đừng hoảng - đọc dòng cuối (loại lỗi) và số dòng nó chỉ, sửa, chạy lại. Phần lớn lỗi lúc mới học là thụt lề hoặc thiếu dấu nháy.

Câu hỏi thường gặp

Cả hai một chút. Python KHÔNG chạy thẳng từng dòng chữ: nó BIÊN DỊCH mã nguồn sang bytecode trước, rồi MÁY ẢO CPython mới thực thi bytecode đó. Nên gọi đúng hơn là “biên dịch sang bytecode rồi thông dịch bytecode”. Khác C - C biên dịch thẳng ra mã máy CPU chạy trực tiếp.

Không. Bytecode là tập lệnh GỌN dành cho MÁY ẢO CPython (vd LOAD_NAME, CALL), không phụ thuộc loại CPU. Mã máy mới là lệnh CPU thật hiểu trực tiếp. Vì Python chạy bytecode qua máy ảo nên cùng một .py chạy được trên Windows/Mac/Linux miễn có Python.

Đó là bytecode đã biên dịch, được CPython LƯU LẠI (vd hello.cpython-314.pyc - số là phiên bản Python) để lần sau khỏi biên dịch lại, chạy nhanh hơn một chút. Bạn có thể xoá nó bất cứ lúc nào; Python sẽ tạo lại.

CPython là bản cài Python phổ biến nhất, viết bằng ngôn ngữ C (vì thế tên CPython) - “máy ảo” chính là vòng lặp viết bằng C đó. Còn có PyPy (có JIT, nhanh hơn cho việc nặng), MicroPython (cho vi điều khiển)… nhưng khoá này dùng CPython.

Không. Python KẾT THÚC câu lệnh bằng xuống dòng (không cần “;”) và GOM khối bằng THỤT LỀ (indentation) thay cho “{}”. Thụt lề ở Python là cú pháp bắt buộc, không phải để cho đẹp - sai thụt lề là lỗi.

Vì lớp máy ảo thêm chi phí, nhưng đổi lại: viết nhanh, gọn, dễ đọc, chạy mọi nơi, kho thư viện khổng lồ. Với phần lớn việc (web, dữ liệu, tự động hoá) thời gian LẬP TRÌNH quý hơn vài mili-giây chạy. Phần nặng có thể gọi xuống C. (Khoá nâng cao sẽ học CPython đang nhanh dần ra sao.)

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Khi gõ lệnh chạy một file Python, điều gì thực sự xảy ra bên trong?

  1. 1

    Hello của mèo con

    Viết và chạy một chương trình in ra “Xin chao, <tên mèo con>!”.

    Hoàn thành khi: Một dòng print("Xin chao, Tuan!"); chạy python hello.py ra đúng câu đó.

  2. 2

    Ba dòng

    Viết chương trình in ra 3 dòng chữ bất kỳ, mỗi dòng một câu.

    Hoàn thành khi: 3 lệnh print, kết quả 3 dòng riêng biệt.

  3. 3

    Thử trong REPL

    Mở REPL (gõ python), tính 12 * 12 và đo độ dài str "Python" bằng len(). Kết quả?

    Hoàn thành khi: 144 và 6. REPL in kết quả ngay, không cần print.

  4. 4

    Ba bước bên trong

    Khi gõ python hello.py, Python làm gì trước khi in ra màn hình? Kể theo thứ tự.

    Hoàn thành khi: Biên dịch nguồn → bytecode (lưu .pyc) → máy ảo CPython thực thi bytecode → in kết quả.

  5. 5

    Xoá __pycache__

    Chạy một chương trình, tìm thư mục __pycache__, xoá nó rồi chạy lại. Có sao không?

    Hoàn thành khi: Không sao - Python biên dịch lại và tạo .pyc mới. .pyc chỉ là bộ nhớ đệm.

  6. 6

    Python vs C

    Bằng lời: vì sao một file .py chạy được trên cả Windows và Mac mà không cần sửa, còn file .c thì phải biên dịch lại?

    Hoàn thành khi: Python chạy bytecode qua MÁY ẢO (có sẵn trên mỗi máy); C biên dịch thẳng ra mã máy gắn với một loại CPU/OS.