Contents
- 1 Lập trình Python cơ bản từ A đến Z cho người mới bắt đầu
- 1.1 Cài đặt Python 3
- 1.2 Chương trình Python đầu tiên
- 1.3 Python hoạt động như thế nào?
- 1.4 Học Python mất bao lâu?
- 1.5 Biến và kiểu dữ liệu cơ bản
- 1.6 Nhập dữ liệu từ người dùng
- 1.7 Chuyển đổi kiểu dữ liệu
- 1.8 Chuỗi (String) và cách xử lý chuỗi
- 1.9 Các phép toán cơ bản trong Python
- 1.10 Câu lệnh điều kiện (if…else)
- 1.11 Vòng lặp (Loops)
- 1.12 Cấu trúc dữ liệu danh sách (List)
- 1.13 Tuple (Bộ giá trị cố định)
- 1.14 Từ điển (Dictionary)
- 1.15 Hàm (Function)
- 1.16 Xử lý ngoại lệ (Exceptions)
- 1.17 Chú thích (Comment) trong code
- 1.18 Lập trình hướng đối tượng (OOP) trong Python
- 1.19 Module và Package trong Python
- 1.20 Tạo giá trị ngẫu nhiên (Random) trong Python
- 1.21 Làm việc với tập tin và thư mục
- 1.22 Dự án 1: Tự động hóa – Quét và phân loại files trong thư mục
- 1.23 Pypi và pip: Quản lý thư viện Python
- 1.24 Dự án 2: Học máy với Python
- 1.25 Dự án 3: Xây dựng website với Django
- 1.26 Kết luận
Lập trình Python cơ bản từ A đến Z cho người mới bắt đầu
Python hiện là một trong những ngôn ngữ lập trình phổ biến nhất thế giới. Xin chào các bạn! Chào mừng bạn đến với hướng dẫn lập trình Python cơ bản từ A đến Z, đặc biệt dành cho những ai đang muốn học Python từ đầu. Tính đến năm 2025, Python vẫn đứng đầu danh sách các ngôn ngữ lập trình được ưa chuộng nhất. Python nổi tiếng vì dễ học, dễ sử dụng và cực kỳ linh hoạt – nó được ứng dụng rộng rãi trong nhiều lĩnh vực, từ phát triển web, phân tích dữ liệu, trí tuệ nhân tạo cho đến tự động hóa tác vụ hàng ngày.
Trong bài viết này, chúng ta sẽ đi qua toàn bộ những kiến thức nền tảng của Python (một Python tutorial toàn diện bằng tiếng Việt) – từ cách cài đặt, viết chương trình đầu tiên, các khái niệm cơ bản như biến, kiểu dữ liệu, vòng lặp, hàm, cho đến lập trình hướng đối tượng, và kết thúc bằng một vài dự án thực tế. Bạn sẽ được hướng dẫn một cách thân thiện, từng bước một, giống như bạn đang được cầm tay chỉ việc. Hãy cùng bắt đầu hành trình lập trình Python cơ bản của chúng ta nhé!
Cài đặt Python 3
Để bắt đầu, bạn cần cài đặt Python 3 trên máy tính của mình. Hãy truy cập trang chủ chính thức của Python tại python.org và tải về phiên bản Python 3 mới nhất phù hợp với hệ điều hành của bạn (Windows, macOS hoặc Linux). Trình cài đặt Python rất trực quan; trên Windows, nhớ đánh dấu tùy chọn “Add Python to PATH” trước khi nhấn “Install”. Tùy chọn này sẽ tự động cấu hình để bạn có thể gọi lệnh python từ bất kỳ thư mục nào trong Command Prompt hoặc Terminal.
Bạn có thể tạo môi trường cho việc học Python bằng cách setup Python trên Windows 11 của bạn, sau đó học theo những hướng dẫn tiếp theo của bài viết này.
Cách cài python trong Windows 11 nhanh nhất là sử dụng winget:
Mở PowerShell ( với quyền Administrator).
Chạy lệnh:
Kiểm tra cài đặt:
→ Kết quả ví dụ: Python 3.12.10
Nếu không có
winget, có thể cài từ python.org hoặc Microsoft Store.
Sau khi cài đặt python hoàn tất, bạn có thể kiểm tra nhanh bằng cách mở terminal (hoặc Command Prompt) và chạy lệnh python --version để xem Python đã được cài đặt thành công chưa, thường thì trong môi trường các bản phân phối Linux hiện đại ví dụ như Centos 9, Python 3 luôn được cài đặt sẵn, chúng ta có thể sử dụng được ngay. Bây giờ, chúng ta đã sẵn sàng để viết chương trình Python đầu tiên!

Chương trình Python đầu tiên
Sau khi cài đặt, hãy mở ứng dụng Python IDLE nếu bạn trong môi trường windows (hoặc bất kỳ môi trường soạn thảo code nào bạn thích) để bắt đầu viết code. Chúng ta cùng thử viết một chương trình Python đơn giản nhất – in ra câu chào kinh điển “Hello, World!” trên màn hình. Nhập đoạn code sau vào IDLE hoặc một file .py mới, hoặc nếu bạn đang trong môi trường Linux, hãy chạy lệnh “python” để vào trình thông dịch tương tác (interactive interpreter) của Python (Đối với hệ điều hành Linux Ubuntu bạn hãy chạy lệnh: “python3” để vào console của python cho việc học python):
Dòng lệnh trên sẽ hiển thị dòng chữ Hello, World! khi chương trình chạy. Để chạy chương trình trong IDLE, bạn có thể nhấn F5 hoặc chọn Run > Run Module. Kết quả sẽ hiện ra trong cửa sổ console (hoặc terminal): chương trình của bạn in ra dòng Hello, World!. Xin chúc mừng, bạn đã chạy thành công chương trình Python đầu tiên của mình!

Python hoạt động như thế nào?
Python là một ngôn ngữ thông dịch (interpreted), có nghĩa là code của bạn sẽ được thực thi tuần tự từng dòng từ trên xuống dưới thay vì biên dịch toàn bộ trước rồi mới chạy. Khi bạn chạy chương trình, trình thông dịch Python sẽ đọc từng dòng code, dịch nó sang ngôn ngữ máy và thực thi ngay lập tức. Điều này giúp việc thử nghiệm và phát triển với Python rất linh hoạt, vì bạn có thể chạy nhanh từng đoạn code nhỏ.
Nếu có lỗi xảy ra trong code, Python sẽ dừng thực thi và báo lỗi (kèm thông tin dòng lỗi) ngay tại thời điểm gặp lỗi, giúp bạn dễ dàng xác định và sửa lỗi. Bạn sẽ dần quen với các thông báo lỗi của Python; chúng thường khá rõ ràng về nguyên nhân lỗi (ví dụ: NameError khi gọi một biến chưa được định nghĩa, SyntaxError khi sai cú pháp, v.v.). Đừng sợ lỗi – coi chúng như những “trợ thủ” thông báo cho bạn biết chỗ nào cần sửa mà thôi!
Học Python mất bao lâu?
Điều này phụ thuộc vào tốc độ học và mức độ đầu tư thời gian của bạn. Nếu bạn là 1 người hoàn toàn mới chưa code bao giờ, hãy yên tâm – Python được thiết kế để dễ cho người học. Nhiều người học với cường độ khoảng 1-2 giờ mỗi ngày thì nắm vững được các kiến thức cơ bản sau khoảng 1-2 tháng. Tất nhiên, đây chỉ là con số ước tính; quan trọng nhất vẫn là sự chăm chỉ thực hành. Mỗi người học một tốc độ khác nhau, nhưng nếu bạn viết code thường xuyên, bạn sẽ tiến bộ nhanh chóng.
Hãy nhớ: lập trình cũng như mọi kỹ năng khác, “trăm hay không bằng tay quen”. Bạn nên áp dụng ngay những gì học được vào các bài tập hoặc dự án nhỏ. Qua từng bước thử nghiệm và sửa lỗi, bạn sẽ hiểu sâu hơn về Python. Vì vậy, đừng lo lắng nếu ban đầu có chút khó khăn – chúng ta sẽ cùng nhau đi từng bước từ cơ bản đến nâng cao. Bây giờ, hãy bắt đầu khám phá thế giới Python!
Mẹo: Bạn có thể tham khảo các cheat sheet Python (bảng tóm tắt cú pháp) có sẵn trên mạng để tra cứu nhanh các cú pháp và hàm cơ bản khi mới học. Những bảng này liệt kê ngắn gọn các lệnh, hàm phổ biến của Python, giúp bạn đỡ quên khi cần dùng. Hãy sử dụng cheat sheet như tài liệu hỗ trợ, còn việc chính vẫn là hiểu cách viết và vận dụng Python code.
Biến và kiểu dữ liệu cơ bản
Biến (variable) là khái niệm nền tảng trong lập trình. Bạn có thể hình dung biến như một nhãn dán gán vào một giá trị nào đó trong bộ nhớ để tiện sử dụng. Trong Python, việc tạo biến rất đơn giản – bạn chỉ cần đặt tên biến và gán giá trị cho nó bằng dấu =.
Ở đây, chúng ta tạo biến x và gán cho nó giá trị số nguyên là 10, tạo biến y gán giá trị là chuỗi "Hello". Python là ngôn ngữ định kiểu động, có nghĩa là bạn không cần khai báo kiểu dữ liệu của biến trước. Trình thông dịch sẽ tự xác định kiểu dựa trên giá trị được gán. Điều này cho phép bạn gán cho một biến bất kỳ kiểu dữ liệu nào rồi sau đó có thể gán lại giá trị kiểu khác cho cùng biến đó mà không gây lỗi.
Python hỗ trợ các kiểu dữ liệu cơ bản như sau:
-
Số nguyên (
int) – ví dụ:0,10,-5. -
Số thực (dấu phẩy động) (
float) – ví dụ:3.14,-0.001. -
Chuỗi ký tự (
str) – ví dụ:"Hello",'Python 2025'. -
Giá trị Boolean (
bool) – chỉ có hai giá trịTrue(Đúng) hoặcFalse(Sai), thường dùng cho biểu thức điều kiện.
Bạn có thể sử dụng hàm tích hợp type() để kiểm tra kiểu dữ liệu của một biến, ví dụ type(x) sẽ trả về <class 'int'> nếu x là số nguyên.
Nhập dữ liệu từ người dùng
Lập trình tương tác thường cần nhận thông tin từ người dùng. Python cung cấp hàm input() để đọc dữ liệu người dùng nhập từ bàn phím. Hàm này tạm dừng chương trình cho đến khi người dùng gõ một dòng và nhấn Enter, và trả về nội dung vừa nhập dạng chuỗi. Bạn có thể truyền vào input() một chuỗi prompt để yêu cầu người dùng nhập thông tin.
Ví dụ:
Khi chạy đoạn code trên, chương trình sẽ hiển thị dòng nhắc “What is your name? ” và chờ người dùng nhập tên. Sau khi nhấn Enter, biến name sẽ chứa chuỗi người dùng vừa nhập, và lệnh print sẽ in ra lời chào kèm tên đó. Nếu bạn nhập Alice, chương trình sẽ in ra Hello, Alice.

