Python – Module 7 – Xây dựng khối lệnh riêng (Hàm – Functions) 🧱
Hãy nghĩ về Minecraft hoặc Lego. Thay vì mỗi lần lại xây cùng một ngôi nhà từng viên gạch một, sẽ tuyệt hơn nếu bạn có một bản thiết kế giúp dựng cả ngôi nhà ngay lập tức, đúng không?
Trong Python, chúng ta dùng Hàm (Functions) để gom một đoạn code lại, đặt cho nó một cái tên, rồi tái sử dụng bất cứ lúc nào – mà không cần gõ lại toàn bộ!
1. Định nghĩa một hàm
Bạn đã biết dùng các hàm có sẵn như print(), input(), len(). Giờ là lúc tự xây hàm của riêng mình! Chúng ta bắt đầu với từ khóa def (viết tắt của define – định nghĩa).
⚠️ Quy tắc mới: Luôn khai báo kiểu cho tham số! Từ nay trở đi, mọi hàm bạn viết phải chỉ định rõ kiểu dữ liệu của từng tham số bằng type hints. Điều này giúp code rõ ràng hơn và dễ bắt lỗi hơn.
Ví dụ: Hiệu ứng Lên Cấp

📝 -> None có nghĩa là “hàm này không trả về gì cả.” Chúng ta sẽ học về kiểu trả về ngay sau đây!
2. Truyền thông tin cho hàm (Tham Số & Đối Số)
Hàm sẽ hay hơn nhiều nếu nó có thể thay đổi hành vi dựa trên thông tin bạn đưa vào. Chúng ta truyền thông tin bằng tham số (parameters) – tên biến bên trong def – và đối số (arguments) – giá trị thực tế khi gọi hàm.
🔑 Luôn ghi chú kiểu cho tham số của bạn!
Ví dụ A: Chào Đón Anh Hùng

Ví dụ B: Tiêu Vàng Trong Cửa Hàng

Bạn có để ý không? Các biến ten_nhan_vat, cap_do, vang, gia_binh, ten_binh chỉ tồn tại bên trong hàm. Khi hàm chạy xong, chúng biến mất! Ta gọi đây là biến cục bộ (local variables).
3. Nhận kết quả trả về (return)
Hàm không chỉ làm mọi việc – chúng còn có thể tính toán và trả lại kết quả bằng từ khóa return. Khi hàm trả về giá trị, bạn phải khai báo kiểu trả về với ->.
🎯 Quy tắc: Luôn viết -> <kiểu_dữ_liệu> sau dấu ngoặc đơn để khai báo hàm trả về kiểu gì.
Ví dụ A: Tính Sát Thương Tấn Công

Ví dụ B: Kiểm Tra Có Đủ Điểm Kinh Nghiệm Lên Cấp?

Ví dụ C: Ghép Đồ Từ Nguyên Liệu (Nhiều return)

💡 print() hay return? Dùng print() khi bạn chỉ muốn con người nhìn thấy kết quả trên màn hình. Dùng return khi bạn muốn máy tính ghi nhớ đáp án để dùng tiếp trong code.
4. Type Hints – Bảng tham khảo đầy đủ
Dưới đây là các kiểu dữ liệu phổ biến nhất bạn sẽ dùng trong code game:

Mẫu Hàm Đầy Đủ Với Type Hints

5. Thực hành tương tác: “Hệ thống chiến đấu RPG” 🎮
Nhiệm Vụ Của Bạn: Bạn đang lập trình hệ thống chiến đấu cho trận đấu trùm trong game RPG! Hãy viết ba hàm với type hints đầy đủ.
Nhiệm vụ 1: tinh_sat_thuong()
Viết hàm nhận vào sức mạnh của trùm (int) và giáp của người chơi (int), trả về sát thương cuối cùng (int).

Nhiệm vụ 2: la_don_chi_mang()
Viết hàm nhận vào chỉ số may mắn (int) và trả về True nếu là đòn chí mạng (may mắn >= 7), False nếu không.

Nhiệm vụ 3: tan_cong_cua_trum()
Tổng hợp lại! Hàm này nhận sức mạnh của trùm, giáp người chơi, và may mắn người chơi, rồi in ra kết quả tấn công.

6. Thử thách: “Quản lý túi đồ” 🎯
Xây dựng hệ thống túi đồ đơn giản cho game phiêu lưu!

7. Thử thách trùm: “Đấu trường Kéo Búa Bao” 🏆
Viết một mini-game hoàn chỉnh nơi hai người chơi đối đầu! Bạn cần:
- lay_lua_chon(ten_nguoi_choi: str) -> str — hỏi người chơi chọn kéo/búa/bao
- xac_dinh_nguoi_thang(chon_p1: str, chon_p2: str) -> str — trả về “Người chơi 1”, “Người chơi 2”, hoặc “Hòa”
- choi_mot_van() -> None — chạy một ván đấu hoàn chỉnh

8. Danh sách kiểm tra Type Hints (Phải Tuân Thủ!) 📋
Mọi hàm bạn viết từ nay trở đi phải bao gồm:
- ☐ Kiểu tham số: def ham(ten: str, tuoi: int):
- ☐ Kiểu trả về: def ham(…) -> str:
- ☐ Dùng -> None nếu hàm không trả về gì
- ☐ Biến cục bộ cũng nên có type hint: ket_qua: int = 5
9. Tổng kết Module
| Khái niệm | Cú pháp | Ví dụ |
|---|---|---|
| Định nghĩa hàm | def ten_ham(tham_so): | def tan_cong(suc_manh: int) -> int: |
| Gọi hàm | ten_ham(doi_so) | sat_thuong = tan_cong(25) |
| Kiểu tham số | tham_so: kieu | ten: str, mau: int, toc_do: float |
| Kiểu trả về | -> kieu sau dấu ngoặc đơn | -> int, -> str, -> bool, -> None |
| Trả về giá trị | return gia_tri | return sat_thuong |
| Biến cục bộ | Chỉ tồn tại bên trong hàm | tong: int = suc_manh * he_so (trong hàm) |
- def dùng để tạo hàm của riêng bạn (bản thiết kế code!).
- Bạn phải gọi hàm thì nó mới thực sự chạy.
- Hàm nhận đối số để tùy chỉnh hành vi.
- Hàm có thể trả về kết quả đã tính toán cho nơi gọi nó.
- Luôn dùng type hints cho tham số và kiểu trả về!
Sẵn sàng cho Trùm Cuối chưa? Trong Module 8, chúng ta sẽ tổng hợp tất cả mọi thứ đã học để xây dựng một game phiêu lưu văn bản hoành tráng! 🐉
(Continue)

vuanhduc2685@gmail.com
hoanvtt99@gmail.com
