Bài trước: Python thực hành (2) - Chương trình Python đầu tiên
Như đã đề cập, Python là ngôn ngữ thông dịch (interpreted language).
Để hiểu rõ hơn, các bạn có thể hình dung thế này: khi chúng ta viết một đoạn văn bằng tiếng Việt, chúng ta có thể đọc và hiểu ngay lập tức. Nhưng máy tính thì không, nó chỉ hiểu được ngôn ngữ riêng của nó (gọi là mã máy). Trong lập trình cũng vậy, máy tính không thể đọc và hiểu được mã nguồn viết bằng ngôn ngữ lập trình Python.
Để máy tính có thể hiểu được đoạn mã nguồn Python, phải có một công đoạn là dịch mã nguồn sang mã máy.
Có 2 cách để dịch mã nguồn sang mã máy là [1] biên dịch và [2] thông dịch.
- Biên dịch: một số ngôn ngữ lập trình (như C++) cần phải dịch toàn bộ đoạn mã sang mã máy trước khi chạy. Quá trình này gọi là "biên dịch".
- Thông dịch: Python thì khác, nó sử dụng "thông dịch". Nghĩa là, Python sẽ đọc và dịch từng dòng mã nguồn sang mã máy, rồi thực hiện ngay dòng đó, sau đó mới đến dòng tiếp theo.
Ví dụ minh họa về thông dịch
Giả sử chúng ta có một chương trình Python đơn giản như sau:
print("Xin chào!")
a = 5
b = 3
print(a + b)
Khi chạy chương trình này, Python sẽ làm như sau:
- Đọc dòng đầu tiên: print("Xin chào!")
- Dịch dòng này sang mã máy và thực hiện, in ra màn hình dòng chữ "Xin chào!".
- Đọc dòng thứ hai: a = 5
- Dịch và thực hiện, gán giá trị 5 cho biến a.
- Đọc dòng thứ ba: b = 3
- Dịch và thực hiện, gán giá trị 3 cho biến b.
- Đọc dòng thứ tư: print(a + b)
- Dịch và thực hiện, tính tổng a + b (5 + 3 = 8) và in kết quả 8 ra màn hình.
Ưu điểm của chạy thông dịch
- Dễ học và dễ sử dụng: vì Python chạy từng dòng một, nên chúng ta có thể dễ dàng kiểm tra và sửa lỗi.
- Chạy được trên nhiều hệ điều hành: Python có thể chạy trên Windows, macOS, Linux
Nhược điểm
- Chạy chậm hơn so với ngôn ngữ biên dịch: vì phải dịch từng dòng một, nên Python thường chạy chậm hơn so với các ngôn ngữ đã được biên dịch sẵn.
3.2 Thực hành với trình thông dịch Python
Chúng ta cùng thực hành với trình thông dịch của Python theo 2 cách: [1] viết lệnh trực tiếp và [2] viết lệnh vào một tập tin.
[1] Viết lệnh trực tiếp
- Mở cửa sổ dòng lệnh (CMD)
- Gõ lệnh py hoặc python (tùy phiên bản Python) > Enter
C:\Users\Teo>py
Python 3.13.2 (tags/v3.13.2:4f8bb39, Feb 4 2025, 15:23:48) [MSC v.1942 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
Dấu nhắc >>>, cho biết bạn đang ở trong chế độ làm việc trực tiếp với trình thông dịch của Python. Ở chế độ này, bạn có thể nhập trực tiếp từng dòng mã Python và nhấn Enter để thực thi. Kết quả sẽ được hiển thị ngay lập tức.
Ví dụ 1:
>>> 5 + 3
8
Ví dụ 2:
>>> print("hi ban Teo")
hi ban Teo
Ví dụ 3:
>>> diem = 6
>>> print(diem * 2)
12
Gõ Exit > Enter để thoát khỏi môi trường thông dịch của Python.
Ưu điểm của chế độ ra lệnh trực tiếp:
- Thích hợp để thử nghiệm các đoạn mã ngắn, kiểm tra cú pháp hoặc gỡ lỗi nhanh.
- Phản hồi ngay lập tức, giúp bạn hiểu rõ hơn về cách mã Python hoạt động.
Nhược điểm:
- Không phù hợp để viết các chương trình lớn và phức tạp.
- Mã nguồn không được lưu lại, bạn phải gõ lại mỗi khi mở lại cửa sổ dòng lệnh.
[2] Viết lệnh vào một tập tin
Cách thực hiện:
- Mở Notepad, tạo một tập tin văn bản với đuôi .py (ví dụ: teo_program.py).
- Viết mã Python vào tập tin đó.
[teo_program.py]
name = input("Nhap ten cua ban: ")
age = int(input("Nhap tuoi cua ban: "))
print(f"Chao, {name}! Ban {age} tuoi.")
- Mở cửa sổ dòng lệnh (CMD), điều hướng đến thư mục chứa tập tin teo_program.py (ví dụ thư mục: pythonLabs).
- Gõ py teo_program.py (hoặc python teo_program.py) và nhấn Enter.
- Mã Python trong tập tin sẽ được thực thi, và kết quả sẽ được hiển thị trên cửa sổ dòng lệnh.
Ví dụ: thực thi trên cửa sổ dòng lệnh
C:\Users\Teo>e:
E:\>cd pythonlabs
Nhap ten cua ban: Ti
Nhap tuoi cua ban: 13
Chao, Ti! Ban 13 tuoi.
Ưu điểm của cách viết mã vào tập tin:
- Phù hợp để viết các chương trình lớn và phức tạp.
- Mã được lưu lại, bạn có thể chạy lại nhiều lần mà không cần gõ lại.
- Dễ dàng chia sẻ và quản lý mã nguồn.
Nhược điểm:
- Cần tạo tập tin trước khi thực thi.
- Không phản hồi ngay lập tức như cách ra lệnh trực tiếp.
3.3 Thụt lề
Thụt lề (indentation)
Trong Python, thụt lề là cách sử dụng khoảng trắng (spaces) hoặc tab ở đầu dòng mã để định nghĩa khối mã (code block), tức là các đoạn mã thuộc cùng một cấu trúc logic (như vòng lặp, hàm, điều kiện).
Tại sao thụt lề lại quan trọng trong Python?
- Tính rõ ràng và dễ đọc: thụt lề giúp mã Python trở nên rõ ràng và dễ đọc hơn. Nó giúp người lập trình dễ dàng nhận biết các khối mã và cấu trúc của chương trình.
- Thay thế cho dấu ngoặc nhọn: trong các ngôn ngữ lập trình khác như C++, Java, dấu ngoặc nhọn {} được sử dụng để xác định các khối mã. Python sử dụng thụt lề để thay thế cho dấu ngoặc nhọn.
- Bắt buộc trong cú pháp: thụt lề không chỉ là một quy ước trong Python mà còn là một phần bắt buộc của cú pháp. Nếu bạn không thụt lề đúng cách, trình thông dịch Python sẽ báo lỗi.
Quy tắc thụt lề:
- Số lượng khoảng trắng: thông thường, chúng ta sử dụng 4 dấu cách cho mỗi cấp độ thụt lề. Tuy nhiên, bạn có thể sử dụng bất kỳ số lượng khoảng trắng nào, miễn là nhất quán trong cùng một khối mã.
- Nhất quán: bạn phải sử dụng cùng một số lượng khoảng trắng cho tất cả các dòng mã trong cùng một khối.
- Tab hoặc dấu cách: bạn nên chọn một trong hai (tab hoặc dấu cách) và sử dụng nhất quán trong toàn bộ chương trình.
Ví dụ minh họa:
if a > 0:
print("a là số dương") # Thụt lề 4 dấu cách
b = a * 2 # Thụt lề 4 dấu cách
else:
print("a là số âm hoặc bằng 0") # Thụt lề 4 dấu cách
b = -a # Thụt lề 4 dấu cách
print(i) # Thụt lề 4 dấu cách
def my_function():
print("Xin chào!") # Thụt lề 4 dấu cách
Lỗi thụt lề thường gặp:
- IndentationError: lỗi này xảy ra khi bạn thụt lề không đúng cách.
- TabError: Lỗi này xảy ra khi bạn sử dụng cả tab và dấu cách trong cùng một khối mã.
Kinh nghiệm hữu ích:
- Sử dụng trình soạn thảo mã nguồn hoặc IDE hỗ trợ thụt lề tự động.
- Luôn nhất quán trong việc sử dụng dấu cách hoặc tab.
- Kiểm tra kỹ thụt lề khi gặp lỗi trong chương trình.
3.4 Chú thích
Chú thích (comment) là các dòng văn bản trong mã nguồn dùng để giải thích, mô tả hoặc ghi chú, nhưng không được Python thực thi. Chúng giúp lập trình viên hiểu rõ ý nghĩa của mã nguồn, đặc biệt khi làm việc nhóm hoặc xem lại mã nguồn sau thời gian dài. Chú thích bắt đầu bằng ký tự # và có thể đặt ở đầu dòng hoặc cuối dòng.
Vai trò của chú thích:
- Giải thích mã nguồn: làm rõ mục đích của từng đoạn mã.
- Giúp hiểu mã nguồn nhanh: giúp người khác (hoặc chính bạn) hiểu mã nguồn nhanh hơn. Đặc biệt là các đoạn mã xử lý phức tạp.
- Tắt mã nguồn tạm thời: dùng để vô hiệu hóa dòng mã mà bạn không cần phải xóa nó.
Quy tắc sử dụng chú thích:
- Dùng # cho chú thích một dòng.
- Python không có cú pháp chính thức cho chú thích nhiều dòng, nhưng bạn có thể dùng # trên từng dòng hoặc chuỗi nhiều dòng (""" hoặc ''').
Ví dụ minh họa
Ví dụ 1: chú thích một dòng
# In lời chào ra màn hình
print("Xin chào!") # Đây là dòng đầu ra
Ví dụ 2: chú thích nhiều dòng
# Tính tổng 2 số
# Nhập dữ liệu từ người dùng
a = int(input("Nhập số thứ nhất: "))
b = int(input("Nhập số thứ hai: "))
print(a + b) # In kết quả tổng
Ví dụ 3: tắt mã nguồn tạm thời
x = 10
# x = x + 5 # Tạm thời không tăng x
print(x)
Ví dụ 4: dùng chuỗi nhiều dòng (không phải chú thích thực sự, mà là docstring)
def cong(a, b):
"""Hàm tính tổng hai số""" # Docstring
return a + b
print(cong(2, 3))
Kinh nghiệm hữu ích
- Viết chú thích ngắn gọn, đủ nghĩa, tránh dư thừa.
- Dùng chú thích để giải thích "tại sao" hơn là "cái gì".
3.5 Bài tập
Bài tập 3.1 Truy cập vào trang python.org, vào mục Documentation để tìm hiểu về các tài nguyên bạn có thể sử dụng để học về Python. Mục đích để bạn làm quen với việc đọc tài liệu từ trang gốc của một chủ đề bạn đang tìm hiểu.
Bài tập 3.2 Sử dụng chức năng help trong chế độ nhập lệnh trực tiếp (tương tác trực tiếp) với trình thông dịch python. Ví dụ, bạn muốn tìm hiểu về hàm print. Bạn nhập lệnh sau để đọc phần mô tả về hàm print.
>>> help('print')
Ví dụ kết quả:
Help on built-in function print in module builtins:
Prints the values to a stream, or to sys.stdout by default.
end string appended after the last value, default a newline.
file a file-like object (stream); defaults to the current sys.stdout.
flush whether to forcibly flush the stream.
Bài tập 3.3 Viết và chạy các đoạn mã trong bài học bằng cách nhập lệnh trực tiếp.
Bài tập 3.4 Viết và chạy các đoạn mã trong bài học bằng cách nhập vào một tập tin.
Câu 3.5 Nói về thông dịch và biên dịch, phát biểu nào sau đây không đúng?
A. C++ là một ví dụ về ngôn ngữ lập trình thông dịch.
B. Biên dịch là quá trình dịch toàn bộ đoạn mã sang mã máy trước khi chạy.
C. Thông dịch là quá trình đọc và dịch từng dòng mã nguồn sang mã máy, rồi thực hiện ngay dòng đó.
D. Python là một ví dụ về ngôn ngữ lập trình thông dịch.
Câu 3.6 Nói về chú thích (comment) trong Python, phát biểu nào sau đây không đúng?
A. Chú thích là các dòng văn bản trong mã nguồn dùng để giải thích hoặc mô tả, nhưng không được Python thực thi.
B. Chú thích giúp lập trình viên hiểu rõ ý nghĩa của mã nguồn, đặc biệt khi làm việc nhóm hoặc xem lại mã nguồn sau thời gian dài.
C. Python không có cú pháp chính thức cho chú thích nhiều dòng, nhưng có thể dùng # trên từng dòng hoặc chuỗi nhiều dòng (""" hoặc ''').
D. Chú thích bắt đầu bằng ký tự $ và có thể đặt ở đầu dòng hoặc cuối dòng.
Câu 3.7 Nói về thụt lề (indentation) trong Python, phát biểu nào sau đây không đúng?
A. Thụt lề giúp mã Python trở nên rõ ràng và dễ đọc hơn.
B. Thụt lề là một quy ước trong Python nhưng không bắt buộc trong cú pháp.
C. Python sử dụng thụt lề để thay thế cho dấu ngoặc nhọn trong các ngôn ngữ lập trình khác.
D. Nên chọn một trong hai (tab hoặc dấu cách) và sử dụng nhất quán trong toàn bộ chương trình.
-----
Cập nhật: 20/3/2025
-----
Bài sau: Python thực hành (4) - Gỡ lỗi chương trình
-----
Bài tiếp (theo lộ trình học tiếng Anh + Lập trình): Python căn bản (2): Python Syntax
-----