Lưu ý: Kết quả trả về từ input() luôn là chuỗi. Điều này quan trọng khi bạn nhập dữ liệu số – vì "100" (chuỗi) khác với 100 (số). Hãy xem phần tiếp theo để biết cách xử lý tình huống này.
Chuyển đổi kiểu dữ liệu
Giả sử chúng ta muốn nhập một con số từ người dùng rồi tính toán với nó. Như đề cập ở trên, hàm input() sẽ trả về kiểu string. Nếu bạn cố gắng cộng chuỗi với số, Python sẽ báo lỗi. Do đó, chúng ta cần chuyển đổi kiểu dữ liệu chuỗi sang kiểu số tương ứng (int hoặc float) trước khi tính toán.
Python cung cấp các hàm chuyển kiểu tích hợp như int(), float(), str(), v.v. để chuyển giữa các kiểu. Ví dụ, dùng int() để chuyển chuỗi thành số nguyên, float() để chuyển thành số thực.
Xem ví dụ sau:
Ở đây, chúng ta bọc lời gọi input() trong hàm int(). Điều này sẽ chuyển chuỗi người dùng nhập (ví dụ "30") thành số nguyên 30 trước khi gán cho biến age. Nhờ đó, biểu thức age + 5 thực hiện được phép cộng số học (thay vì phép nối chuỗi). Nếu bạn nhập tuổi là 30, chương trình sẽ in ra 35.

Tương tự, bạn có thể dùng float() cho số thực. Ví dụ: height = float(input("Enter your height: ")) sẽ chuyển giá trị nhập vào thành kiểu float. Còn str() dùng để chuyển số thành chuỗi khi cần nối vào chuỗi khác.
Chuỗi (String) và cách xử lý chuỗi
Chuỗi ký tự (hay string) là kiểu dữ liệu đại diện cho văn bản. Trong Python, chuỗi được tạo bằng cách đặt các ký tự trong cặp dấu nháy đơn '...' hoặc nháy kép "...". Bạn có thể dùng dấu nháy đơn bên trong chuỗi nháy kép và ngược lại nếu cần chứa dấu nháy trong nội dung.
Ví dụ:
Biến message ở trên chứa chuỗi "Hello, World!". Mỗi ký tự trong chuỗi đều có một chỉ số (index) vị trí, bắt đầu từ 0. Python cho phép truy cập ký tự bằng cú pháp chuỗi[chỉ_số].
Trong ví dụ trên, message[0] là ký tự 'H' ( là vị trí 0 của chuỗi "Hello, World!"), còn message[7] là 'W' (là vị trí 7, tính từ 0). Nếu bạn dùng chỉ số âm, ví dụ message[-1], Python sẽ truy xuất ngược từ cuối chuỗi, nên message[-1] là '!' (ký tự cuối). Cần lưu ý truy cập index ngoài phạm vi (quá ngắn hoặc quá dài) sẽ gây lỗi IndexError.

Chuỗi định dạng (Formatted String)
Khi cần tạo chuỗi có chứa giá trị của biến (thay vì phải nối nhiều phần chuỗi với nhau), Python cung cấp một cú pháp rất tiện lợi gọi là f-string (formatted string).
Bạn tạo một f-string bằng cách thêm tiền tố f trước dấu nháy mở chuỗi, và đặt tên biến hoặc biểu thức trong cặp {} bên trong chuỗi. Khi chạy, Python sẽ thay thế mỗi {} bằng giá trị tương ứng của biến.
Ví dụ:
Ở đây, chuỗi f"Hello, {name}" sẽ được định dạng thành "Hello, John" vì Python chèn giá trị của biến name (là "John") vào vị trí {name}. Bạn có thể đặt cả một biểu thức vào trong {}, VD {2+3} sẽ thành kết quả là 5. F-string giúp code gọn gàng và dễ đọc hơn nhiều so với phép cộng chuỗi thông thường.

Các phương thức xử lý chuỗi thông dụng
Python trang bị nhiều hàm xử lý chuỗi tích hợp (gọi là phương thức của đối tượng chuỗi) giúp thao tác và biến đổi chuỗi dễ dàng hơn. Dưới đây là một vài phương thức phổ biến:
-
s.upper()– Trả về chuỗisviết hoa toàn bộ. -
s.lower()– Trả về chuỗisviết thường toàn bộ. -
s.find(sub)– Tìm vị trí đầu tiên của chuỗi consubtrongs. Kết quả là chỉ số (số nguyên) hoặc-1nếu không tìm thấy. -
s.replace(old, new)– Trả về chuỗi mới từ chuỗisbằng cách thay thế tất cả các đoạnoldthànhnew.
Ví dụ minh họa các phương thức trên:
Trong ví dụ này: s.upper() chuyển "hello" thành toàn bộ chữ hoa là "HELLO"; s.find('e') trả về 1 vì ký tự 'e' xuất hiện đầu tiên ở vị trí 1 (tính từ 0); còn s.replace("he", "hi") sẽ thay đoạn "he" bằng "hi", biến "hello" thành "hillo".
Ngoài ra, còn rất nhiều phương thức hữu dụng khác như strip() (loại bỏ khoảng trắng đầu/cuối chuỗi), split() (tách chuỗi thành list các phần),… Bạn có thể tham khảo tài liệu Python để biết thêm.

Các phép toán cơ bản trong Python
Python hỗ trợ đầy đủ các toán tử số học như: cộng (+), trừ (-), nhân (*), chia (/), lũy thừa (**), chia lấy phần nguyên (//) và chia lấy dư (%). Chúng hoạt động tương tự như trong toán học và hầu hết các ngôn ngữ lập trình khác.
Ví dụ một vài phép toán:
Lưu ý: phép chia / trong Python luôn luôn trả về kiểu số thực (float) ngay cả khi chia hết. Trong ví dụ trên, 10 / 2 sẽ cho 5.0 chứ không phải 5. Nếu bạn muốn lấy phần nguyên của phép chia, hãy dùng // như minh họa (10 // 3 == 3). Toán tử ** dùng để tính lũy thừa (ở đây 2**3 nghĩa là 2 mũ 3 bằng 8).
Bên cạnh các toán tử, Python còn có nhiều hàm toán học tích hợp và module hỗ trợ tính toán. VD, hàm tích hợp abs(x) trả về giá trị tuyệt đối của số x:
Để tính toán những thứ phức tạp hơn (như căn bậc hai, lượng giác, logarit), chúng ta có thể dùng module math của Python. Ví dụ, dùng math.sqrt() để tính căn bậc hai:
Ở đây, chúng ta import module math rồi gọi hàm math.sqrt(16) để lấy căn bậc hai của 16. Module math có rất nhiều hàm hữu ích như sin, cos, log,… Khi cần dùng đến, bạn chỉ việc import math và gọi các hàm bên trong nó.

Câu lệnh điều kiện (if…else)
Lập trình không chỉ có tính toán tuần tự, mà thường phải ra quyết định dựa trên một điều kiện nào đó. Trong Python, cấu trúc if – elif – else cho phép bạn rẽ nhánh chương trình theo điều kiện cho trước.
Cú pháp cơ bản:
Chương trình sẽ kiểm tra lần lượt các điều kiện từ trên xuống. Nếu gặp điều kiện nào đúng (True), nó thực thi khối lệnh tương ứng và bỏ qua các khối còn lại. Nếu không có điều kiện nào đúng, khối else (nếu có) sẽ được thực hiện.
Ví dụ đơn giản:
Đoạn code trên kiểm tra biến age. Nếu age >= 18 (tức tuổi >= 18) thì in ra “You are an adult”, ngược lại (tuổi < 18) thì in “You are a minor”. Trong trường hợp age = 20 như trên, điều kiện age >= 18 là True nên chương trình sẽ in “You are an adult”. Nếu bạn thử với age = 15, kết quả sẽ là “You are a minor”.

Bạn có thể mở rộng thêm nhiều nhánh bằng cách sử dụng elif. Ví dụ:
temperature = 0
Trong ví dụ trên, tùy giá trị của temperature mà chương trình sẽ chọn in ra thông báo phù hợp.

Toán tử so sánh và logic trong biểu thức điều kiện
Biểu thức điều kiện thường bao gồm các phép so sánh và có thể kết hợp với toán tử logic để tạo điều kiện phức tạp hơn.
Các toán tử so sánh trong Python bao gồm:
-
==: bằng nhau. -
!=: khác nhau. -
>: lớn hơn. -
<: nhỏ hơn. -
>=: lớn hơn hoặc bằng. -
<=: nhỏ hơn hoặc bằng.
Ví dụ:
Ta thấy 5 > 10 trả về False, 5 == 10 cũng False, còn 5 != 10 là True. Các phép so sánh này cho kết quả kiểu bool (True/False) để phục vụ cho cấu trúc của lệnh if.

Các toán tử logic cho phép kết hợp nhiều điều kiện:
-
and– True nếu cả hai điều kiện đều là True. -
or– True nếu ít nhất một trong các điều kiện là True. -
not– đảo ngược giá trị True/False của điều kiện (True thành False và ngược lại).
Ví dụ sử dụng toán tử logic:
Điều kiện trong mệnh đề if trên gồm hai phần: temperature > 20 và temperature < 40. Toàn bộ điều kiện chỉ True khi cả hai phần đều là True, tức là nhiệt độ trong khoảng (20, 40). Nếu temperature = 30 thì in “Thời tiết đẹp”, còn nếu temperature = 45 (một phần điều kiện False) thì khối lệnh sẽ bị bỏ qua.
Tương tự, bạn có thể dùng or khi chỉ cần một trong các điều kiện đúng để thực thi, hoặc not để phủ định một điều kiện (ví dụ: if not started: nghĩa là “nếu không started”).

Ví dụ: Chương trình chuyển đổi đơn vị cân nặng
Để minh họa kết hợp input, chuyển kiểu dữ liệu và cấu trúc if-else, chúng ta cùng viết một chương trình nhỏ chuyển đổi trọng lượng giữa pound (lbs) và kilogram (kg).
Chương trình trên yêu cầu người dùng nhập cân nặng và đơn vị (Lbs hoặc Kg). Chúng ta dùng input().lower() để chuyển tất cả các ký tự đơn vị người nhập về chữ thường (để so sánh dễ dàng). Nếu người dùng nhập đơn vị là “lbs”, chương trình sẽ nhân trọng lượng với 0.45 để đổi pound sang kilogram; ngược lại nếu nhập “kg”, chương trình chia trọng lượng cho 0.45 để đổi sang pound. Kết quả được in ra bằng f-string như đã học.
Ví dụ, nếu bạn nhập weight = 100 và unit = lbs, chương trình sẽ tính 100 * 0.45 = 45.0 và in ra “You are 45.0 kilos”. Ngược lại, nhập 45 và kg sẽ cho kết quả “You are 100.0 pounds”.

Vòng lặp (Loops)
Khi cần lặp đi lặp lại một thao tác nhiều lần, thay vì phải viết nhiều lần cùng một đoạn code, chúng ta sử dụng vòng lặp. Python có hai loại vòng lặp chính: while loop và for loop.
Vòng lặp while
Vòng lặp while sẽ thực thi khối lệnh lặp lại chừng nào điều kiện còn thỏa mãn (True). Cú pháp:
Khi Python gặp vòng lặp while, nó sẽ kiểm tra <điều kiện>:
-
Nếu điều kiện là True, nó thực thi các lệnh trong thân vòng lặp, sau đó quay lại kiểm tra điều kiện lần nữa.
-
Nếu điều kiện False ngay từ đầu (hoặc trở thành False ở lần kiểm tra nào đó), vòng lặp sẽ kết thúc và chương trình sẽ chạy tiếp tục sau vòng lặp.
Ví dụ, in các số từ 1 đến 5 bằng vòng lặp while:
Giải thích: Ban đầu i = 1. Điều kiện i <= 5 đúng do (1 <= 5) nên in ra là 1, rồi tiếp theo câu lệnh i += 1 làm i tăng thành 2. Quay lại đầu vòng lặp, kiểm tra 2 <= 5 vẫn đúng, in ra 2, tăng cộng vào giá trị củai lúc này thành 3… Quá trình này tiếp diễn cho đến khi i = 6. Lúc này 6 <= 5 là False, vòng lặp dừng lại. Kết quả, chương trình in ra các số 1 2 3 4 5.
Lưu ý: Bạn phải làm cho biến điều kiện (ở đây là i) thay đổi trong thân vòng lặp, mục đích là để tiến dần tới điều kiện dừng là false. Nếu quên cập nhật, điều kiện có thể luôn True và tạo thành vòng lặp vô hạn. Ví dụ: while True: print("Hello") sẽ in “Hello” mãi mãi. Trong trường hợp đó, bạn phải dừng chương trình thủ công (bằng cách nhấn Ctrl+C trong terminal hoặc ngắt kernel trong Jupyter).

Python còn cung cấp hai từ khóa hữu ích trong vòng lặp:
-
break– Dùng để thoát khỏi vòng lặp ngay lập tức, bỏ qua mọi lần lặp còn lại. -
continue– Dùng để bỏ qua phần còn lại của lần lặp hiện tại, quay lên đầu vòng lặp để kiểm tra điều kiện và (nếu True) thực hiện lần lặp tiếp theo.
Chúng ta sẽ thấy ví dụ sử dụng break trong chương trình đoán số dưới đây.
Ví dụ: Trò chơi đoán số
Hãy xây dựng một trò chơi nhỏ: máy tính sẽ giữ một số bí mật, và người chơi có một số lượt đoán nhất định để tìm ra số đó. Nếu đoán đúng, người chơi thắng; nếu hết lượt mà chưa đoán đúng, người chơi thua.
Giải thích: Số bí mật được đặt là 9. Biến guess_count theo dõi số lần đã đoán, ban đầu = 0. Người chơi có tối đa guess_limit = 3 lượt đoán. Vòng lặp while guess_count < guess_limit: sẽ chạy tối đa 3 lần rồi dừng.
Bên trong vòng lặp, mỗi lượt chúng ta:
-
Dùng
input()để hỏi người chơi nhập 1 con số"Guess: "và chuyển kết quả sangint(vì số bí mật là kiểu int). -
Tăng biến
guess_countthêm 1. -
Kiểm tra nếu
guess == secret_number: nếu đoán đúng, in ra “You won!” và dùngbreakđể thoát khỏi vòng lặp ngay (không cần lặp thêm lượt còn lại).
Cú pháp đặc biệt else: ngay sau vòng lặp while ở đây sẽ thực hiện khi vòng lặp kết thúc mà không gặp lệnh break nào. Điều đó có nghĩa là nếu người chơi không đoán trúng trong tất cả các lượt, vòng lặp sẽ kết thúc “tự nhiên” và khối else này sẽ chạy, in ra thông báo thua cuộc “Sorry, you failed!”.
Chạy thử: nếu bạn lần lượt đoán các số không phải 9 trong 3 lần, chương trình sẽ in "Sorry, you failed!" ở cuối. Còn nếu đoán trúng 9 ở bất kỳ lần nào (ví dụ đoán đúng ở lần 2), chương trình sẽ in "You won!" rồi kết thúc ngay.

Ví dụ: Trò chơi điều khiển xe
Tiếp theo, hãy viết một chương trình mô phỏng điều khiển xe đơn giản bằng các câu lệnh văn bản. Người dùng sẽ nhập các lệnh như “start”, “stop”, “help”, “quit” để tương tác với chương trình:
-
Nếu lệnh là
"start":-
Nếu
startedđang True (tức xe đã nổ máy rồi) thì in “Car is already started!” (nhắc người dùng rằng xe đã chạy). -
Nếu
startedđang False thì bậtstarted = Truevà in “Car started…” (khởi động xe).
-
-
Nếu lệnh là
"stop":-
Nếu xe chưa chạy (
not startedTrue) thì báo “Car is already stopped!” (xe đã dừng rồi, không thể thực hiện việc tắt máy nữa). -
Nếu xe đang chạy thì gán
started = Falsevà in “Car stopped.” (tắt máy).
-
-
Nếu lệnh là
"help": chương trình in ra hướng dẫn các lệnh có thể dùng (được đặt trong một chuỗi"""..."""nhiều dòng để format đẹp). Kết quả sẽ hiển thị:
-
Nếu lệnh là
"quit": lệnhbreaksẽ thoát khỏi vòng lặp vô hạn, kết thúc chương trình. -
Nếu lệnh nhập vào không khớp với bất kỳ trường hợp nào ở trên, chương trình rơi vào nhánh
elsecuối cùng và in"Sorry, I don't understand that..."(không hiểu lệnh).
Chương trình trên minh họa việc lồng nhiều cấu trúc điều kiện bên trong vòng lặp. Khi chạy, người dùng có thể tương tác theo trình tự như sau:
Mỗi lệnh người dùng nhập sẽ được chương trình phản hồi tương ứng. Đây chính là cách hoạt động của một số chương trình console đơn giản. Bạn có thể mở rộng trò chơi này với các lệnh khác (vd: “left”, “right” để rẽ hướng) để luyện tập thêm.

Vòng lặp for
Nếu while phù hợp cho những tình huống lặp đến khi điều kiện False (số lần lặp không cố định trước), thì vòng lặp for thường được dùng khi bạn muốn lặp qua các phần tử của một tập hợp (ví dụ các mục trong danh sách) hoặc lặp một số lần xác định.
Cú pháp for trong Python:
Mỗi lần lặp, biến sẽ lấy giá trị của phần tử tiếp theo trong đối tượng (danh sách, chuỗi, v.v.) và thực hiện khối lệnh. Vòng lặp kết thúc khi đã đi qua hết các phần tử.
Ví dụ, lặp qua các phần tử của một danh sách:
Vòng lặp trên sẽ in lần lượt từng phần tử trong list fruits: lần lặp 1 fruit = "apple", lần 2 fruit = "banana", lần 3 fruit = "cherry". Sau khi hết danh sách, vòng lặp tự dừng.

Một trường hợp phổ biến khác: dùng for với hàm tích hợp range(). range(n) sẽ tạo một dãy số nguyên từ 0 đến n-1. Bạn có thể dùng nó để lặp một số lần nhất định:
Đoạn code này sẽ in ra các số lần lượt là 0 1 2 3 4. Hàm range(5) in ra các số 0,1,2,3,4 và mỗi vòng lặp gán i bằng một trong các số đó. Nếu muốn dãy số bắt đầu từ 1 hoặc bước nhảy khác 1, bạn có thể dùng range(start, stop, step) – ví dụ range(1, 6)in ra 1..5, range(0, 10, 2) in ra 0,2,4,6,8.

Vòng lặp lồng nhau (Nested Loops)
Python cho phép đặt một vòng lặp bên trong một vòng lặp khác, gọi là vòng lặp lồng nhau. Kỹ thuật này hữu ích khi bạn cần duyệt qua các tổ chức dữ liệu phức tạp hơn một chiều (ví dụ ma trận 2D, sẽ nói thêm ở phần List hai chiều).
Ví dụ: Sử dụng hai vòng for lồng nhau để in ra các cặp (i, j) cho i từ 0..2, j từ 0..1:
Kết quả in ra:
Vòng lặp ngoài chạy 3 lần (i=0,1,2); mỗi lần trong đó, vòng lặp trong chạy 2 lần với j=0,1. Tổng cộng có 3×2 = 6 cặp được in ra. Lưu ý cách chúng ta lồng hai vòng for: mọi lệnh thụt vào dưới for i ... đều thuộc vòng lặp ngoài, và vòng lặp trong for j ... cùng các lệnh thụt vào dưới nó nằm hoàn toàn bên trong thân của vòng ngoài.
Vòng lặp lồng nhau có thể khiến số lần lặp tăng rất nhanh (theo tích của số lần lặp mỗi vòng). Bạn cần cẩn thận với hiệu xuất xử lý khi lồng quá nhiều vòng lặp, nhưng với 2-3 vòng lặp lồng cho mục đích duyệt ma trận hoặc dữ liệu nhiều chiều thì hoàn toàn chấp nhận được.

Cấu trúc dữ liệu danh sách (List)
Danh sách (list) là một kiểu dữ liệu cấu trúc cho phép chứa nhiều giá trị trong một đối tượng duy nhất. Bạn có thể tưởng tượng list giống như một danh sách các mục được sắp thứ tự. List rất linh hoạt: có thể chứa các phần tử có kiểu bất kỳ (số, chuỗi, thậm chí list khác), và đặc biệt list có thể thay đổi (mutable).
Để tạo list, bạn dùng cặp ngoặc vuông [] và liệt kê các phần tử bên trong, cách nhau bằng dấu phẩy.
Ví dụ:
List numbers ở trên chứa 5 phần tử số nguyên. Tương tự chuỗi, các phần tử list có chỉ số từ 0 đến 4. numbers[0] là phần tử đầu tiên (giá trị 1), numbers[4] là phần tử cuối (giá trị 5). Nếu dùng chỉ số âm, numbers[-1] sẽ là 5 (phần tử cuối), numbers[-2] là 4, v.v.
Bạn có thể thay đổi giá trị phần tử, thêm mới hoặc xóa phần tử trong list sau khi tạo, vì list là mutable. Một vài thao tác thường dùng:
Sau các thao tác trên, list ban đầu [1,2,3,4,5] sẽ trở thành [0, 2, 4, 5, 6]:
-
append(6)thêm phần tử 6 vào cuối. -
Gán
numbers[0] = 0thay giá trị đầu tiên (1) thành 0. -
del numbers[2]xóa đi phần tử tại index 2 (trong list hiện tại index 2 đang là giá trị 4 do list đã thay đổi).
Như vậy, chúng ta có thể thêm/sửa/xóa trực tiếp các phần tử list một cách linh hoạt. Lưu ý khi xóa phần tử, các phần tử phía sau sẽ dồn chỉ số về trước (vd sau khi xóa phần tử index 2, phần tử index 3 cũ sẽ trở thành index 2 mới).

Các phương thức hữu ích của list
Python cung cấp nhiều phương thức (method) tích hợp để thao tác với list. Một số phương thức thường dùng gồm:
-
list.append(x): Thêm phần tửxvào cuối list. -
list.insert(i, x): Chèn phần tửxvào vị trí indexitrong list. -
list.remove(x): Tìm và xóa phần tử đầu tiên có giá trịxtrong list. -
list.pop(i): Gỡ và trả về phần tử tại indexi(mặc định i = -1, tức phần tử cuối). -
list.sort(): Sắp xếp list tại chỗ (theo thứ tự tăng dần). -
list.reverse(): Đảo ngược thứ tự các phần tử trong list.
Ví dụ:
Ở đây, sau các thao tác thêm, chèn, xóa, sắp xếp, danh sách fruits cuối cùng được in ra theo thứ tự abc. Việc sắp xếp list chứa chuỗi sẽ dựa trên thứ tự chữ cái (theo chuẩn Unicode). Bạn cũng có thể sắp xếp số, hoặc thậm chí sắp xếp theo tiêu chí tùy chỉnh bằng cách truyền vào tham số key cho sort() (ví dụ sắp xếp danh sách tuple theo phần tử thứ hai,…).

Danh sách hai chiều (2D list)
List có thể chứa những list khác làm phần tử. Điều này cho phép tạo danh sách nhiều chiều (phổ biến nhất là 2 chiều – ma trận). Ví dụ, một ma trận 3×3 có thể được biểu diễn bằng list 2 chiều trong Python:
matrix ở trên là list gồm 3 phần tử, mỗi phần tử lại là một list con đại diện cho một hàng của ma trận. Biểu thức matrix[0][1] trước tiên lấy hàng đầu tiên [1,2,3] (vì matrix[0]), rồi lấy phần tử index 1 trong hàng đó (là 2).

Để duyệt qua mọi phần tử trong list 2 chiều, bạn có thể dùng vòng lặp lồng nhau – vòng ngoài lặp qua từng hàng, vòng trong lặp qua từng cột trong hàng đó. Ví dụ:
Kết quả in ra sẽ là các số từ 1 đến 9, được sắp xếp theo ma trận 3 hàng 3 cột. (Chúng ta sử dụng print(value, end=" ") để in các giá trị trên cùng một dòng, và print() trống để ngắt dòng khi chuyển sang hàng mới).

Tuple (Bộ giá trị cố định)
Tuple cũng là một cấu trúc dữ liệu dạng dãy các phần tử giống list, nhưng điểm khác biệt là tuple có tính bất biến (immutable) – sau khi tạo, bạn không thể thay đổi (thêm, sửa, xóa) các phần tử bên trong tuple.
Cú pháp tạo tuple: dùng dấu ngoặc tròn (...). Các phần tử bên trong tuple được ngăn cách bởi dấu phẩy. Lưu ý: nếu tạo tuple có một phần tử, bạn cần thêm dấu phẩy sau phần tử đó, ví dụ tuple1 = ("hello",) – nếu không, Python sẽ hiểu cặp ngoặc tròn đó chỉ là nhóm toán tử thông thường.
Ví dụ:
coordinates là một tuple gồm 2 giá trị. Bạn vẫn truy cập phần tử bằng chỉ số như list (coordinates[0] == 10 ở ví dụ trên), nhưng bạn không thể gán coordinates[0] = 15 – lệnh đó sẽ gây lỗi vì tuple không cho phép thay đổi.
Tuple thường được dùng cho những tập dữ liệu cố định không cần chỉnh sửa, giúp code an toàn hơn vì tránh bị thay đổi ngoài ý muốn. Ví dụ, khi bạn muốn trả về nhiều giá trị từ một hàm, tuple là lựa chọn phù hợp; hoặc dùng tuple để làm khóa trong dictionary (vì tuple bất biến nên băm được, list thì không).
Phép “giải nén” tuple (tuple unpacking)
Python có một cú pháp tiện lợi cho phép gán các phần tử của tuple vào nhiều biến cùng một lúc, gọi là unpacking (giải nén) tuple.
Ví dụ:
Biến point là một tuple chứa hai giá trị (3, 5). Ở dòng x, y = point, Python sẽ tự “giải nén” tuple point ra thành hai giá trị rồi gán x = 3, y = 5 tương ứng. Cú pháp này giúp code gọn gàng và trực quan hơn so với việc lấy từng phần tử một: bạn có thể gán nhiều biến chỉ trong một dòng.
Unpacking cũng hoạt động với list và các iterables khác (số biến và số phần tử phải khớp nhau). Ví dụ: a, b, c = [1, 2, 3] sẽ cho a=1, b=2, c=3. Bạn thậm chí có thể dùng dấu * để “thu thập” nhiều phần tử vào một biến dạng list khi unpacking, nhưng đó là nâng cao hơn một chút.

Từ điển (Dictionary)
Từ điển (dictionary) là kiểu dữ liệu ánh xạ cho phép lưu trữ các cặp khóa – giá trị (key-value). Bạn có thể hình dung nó như cuốn từ điển: mỗi từ (khóa) có một định nghĩa (giá trị) tương ứng. Trong Python, dictionary được dùng để truy xuất giá trị theo khóa (thay vì theo chỉ số vị trí như list).
Tạo dictionary bằng cặp dấu ngoặc nhọn { }. Bên trong, viết các cặp key: value và phân tách nhau bằng dấu phẩy. Key có thể là các kiểu bất biến như chuỗi, số, tuple,… và mỗi key phải là duy nhất trong dictionary. Value thì có thể là bất kỳ kiểu nào.
Ví dụ:
Dictionary student trên có các khóa "name", "age", "major" tương ứng với các giá trị “John”, 21, “Computer Science”. Cú pháp student["name"] truy cập giá trị tương ứng với khóa "name", và kết quả là chuỗi "John".
Nếu bạn dùng một khóa không tồn tại, Python sẽ báo lỗi KeyError. Để tránh lỗi, có thể kiểm tra trước bằng toán tử in: ví dụ "grade" in student sẽ trả về False vì khóa “grade” chưa có.
Giống list, dictionary cũng là mutable – bạn có thể thêm, cập nhật hoặc xóa các cặp key-value sau khi tạo:
Sau các thao tác trên, dictionary student ban đầu sẽ thay đổi:
-
Bổ sung khóa
"graduated": False. -
Giá trị của khóa
"age"đổi từ 21 thành 22. -
Cặp
"major": "Computer Science"bị xóa.
Kết quả in ra có thể là: {'name': 'John', 'age': 22, 'graduated': False} (thứ tự các phần tử trong dict có thể khác nhau, vì Python dict (từ phiên bản 3.7) duy trì thứ tự theo trình tự thêm phần tử).
Python còn cung cấp một số method hữu ích cho dict như: dict.get(key, default) để lấy giá trị với khóa, trả về default nếu không có; dict.keys() trả về danh sách các khóa; dict.values() trả về danh sách các giá trị; dict.items() trả về danh sách các cặp (key, value).

Ví dụ: Chương trình chuyển đổi Emoji
Để thấy dictionary hoạt động thực tế, ta cùng xây dựng một chương trình chuyển các ký hiệu mặt cười trong văn bản thành emoji. Ví dụ chuyển ":)" thành , ":(" thành , "<3" thành ❤️.
Đầu tiên, định nghĩa một dictionary ánh xạ các chuỗi ký hiệu thành emoji tương ứng:
Tiếp theo, đọc đầu vào từ người dùng (một câu văn bản), và thay thế tuần tự từng ký hiệu trong câu bằng emoji thông qua dict:
Ở đây, emojis.items() cho ta danh sách các cặp (symbol, emoji) trong dictionary. Vòng lặp sẽ duyệt qua từng cặp, với symbol là khóa (ví dụ ":)") và emoji là giá trị tương ứng (ví dụ “”). Trong thân vòng lặp, ta dùng text.replace(symbol, emoji) để thay tất cả các chuỗi symbol gặp trong text thành emoji. Kết thúc vòng lặp, biến text sẽ được thay thế tất cả các biểu tượng cảm xúc bằng emoji. Cuối cùng, in ra text.
Thử ví dụ: nếu người dùng nhập I love Python <3 :) thì chương trình sẽ in ra I love Python ❤️ . Đây là một minh họa thú vị cho việc dùng dictionary kết hợp với vòng lặp để xử lý chuỗi.

Hàm (Function)
Khi chương trình của bạn lớn dần, việc tổ chức code thành các hàm sẽ giúp dễ quản lý và tái sử dụng code hơn. Hàm là một khối lệnh có tên xác định, có thể được gọi (thực thi) từ nơi khác trong code, và có thể nhận tham số đầu vào cũng như trả về kết quả.
Định nghĩa và gọi hàm
Trong Python, bạn định nghĩa một hàm bằng từ khóa def, theo sau là tên hàm và cặp ngoặc tròn (). Bên trong ngoặc có thể liệt kê danh sách tham số (parameters) mà hàm chấp nhận. Kết thúc dòng def là dấu :. Các lệnh bên trong hàm phải thụt vào (indent) để thuộc về thân hàm.
Ví dụ, định nghĩa hàm greet đơn giản và gọi nó:
Hàm greet ở trên có một tham số name. Khi được gọi với một giá trị cụ thể (ví dụ "Alice"), nó sẽ in ra lời chào “Hello, Alice!”. Nếu gọi greet("Bob") sẽ in “Hello, Bob!”. Bạn có thể hình dung, mỗi lần gọi hàm, Python sẽ nhảy vào trong thân hàm thực thi các lệnh (với biến cục bộ name mang giá trị đối số truyền vào) rồi quay trở lại vị trí gọi hàm sau khi xong việc.
Lợi ích của hàm: Giả sử bạn cần chào nhiều người tại nhiều chỗ trong chương trình, thay vì viết lặp đi lặp lại câu lệnh print("Hello, ..."), bạn chỉ việc gọi hàm greet(tên) mỗi khi cần. Nếu sau này muốn thay đổi cách chào (ví dụ thêm dấu chấm than hoặc in hoa tên), bạn chỉ cần sửa trong định nghĩa hàm, thì tất cả các nơi gọi hàm trong chương trình sẽ tự động cập nhật theo logic mới. Điều này thể hiện tính tái sử dụng và dễ bảo trì của hàm.

Tham số và đối số
Hàm có thể có tham số (parameter) hoặc không có. Khi định nghĩa, các biến liệt kê trong ngoặc gọi là tham số. Khi gọi hàm, các giá trị cụ thể truyền vào được gọi là đối số (argument).
Bạn có thể định nghĩa giá trị mặc định cho tham số. Tham số có giá trị mặc định trở thành tùy chọn – người gọi hàm có thể bỏ qua không cung cấp đối số cho tham số đó, khi đó Python sẽ dùng giá trị mặc định.
Ví dụ:
Định nghĩa trên đặt giá trị mặc định cho name là "Guest". Do đó, greet() (gọi hàm không tham số) sẽ in “Hello, Guest!” theo mặc định. Còn greet("Bob") sẽ in “Hello, Bob!” như thông thường. Bạn có thể có nhiều tham số mặc định, và chúng luôn phải đứng sau các tham số không có mặc định trong danh sách tham số.

Python còn cho phép gọi hàm bằng tham số từ khóa: Có nghĩa là chỉ rõ tên tham số khi truyền đối số. Cách này giúp lời gọi hàm dễ đọc và không phụ thuộc thứ tự tham số.
Ví dụ:
Ở lời gọi hàm, chúng ta đã chỉ ra rõ là animal_type="hamster" và pet_name="Harry". Python sẽ gán đúng giá trị cho từng tham số tương ứng, bất kể thứ tự. (Trong ví dụ trên, thứ tự là trùng khớp, nhưng bạn hoàn toàn có thể gọi describe_pet(pet_name="Harry", animal_type="hamster") kết quả sẽ vẫn như vậy). Tham số từ khóa phát huy tác dụng khi hàm có nhiều tham số tùy chọn; code sẽ rõ nghĩa hơn và tránh nhầm lẫn vị trí.

Giá trị trả về của hàm
Mặc định, mọi hàm trong Python đều trả về giá trị None nếu trong thân hàm không có câu lệnh return. Để hàm trả về một giá trị cụ thể cho nơi gọi hàm, bạn dùng lệnh return <giá trị>. Khi Python gặp lệnh return, nó sẽ kết thúc hàm ngay lập tức và trả lại giá trị theo sau return.
Ví dụ:
Hàm add nhận hai tham số x và y, và return trả về giá trị tổng của chúng. Biến result ở nơi gọi sẽ nhận giá trị mà hàm trả về (ở đây là 8). Sau khi thực hiện return, hàm kết thúc nên không có lệnh nào khác chạy sau đó. Bạn có thể return nhiều lần trong một hàm (ví dụ trong các nhánh lệnh điều kiện if/else khác nhau) nhưng khi một return được thực hiện thì các phần còn lại của hàm sẽ bị bỏ qua.
Nếu hàm của bạn không rõ cần trả về gì (ví dụ chỉ thực hiện nhiệm vụ in ra màn hình như hàm greet ở trên), bạn có thể bỏ lệnh return hoặc viết return không có giá trị gì theo sau (hàm sẽ trả về None).
Thực hành: Khi viết hàm, cố gắng cho hàm thực hiện một nhiệm vụ cụ thể và có thể hiểu được tên hàm. Điều này giúp hàm có tính tái sử dụng cao và code của bạn dễ đọc hơn (nhìn vào tên hàm là biết nó làm gì). Ví dụ, calculate_area(radius) rõ nghĩa hơn là viết trực tiếp công thức tính diện tích trong chương trình nhiều lần.

Xử lý ngoại lệ (Exceptions)
Trong quá trình chạy chương trình, không phải lúc nào mọi thứ cũng diễn ra suôn sẻ – có thể xảy ra ngoại lệ (exception), tức những lỗi phát sinh khi chương trình đang thực thi, khiến cho chương trình dừng đột ngột. Ngoại lệ có thể do nhiều nguyên nhân: người dùng nhập dữ liệu sai kiểu, chia một số cho 0, cố truy cập file không tồn tại, v.v.
Python cung cấp cơ chế xử lý ngoại lệ để bạn “bắt” những lỗi này và xử lý chúng một cách gọn gàng, thay vì để chương trình down. Cú pháp cơ bản:
Trong đó, khối lệnh trong try sẽ được thực thi trước. Nếu một lỗi (exception) xảy ra ở bất kỳ dòng nào trong try, chương trình nhảy ngay đến khối except tương ứng với loại lỗi đó (nếu khớp), thực hiện các lệnh trong except rồi tiếp tục sau cấu trúc try-except. Nếu lỗi xảy ra nhưng không có except nào bắt loại lỗi đó, chương trình sẽ dừng như bình thường. Nếu không có lỗi nào xảy ra trong try, các khối except bị bỏ qua, và nếu có else: thì khối đó sẽ chạy. finally: nếu có thì sẽ luôn chạy cuối cùng (dùng để giải phóng tài nguyên, đóng file, v.v. nếu cần).
Ví dụ minh họa:
Trong ví dụ này, chúng ta cố gắng chuyển đầu vào thành số nguyên (int()) và chia 10 cho số đó. Có hai tình huống lỗi dự kiến:
-
Nếu người dùng nhập vào không phải là số (ví dụ “abc”), hàm
int()sẽ ném ra ngoại lệValueError. Chương trình sẽ nhảy vào khốiexcept ValueErrorvà in ra thông báo lỗi : “Đó không phải là một số hợp lệ!”. -
Nếu người dùng nhập
0, phép tính10 / 0sẽ gây ngoại lệZeroDivisionError. Chương trình sẽ bắt nó ở khốiexcept ZeroDivisionErrorvà in ra “Không thể chia cho 0!”.
Nếu người dùng nhập đúng (ví dụ nhập số 5), cả hai ngoại lệ trên đều không xảy ra, chương trình sẽ đi qua khối try mà không gặp except nào, in ra kết quả 2.0 rồi kết thúc (trong ví dụ này chúng ta không dùng else/finally).
Xử lý ngoại lệ giúp chương trình của bạn ổn định hơn, tránh bị “vỡ” khi gặp tình huống bất ngờ, đồng thời cho bạn cơ hội hướng dẫn người dùng hoặc thực hiện các hành động thay thế (như yêu cầu nhập lại cho đúng, ghi log lỗi, v.v.).

Chú thích (Comment) trong code
Chú thích (comment) là những phần ghi chú dành cho người đọc code (bao gồm cho chính bạn sau này), và Python sẽ bỏ qua những phần này khi thực thi chương trình. Chú thích không làm ảnh hưởng đến kết quả chương trình, nhưng cực kỳ quan trọng để giải thích ý nghĩa của code, đặc biệt trong các dự án lớn hoặc khi bạn chia sẻ code của bạn với người khác.
Trong Python, bất kỳ nội dung nào theo sau dấu # trên cùng một dòng sẽ được coi là chú thích. Bạn cũng có thể sử dụng cặp dấu triple quotes ''' ... ''' hoặc """ ... """ để viết chú thích nhiều dòng, tuy nhiên cách này thực chất tạo một chuỗi nhiều dòng không gán cho biến nào – Python bỏ qua nó vì nó không phải comment thực sự. Thông thường, dùng ký tự # cho comment là đủ.
Ví dụ:
Ở trên, dòng đầu hoàn toàn là chú thích, không ảnh hưởng đến chương trình. Trong dòng thứ hai, phần # In ra lời chào là chú thích giúp giải thích mục đích của lệnh print. Khi chạy, Python chỉ thực thi print("Hello!") và bỏ qua mọi thứ sau dấu #.
Hãy tập thói quen viết chú thích cho những đoạn code phức tạp hoặc sử dụng các thủ thuật đặc biệt, để người khác (hoặc chính bạn sau này) đọc lại dễ hiểu hơn. Nhưng cũng tránh lạm dụng: không cần chú thích điều quá hiển nhiên. Chú thích tốt nên trả lời “đoạn code này để làm gì và tại sao làm thế”, hơn là “đoạn code làm như thế nào” (vì code đã tự nói lên “như thế nào” rồi).
Lập trình hướng đối tượng (OOP) trong Python
Python hỗ trợ lập trình hướng đối tượng (Object-Oriented Programming – OOP), một cách tổ chức code bằng cách nhóm dữ liệu và các hàm xử lý dữ liệu đó vào một đơn vị gọi là đối tượng (object). Lớp đối tượng (class) định nghĩa cấu trúc và hành vi của một nhóm các đối tượng, còn đối tượng là thể hiện cụ thể của lớp.
Nói đơn giản, nếu bạn đang lập trình một trò chơi có nhiều nhân vật, bạn có thể định nghĩa một lớp Character với các thuộc tính (sức khỏe, tên, vị trí…) và phương thức (di chuyển, tấn công…). Mỗi nhân vật trong game là một đối tượng thuộc lớp Character với thông tin riêng của nó.
Định nghĩa lớp và tạo đối tượng
Bạn định nghĩa một lớp (class) trong Python bằng từ khóa class:
Đây là định nghĩa lớp Dog mô tả một đối tượng con chó cơ bản với một thuộc tính và một phương thức:
-
Phương thức đặc biệt
__init__được gọi khi bạn tạo đối tượng (gọi là hàm khởi tạo). Nó gán thuộc tínhnamecủa đối tượng (self.name) bằng với tham số truyền vào. -
Phương thức
barkđơn giản in ra tiếng sủa kèm tên chó.
Chú ý tham số self: mỗi phương thức trong class (bao gồm __init__) đều phải nhận self làm tham số đầu tiên, đại diện cho bản thân đối tượng. Python sẽ tự truyền self khi bạn gọi phương thức, bạn không cần truyền nó thủ công.
Sau khi định nghĩa lớp, chúng ta có thể tạo đối tượng (còn gọi là instance) từ lớp đó:
Khi gọi Dog("Buddy"), Python sẽ:
-
Tạo một đối tượng
Dogmới trong bộ nhớ. -
Tự động gọi phương thức
__init__của lớpDog, truyềnself(đối tượng mới) và đối số"Buddy"vào__init__. -
Trong
__init__, thuộc tínhself.nameđược gán là"Buddy". -
Trả về đối tượng vừa tạo, gán vào biến
my_dog.
Bây giờ, my_dog có thuộc tính name = "Buddy". Gọi my_dog.bark() sẽ in "Buddy says woof!" vì phương thức bark dùng thuộc tính self.name của my_dog.
Bạn có thể tạo nhiều đối tượng Dog khác nhau: dog1 = Dog("Max"), dog2 = Dog("Bella"), v.v. Mỗi đối tượng giữ một name riêng và khi gọi dog2.bark() sẽ in “Bella says woof!”,…

Kế thừa (Inheritance)
Kế thừa cho phép định nghĩa một lớp con (subclass) dựa trên một lớp cha (base class) đã có, nhờ đó lớp con thừa hưởng mọi thuộc tính và phương thức của lớp cha, và có thể thêm hoặc ghi đè để điều chỉnh cho phù hợp. Kế thừa giúp tái sử dụng code và tạo mối quan hệ phân cấp giữa các lớp (ví dụ: lớp Dog có thể kế thừa từ lớp chung Animal).
Ví dụ:
Ở đây, chúng ta có lớp cha Animal với một phương thức speak. Lớp Dog(Animal) nghĩa là Dog kế thừa từ Animal. Lớp Dog định nghĩa thêm phương thức bark. Khi tạo Dog(), dù lớp Dog không định nghĩa speak, đối tượng my_dog vẫn có thể gọi speak() – do thừa hưởng từ Animal. Kết quả in “Animal speaks”. Còn my_dog.bark() thì in “Dog barks”.
Nếu lớp con định nghĩa một phương thức trùng tên với lớp cha, phương thức ở lớp con sẽ ghi đè (override) phương thức lớp cha. Điều này thường được dùng để điều chỉnh/hành vi chi tiết hơn cho lớp con. Ví dụ: nếu Animal có phương thức speak chung chung, các lớp con như Dog, Cat có thể override để nói “Woof”, “Meow” theo cách riêng.
Kế thừa nhiều tầng: Python hỗ trợ một lớp có thể kế thừa từ nhiều lớp (đa kế thừa), nhưng trong hầu hết trường hợp bạn sẽ thấy đơn kế thừa (một lớp con kế thừa một lớp cha) là đủ và dễ quản lý.

Module và Package trong Python
Khi chương trình lớn dần, số lượng hàm và lớp nhiều lên, việc quản lý tất cả trong một file sẽ trở nên khó khăn. Python cho phép bạn đưa mã nguồn ra thành các file riêng, mỗi file như vậy gọi là một module. Ngoài ra, nhiều module có thể được tổ chức vào một package (gói) để tiện quản lý theo chuyên đề.
Module
Hiểu đơn giản, mỗi file Python (.py) chính là một module. Tên module thường chính là tên file. Bên trong module, bạn có thể định nghĩa hàm, lớp, biến… và những module khác có thể nhập (import) module này để sử dụng các hàm, lớp, biến đó.
Ví dụ, Python có sẵn module math cung cấp các hàm toán học. Ta có thể dùng:
Khi import math, ta đưa toàn bộ module math vào chương trình và có thể gọi các hàm bên trong nó với cú pháp math.tên_hàm. Ngoài sqrt, module math còn có nhiều hàm khác như sin, cos, floor, ceil,… Bạn cũng có thể from math import sqrt, pi để nhập trực tiếp một vài hàm cần dùng (rồi gọi sqrt(16) thay vì math.sqrt(16)).
Tương tự, bạn có thể tự tạo module của riêng mình. Chẳng hạn, bạn viết các hàm tiện ích vào file myutils.py:
Sau đó trong chương trình chính, bạn có thể import myutils và dùng myutils.add(5,3), v.v. Hoặc from myutils import add để nhập riêng hàm add. Lưu ý: khi import, Python tìm file module trong các thư mục hệ thống và thư mục hiện hành, nên file myutils.py cần nằm cùng thư mục với file bạn đang chạy (hoặc trong thư mục nằm trong PYTHONPATH).
Tóm lại, module giúp bạn chia nhỏ chương trình thành các phần theo chức năng, thuận tiện cho việc bảo trì và tái sử dụng code. Thay vì viết 10000 dòng code trong một file, bạn có thể tổ chức thành nhiều module logic.

Package (Gói)
Package là một cách tổ chức các module có liên quan với nhau vào cùng một không gian tên. Về mặt vật lý, một package chính là một thư mục chứa các file module, kèm thêm một file đặc biệt __init__.py. File __init__.py (có thể rỗng hoặc có nội dung) báo cho Python rằng thư mục đó là một package (tương tự dấu hiệu nhận biết, do các phiên bản Python cũ yêu cầu, Python 3.3+ không bắt buộc file này nhưng vẫn thường có để chạy code khởi tạo package).
Ví dụ cấu trúc gói:
Bạn có thể import module trong gói bằng cú pháp:
hoặc:
Khi import my_package.module2, Python sẽ tìm thư mục my_package, thực thi (nếu cần) file __init__.py của nó, rồi import module2. Sau đó bạn có thể dùng my_package.module2.tên_hàm() để gọi hàm trong module2. Còn với cú pháp from my_package import module1, bạn sẽ trực tiếp có tên module1 trong namespace hiện tại để dùng.
Mục đích của package là giúp tổ chức module theo chủ đề, tránh trùng tên module. Ví dụ, bạn có thể có gói graphics chứa các module liên quan đến đồ họa (như draw.py, colors.py), gói audio chứa module về âm thanh (play.py, effects.py), v.v. Điều này giúp dự án của bạn có cấu trúc rõ ràng và dễ quản lý hơn, đồng thời khi phân phối thì người dùng có thể cài đặt cả package như một thư viện.
Tạo giá trị ngẫu nhiên (Random) trong Python
Nhiều ứng dụng cần đến số ngẫu nhiên hoặc lựa chọn ngẫu nhiên, ví dụ: trò chơi xúc xắc, chọn bài, hay đơn giản là trộn ngẫu nhiên dữ liệu. Python cung cấp module tích hợp random để tạo các giá trị ngẫu nhiên.
Đầu tiên, import module:
Một số hàm phổ biến trong module random:
-
random.randint(a, b): Trả về một số nguyên ngẫu nhiên N sao cho a <= N <= b. Ví dụ:Mỗi lần chạy,
random_numbersẽ nhận một giá trị bất kỳ trong khoảng 1 đến 100 (có thể là 1, 50, 100, v.v.). -
random.random(): Trả về một số float ngẫu nhiên trong khoảng [0.0, 1.0). -
random.choice(sequence): Trả về một phần tử ngẫu nhiên từ sequence (danh sách, chuỗi, tuple…). Ví dụ:Mỗi lần chạy,
random.choicesẽ chọn ngẫu nhiên một trong các chuỗi “apple”, “banana”, “cherry”. -
random.shuffle(list): Xáo trộn (thay đổi thứ tự) các phần tử trong list ban đầu. -
random.sample(sequence, k): Lấy ngẫu nhiên k phần tử từ sequence (trả về dạng list, không lặp lại phần tử).
Ví dụ nhỏ: Tạo trò chơi đoán số (đã làm ở trên) nhưng để máy tự chọn số bí mật ngẫu nhiên, bạn có thể dùng secret_number = random.randint(1, 10) để chọn số từ 1 đến 10 thay vì cố định 9.
Lưu ý rằng hầu hết các hàm trong random module sử dụng bộ sinh số giả ngẫu nhiên (pseudo-random), và bạn có thể đặt seed (hạt giống) cho nó bằng random.seed(x) để có kết quả lặp lại phục vụ cho debug hoặc các mục đích đặc biệt. Còn mặc định, Python sẽ lấy seed theo thời gian hệ thống, đủ tốt cho đa số trường hợp.

Làm việc với tập tin và thư mục
Tương tác với hệ thống file là một phần quan trọng của lập trình thực tế. Python cung cấp nhiều công cụ để thao tác file (đọc/ghi dữ liệu) và quản lý thư mục (tạo, xóa, đổi tên, liệt kê nội dung,…). Dưới đây chúng ta sẽ nói qua cách thao tác thư mục thông qua module os tích hợp trong Python, sau đó làm một dự án nhỏ kết hợp những kiến thức này.
Trước hết, import module os:
Một vài thao tác thư mục thường gặp:
-
Lấy thư mục hiện tại:
os.getcwd()trả về đường dẫn thư mục hiện tại của chương trình. -
Tạo thư mục mới:
os.mkdir("ten_thu_muc")để tạo thư mục mới cùng cấp. Ví dụ:Lệnh này sẽ tạo ra một thư mục tên là “new_directory” trong thư mục hiện tại (nếu chưa tồn tại).
-
Đổi thư mục hiện tại:
os.chdir("duong_dan")để chuyển đến thư mục khác (tương tự lệnhcdtrên terminal). -
Liệt kê nội dung thư mục:
os.listdir(path)trả về danh sách tên file và thư mục con trong thư mụcpath(hoặc thư mục hiện tại nếu không truyềnpath). Ví dụ:sẽ in ra list các tên file/thư mục trong thư mục hiện hành.
-
Xóa thư mục:
os.rmdir("ten_thu_muc")xóa một thư mục rỗng. Nếu thư mục không rỗng, bạn cần dùngos.remove()để xóa file bên trong hoặc dùng thư việnshutil.rmtreeđể xóa cả cây thư mục. -
Kiểm tra tồn tại:
os.path.exists(path)trả về True/False tùy thuộc đường dẫn có tồn tại không. Ngoài ra,os.path.isfile(path)vàos.path.isdir(path)lần lượt kiểm tra path là file hay thư mục.
Ví dụ:
Lưu ý: Để tạo nhiều cấp thư mục con một lúc (ví dụ “parent/child”), bạn có thể dùng os.makedirs("parent/child"). Và khi xóa thư mục, cần cẩn thận bởi thao tác này có thể không hoàn tác được; luôn đảm bảo bạn có quyền xóa và xóa đúng mục tiêu (đặc biệt khi sử dụng script tự động).

Tiếp theo, chúng ta sẽ vận dụng việc quản lý thư mục và file trong VD minh họa một dự án nhỏ .
Dự án 1: Tự động hóa – Quét và phân loại files trong thư mục
Trong dự án nhỏ này, chúng ta sẽ viết một script Python để tự động quét nội dung của một thư mục trong máy tính và phân loại các files trong thư mục đó theo loại (dựa trên phần mở rộng của tên file). Đây là một ví dụ thực tế cho thấy sức mạnh của Python trong việc tự động hóa công việc, cụ thể ở đây là việc quản lý files.
Yêu cầu & Ý tưởng
Giả sử bạn có một thư mục chứa đủ loại files: hình ảnh, tài liệu văn bản, bảng tính, mã nguồn, v.v. Mục tiêu của chúng ta là duyệt qua tất cả các tệp trong thư mục đó và nhóm chúng thành các danh mục như “Hình ảnh”, “Tài liệu”, “Khác”. Kriterium phân loại đơn giản là dựa vào đuôi file (extension): ví dụ .png, .jpg thuộc loại hình ảnh; .txt, .pdf, .docx, .xlsx thuộc loại tài liệu; những file không rơi vào hai nhóm trên thì xếp vào nhóm “Khác”. Cuối cùng, chương trình sẽ in ra danh sách các files trong từng nhóm.
Triển khai
Chúng ta sẽ sử dụng module os đã nói ở trên để liệt kê file và kiểm tra phần mở rộng.
Hãy thử phân tích đoạn code trên:
-
os.listdir(directory)trả về danh sách tên (str) tất cả các thư mục & files trong thư mục đích. Chúng ta duyệt từng tên file trong đó bằng vòngfor. -
Với mỗi
filename, dùngos.path.joinđể ghép với đường dẫn thư mục tạo thànhfilepathđầy đủ. Điều này đảm bảo chương trình hoạt động trên mọi hệ điều hành (Windows dùng\, Linux/macOS dùng/làm dấu phân tách thư mục –os.path.joinlo việc đó cho chúng ta). -
os.path.isfile(filepath)kiểm tra xem đường dẫn chỉ đến file hay không. Nếu không (tức đó là một thư mục con), ta bỏ qua (trong bài toán này ta không phân loại thư mục). -
os.path.splitext(filename)[1]tách phần mở rộng của tên file. Ví dụfilename = "photo.JPG"thìos.path.splitexttrả về("photo", ".JPG"), chúng ta lấy[1]là chuỗi".JPG". Gọi.lower()để chuyển thành".jpg"nhằm việc so sánh không phân biệt chữ hoa và chữ thường. -
Sau đó, dựa vào
extmà phân loại:-
Nếu
extnằm trong listimage_extsđã định nghĩa, ta thêmfilenamevào danh sáchimages. -
Ngược lại nếu
extthuộcdocument_exts, thêm vàodocuments. -
Nếu không thuộc cả hai, thêm vào
others.
-
-
Cuối cùng, in ra các danh sách.
Chương trình trên không tạo file hay di chuyển file; nó chỉ quét và liệt kê. Kết quả in ra có dạng, VD:
(danh sách cụ thể tùy thuộc vào những gì có trong thư mục của bạn).
Mở rộng: Bạn có thể mở rộng chương trình trên để thực hiện các hành động khác, ví dụ: Tự động tạo các thư mục “Hình_ảnh”, “Tài_liệu”, “Khác” rồi di chuyển file tương ứng vào từng thư mục đó (dùng os.rename hoặc shutil.move). Như vậy, thư mục của bạn sẽ được dọn dẹp ngăn nắp theo loại file. Hãy cẩn thận kiểm tra để không ghi đè file trùng tên nếu làm điều này. Python có sẵn module shutil hỗ trợ nhiều thao tác nâng cao với file/thư mục (copy, move, rmtree,…).
Qua dự án nhỏ trên, bạn có thể thấy chỉ với vài chục dòng code Python, chúng ta đã có thể tự động hóa một tác vụ quản lý file hữu ích – điều mà nếu chúng ta làm thủ công sẽ rất tốn thời gian và dễ sai sót.

Pypi và pip: Quản lý thư viện Python
Khi lập trình Python, ngoài các chức năng có sẵn, bạn thường sẽ cần dùng đến các thư viện (library) do cộng đồng đóng góp để giải quyết các tác vụ cụ thể (ví dụ: thư viện để vẽ biểu đồ, xử lý ảnh, v.v.).
PyPI (Python Package Index) là kho lưu trữ trực tuyến chứa hàng trăm nghìn gói thư viện Python miễn phí. pip là công cụ quản lý gói đi kèm Python (từ phiên bản 3.4+) giúp bạn cài đặt các thư viện này dễ dàng.
Ví dụ, thư viện Requests giúp gửi HTTP request đơn giản hơn. Để cài đặt Requests, bạn mở terminal và chạy:
Lệnh trên sẽ tải về và cài đặt thư viện Requests từ PyPI. Sau khi cài, trong code Python bạn chỉ việc import requests để sử dụng. Bạn có thể dùng pip để cài bất kỳ thư viện nào có trên PyPI với cú pháp tương tự.

Một vài lệnh pip hữu ích:
-
pip install <tên_gói>: Cài đặt phiên bản mới nhất của gói đó. -
pip install <gói>==<phiên_bản>: Cài đặt đúng phiên bản chỉ định. -
pip install <gói> --upgrade: Nâng cấp gói lên phiên bản mới nhất. -
pip uninstall <gói>: Gỡ cài đặt gói. -
pip list: Liệt kê tất cả các gói Python đã cài trên hệ thống của bạn.
Khi mới học, bạn có thể chưa cần dùng pip nhiều, nhưng biết qua về nó sẽ hữu ích cho tương lai gần khi bạn bắt đầu khám phá các thư viện bên ngoài.
Dự án 2: Học máy với Python
Để thấy sức mạnh của Python trong lĩnh vực máy học (machine learning), chúng ta sẽ cùng xây dựng một mô hình máy học đơn giản sử dụng thư viện phổ biến là scikit-learn. Cụ thể, ta sẽ tạo một mô hình hồi quy tuyến tính (linear regression) để dự đoán chỉ số bệnh tiểu đường dựa trên dữ liệu mẫu có sẵn.
Các bước thực hiện:
1. Cài đặt thư viện: Đảm bảo bạn đã cài scikit-learn (nếu chưa, dùng lệnh sudo pip install scikit-learn trong terminal)

2. Import các module cần thiết: Chúng ta sẽ cần một số module từ scikit-learn:
-
-
Module
datasetsđể lấy bộ dữ liệu mẫu. -
Hàm
train_test_splitđể chia dữ liệu thành tập huấn luyện và kiểm thử. -
Lớp
LinearRegressionđể tạo mô hình hồi quy tuyến tính.
-
3. Tải dữ liệu mẫu: Scikit-learn có sẵn một số bộ dữ liệu, trong đó có bộ dữ liệu bệnh tiểu đường (diabetes dataset). Ta sẽ load bộ dữ liệu này:
Bộ dữ liệu này gồm nhiều chỉ số y khoa (tuổi, cân nặng, huyết áp, v.v.) trong X và một chỉ số bệnh tiểu đường trong y. Nhiệm vụ của chúng ta là dự đoán y dựa trên X.
-
Chia dữ liệu huấn luyện và kiểm thử: Để đánh giá mô hình, ta chia dữ liệu thành hai phần: một để huấn luyện mô hình, một để kiểm thử độ chính xác:
Ở đây,
test_size=0.2nghĩa là sử dụng 20% dữ liệu làm tập kiểm thử, 80% còn lại để huấn luyện. Hàm này trả về 4 biến: X_train, X_test, y_train, y_test. -
Tạo và huấn luyện mô hình:
Chúng ta khởi tạo một mô hình hồi quy tuyến tính và gọi phương thức
.fit()để huấn luyện nó trên dữ liệu huấn luyện (X_train, y_train). Sau bước này, mô hình đã học được mối quan hệ xấp xỉ giữa các đặc trưng và chỉ số cần dự đoán. -
Dự đoán và đánh giá:
Mô hình đã được huấn luyện, bây giờ ta dùng dữ liệu X_test (mà mô hình chưa thấy bao giờ) để dự đoán các chỉ số tương ứng. Kết quả dự đoán được lưu trong
predictions. Chúng ta in ra để xem qua vài giá trị dự đoán.Tất nhiên, để đánh giá đúng, bạn cần so sánh
predictionsvớiy_test(giá trị thực tế) bằng các chỉ số như MSE, R²,… Ở đây ta chỉ minh họa nên không đi sâu vào đánh giá mô hình.

Dự án này giúp bạn thấy rằng với vài dòng code, Python và scikit-learn đã cho phép chúng ta xây dựng một mô hình học máy cơ bản. Bạn có thể thử in predictions và y_test cạnh nhau để cảm nhận kết quả. Ví dụ:
Kết quả trả về có thể như sau:

Không cần quá bận tâm nếu chưa hiểu rõ những con số này – điều quan trọng là bạn thấy được quy trình làm machine learning trong Python ngắn gọn như thế nào.
Dự án này minh họa cách bạn có thể xây dựng và huấn luyện một mô hình máy học cơ bản bằng ngôn ngữ Python và scikit-learn. Khi đã nắm vững Python cơ bản, bạn hoàn toàn có thể tiếp cận các thư viện phân tích dữ liệu và AI mạnh mẽ như numpy, pandas, matplotlib, TensorFlow, PyTorch,… để khám phá lĩnh vực Khoa học dữ liệu và Trí tuệ nhân tạo.
Dự án 3: Xây dựng website với Django
Python không chỉ mạnh ở kịch bản, khoa học dữ liệu, mà còn rất phổ biến trong phát triển web thông qua các framework như Django, Flask. Trong dự án cuối cùng này, chúng ta sẽ tạo một trang web Python đơn giản sử dụng Django – một web framework mạnh mẽ và “đầy đủ” (batteries-included) của Python.
Chúng ta sẽ tạo một website hiển thị thông điệp “Hello, World!” cơ bản để bạn nắm được quy trình tạo ứng dụng web với Django:
1. Cài đặt Django:
Trước tiên, nếu máy bạn chưa cài Django, hãy dùng pip để cài đặt:
Quá trình này sẽ cài phiên bản Django mới nhất từ PyPI.
2. Tạo dự án Django:
Sau khi cài, Django cung cấp một tiện ích dòng lệnh để tạo bộ khung dự án. Mở terminal, chuyển đến thư mục nơi bạn muốn đặt code, rồi chạy:
Lệnh này sẽ tạo một thư mục mysite/ chứa cấu trúc ban đầu của dự án web (bao gồm các file cấu hình, quản lý,…). Tiếp theo, chuyển vào thư mục dự án:
Bạn sẽ thấy các file như settings.py, urls.py, wsgi.py,… trong thư mục mysite/mysite/. (Django có 2 cấp: ngoài cùng là container project, bên trong là module cấu hình dự án).

3. Tạo ứng dụng (app) Django:
Một dự án Django có thể gồm nhiều ứng dụng con (app) – mỗi app phụ trách một phần chức năng. Ở đây, ta sẽ tạo một app đơn giản tên myapp:
Lệnh trên sẽ tạo thư mục myapp/ với các file cơ bản (models.py, views.py, …). Giờ trong cấu trúc dự án có 2 thư mục chính: mysite/ (project) và myapp/ (application).

4. Tạo view đầu tiên:
Một view trong Django là một hàm (hoặc lớp) chịu trách nhiệm xử lý một request và trả về response. Chúng ta sẽ tạo một view đơn giản trả về chuỗi “Hello, World!”.
Mở file myapp/views.py, thêm nội dung sau:
Hàm home nhận tham số request (một HttpRequest object) và trả về một HttpResponse chứa chuỗi “Hello, World!”. Đây sẽ là trang chủ của chúng ta.
5. Cấu hình URL cho ứng dụng:
Django cần biết khi người dùng truy cập một URL thì gọi view nào. Chúng ta sẽ gắn view vào một URL cụ thể.
-
Mở file
mysite/urls.py(urls.py của project):Dòng
include('myapp.urls')bảo Django tìm thêm cấu hình URL trong filemyapp/urls.py. -
Tiếp theo, tạo file
myapp/urls.py(tạo file mới trong thư mục myapp):File này định nghĩa: với URL pattern rỗng (
'', tức trang gốc của app), sẽ gọi viewhome. Chúng ta import viewhometừmyapp/views.pyđể sử dụng. -
Lưu các thay đổi. Về cơ bản, chúng ta vừa cấu hình để URL trang chủ (http://localhost:8000/) sẽ được phục vụ bởi hàm
homeview vừa tạo.
6. Chạy máy chủ phát triển:
Django có sẵn một web server mini để bạn chạy thử ứng dụng trong quá trình phát triển. Trong thư mục dự án, chạy:

Máy chủ sẽ khởi động (mặc định ở cổng 8000). Mở trình duyệt và truy cập http://127.0.0.1:8000/, bạn sẽ thấy dòng chữ “Hello, World!” xuất hiện trên trình duyệt. Vậy là bạn đã có một trang web Python đầu tiên!

7. Thêm trang HTML (template):
Hiện tại view home trả về text đơn giản. Django hỗ trợ sử dụng template (các file HTML mẫu) để render giao diện đẹp hơn.
-
Tạo thư mục
myapp/templates/myapp(trongmyapp). Django mặc định sẽ tìm template trong thư mục này nếu được cấu hình đúng (mặc định thì app đã cómyapptrong INSTALLED_APPS, Django sẽ quét thư mụctemplates/bên trong app). -
Sửa
mysite/settings.pynhư sau, domyappở đây phải đúng với tên thư mục chứa filemodels.pyvàviews.pycủa bạn.: -
Tạo file
myapp/templates/myapp/home.htmlvới nội dung tối thiểu:Đây là trang HTML đơn giản với tiêu đề và tiêu đề cấp 1 trong body.
-
Sửa lại view
hometrongmyapp/views.pyđể sử dụng template thay vì trả về HttpResponse trực tiếp:Chúng ta sử dụng hàm trợ giúp
renderđể kết hợp request với file template ‘home.html’ và trả về HttpResponse tương ứng. -
Lưu lại và refresh trang web (http://127.0.0.1:8000/). Bây giờ nội dung HTML trong file template sẽ được hiển thị trên trình duyệt, thay cho chuỗi “Hello, World!” đơn điệu trước đó. Bạn sẽ thấy trang web hiển thị dòng chữ lớn “Welcome to My Django Website!” định dạng HTML.

8. Hoàn thiện:
Trang web cơ bản đã chạy. Từ đây, bạn có thể mở rộng:
-
Thêm các trang mới (tạo thêm view, template, URL cho các trang).
-
Kết nối cơ sở dữ liệu để lưu trữ và hiển thị dữ liệu động.
-
Thêm các tính năng như biểu mẫu (form) cho người dùng nhập liệu, hệ thống đăng nhập, v.v.
-
Django cung cấp sẵn admin site (URL
/admin/) để bạn quản lý dữ liệu một cách tiện lợi.
Qua dự án này, bạn đã thấy cách một ứng dụng web Python được cấu thành: có phần routing (URL), phần xử lý (views) và phần giao diện (templates). Django là một framework mạnh mẽ, có đầy đủ mọi thứ từ ORM để truy cập database, đến hệ thống template, form, authentication,… Hãy tiếp tục khám phá và thử nghiệm thêm – ví dụ tạo một trang mới chào người dùng bằng tên họ nhập vào, hay tích hợp Bootstrap để làm đẹp giao diện. Khả năng là vô hạn!
(Dự án Django trên chỉ là điểm khởi đầu, nhưng bạn đã xây dựng thành công một trang web Python đơn giản. Từ đây, bạn có thể mở rộng thêm bằng cách tích hợp cơ sở dữ liệu, tạo các trang phức tạp hơn, xử lý người dùng, v.v. Django là một framework mạnh mẽ cho phát triển web, vì vậy hãy khám phá và tận dụng các khả năng của nó!)
Kết luận
Chúc mừng bạn đã đi đến cuối hành trình học lập trình Python cơ bản từ A đến Z! Trong bài viết này, chúng ta đã cùng nhau khám phá rất nhiều khía cạnh của Python – từ những khái niệm nền tảng như biến, kiểu dữ liệu, vòng lặp, hàm, cho đến những chủ đề nâng cao hơn như lập trình hướng đối tượng, thao tác file hệ thống, và thậm chí xây dựng các dự án thực tế về tự động hóa, machine learning và web với Django.
Điều quan trọng nhất bây giờ là bắt tay vào thực hành. Hãy thử tự mình viết các chương trình nhỏ, sửa đổi các ví dụ cho quen tay, và nghĩ ra những dự án cho riêng bạn. Lập trình là một kỹ năng – bạn sẽ tiến bộ nhanh khi code mỗi ngày. Đừng ngại mắc lỗi, bởi mỗi lần lỗi là một lần bạn học được điều mới (Python sẽ luôn cho bạn biết là bạn đã sai ở đâu!).
Python vào bây giờ và có lẽ cả nhiều năm sau nữa vẫn sẽ là một trong những ngôn ngữ lập trình hàng đầu. Cộng đồng Python rất lớn mạnh và thân thiện, vì vậy khi gặp khó khăn, bạn có thể dễ dàng tìm được sự trợ giúp trên các diễn đàn như Stack Overflow, cộng đồng Facebook, Discord, v.v. Hãy tận dụng tài liệu, các khóa học, và quan trọng nhất là tự mình khám phá qua các dự án thực tiễn.
Hy vọng với kiến thức nền tảng từ hướng dẫn này, bạn sẽ tự tin tiếp tục chinh phục những nấc thang cao hơn trên con đường lập trình: có thể là phát triển ứng dụng web phức tạp hơn, phân tích dữ liệu với pandas, hoặc xây dựng mô hình AI đột phá – tất cả đều trong tầm tay với Python.
Chúc bạn học tốt và lập trình vui vẻ với Python!
#HọcPython2025 #LậpTrìnhPythonCơBản #PythonChoNgườiMới #PythonTựHọc #PythonDjango #TựĐộngHóaVớiPython #KhóaHọcPythonMiễnPhí




