🔹 1. Hàm là gì?
Hàm Python là một khối mã có tổ chức, có thể tái sử dụng được dùng để thực hiện một hành động liên quan duy nhất. Các hàm cung cấp tính mô-đun tốt hơn cho ứng dụng của bạn và mức độ tái sử dụng mã cao.
Một cách tiếp cận từ trên xuống để xây dựng logic xử lý bao gồm việc xác định các khối hàm có thể tái sử dụng độc lập. Một hàm Python có thể được gọi từ bất kỳ hàm nào khác bằng cách truyền dữ liệu bắt buộc (được gọi là tham số hoặc đối số). Hàm được gọi sẽ trả kết quả của nó trở lại môi trường gọi.
Dưới đây là bảng phân loại hàm trong Python đã được dịch sang tiếng Việt và trình bày rõ ràng:
STT | Loại hàm | Mô tả |
---|---|---|
1 | Hàm tích hợp sẵn (Built-in functions) | Đây là các hàm có sẵn trong thư viện chuẩn của Python như print() , int() , len() , sum() , v.v… Những hàm này luôn sẵn sàng sử dụng vì được nạp vào bộ nhớ ngay khi Python khởi động. |
2 | Hàm trong các mô-đun tích hợp (Functions defined in built-in modules) | Thư viện chuẩn của Python bao gồm nhiều mô-đun. Mỗi mô-đun định nghĩa một nhóm hàm. Các hàm này không được nạp sẵn, bạn cần phải import mô-đun tương ứng để sử dụng. |
3 | Hàm do người dùng định nghĩa (User-defined functions) | Ngoài các hàm tích hợp sẵn và hàm trong mô-đun, bạn cũng có thể tự định nghĩa hàm theo nhu cầu của mình. Đây là những hàm do người dùng tạo ra để phục vụ mục đích riêng. |
🔹 2. Cú pháp định nghĩa hàm
def tên_hàm(tham_số): # khối lệnh return giá_trị
✔️ Giải thích:
def
: từ khóa dùng để khai báo hàmtên_hàm
: bạn tự đặt, nên rõ nghĩatham_số
(parameters): giá trị truyền vào hàmreturn
: (tùy chọn) trả kết quả về nơi gọi hàm
🔹 3. Ví dụ cơ bản
def chao(): print("Xin chào bạn!") chao() # Gọi hàm
✅ Kết quả:
Xin chào bạn!
🔹 4. Hàm có tham số
def chao_ten(ten): print(f"Xin chào, {ten}!") chao_ten("An")
✅ Kết quả:
Xin chào, An!
🔹 5. Hàm có giá trị trả về (return
)
def tong(a, b): return a + b ket_qua = tong(5, 3) print("Tổng là:", ket_qua)
✅ Kết quả:
Tổng là: 8
🔹 6. Tham số mặc định
def chao(ten="bạn"): print(f"Xin chào, {ten}!") chao() # Xin chào, bạn! chao("Mai") # Xin chào, Mai!
🔹 7. Truyền nhiều giá trị – *args
def tinh_tong(*args): return sum(args) print(tinh_tong(1, 2, 3, 4)) # Tổng: 10
✅ *args
cho phép truyền số lượng tham số không giới hạn
🔹 8. Truyền nhiều cặp key-value – **kwargs
def hien_thi_thong_tin(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") hien_thi_thong_tin(ten="An", tuoi=20, lop="12A")
✅ **kwargs
dùng để truyền nhiều cặp key-value
🔹 9. Biến cục bộ và biến toàn cục
x = 10 # biến toàn cục def ham(): x = 5 # biến cục bộ print("Trong hàm:", x) ham() print("Ngoài hàm:", x)
✅ Kết quả:
Trong hàm: 5 Ngoài hàm: 10
🔹 10. Hàm gọi trong hàm
def binh_phuong(x): return x * x def tinh_tong_binh_phuong(a, b): return binh_phuong(a) + binh_phuong(b) print(tinh_tong_binh_phuong(2, 3)) # Kết quả: 13
🔁 Truyền tham trị và truyền tham chiếu trong Python
Trong một số ngôn ngữ lập trình như C và C++, có hai cách chính để truyền biến vào hàm:
Thuật ngữ tiếng Anh | Dịch tiếng Việt | Mô tả |
---|---|---|
Call by Value | Truyền tham trị | Khi biến được truyền vào hàm, giá trị của biến thực (actual argument) sẽ được sao chép vào tham số (formal argument). Bất kỳ thay đổi nào trong tham số không ảnh hưởng đến biến gốc bên ngoài hàm. |
Call by Reference | Truyền tham chiếu | Khi biến được truyền vào hàm, một tham chiếu (địa chỉ) đến vùng nhớ của biến thực được truyền vào. Tức là tham số và biến thực cùng trỏ tới một vùng nhớ, do đó thay đổi giá trị trong hàm sẽ làm thay đổi giá trị bên ngoài. |
Python không hoàn toàn là truyền tham trị hay tham chiếu – mà là:
✅ Truyền đối tượng theo tham chiếu (object reference)
🎯 Nếu đối tượng có thể thay đổi (mutable) → thay đổi sẽ ảnh hưởng ra ngoài.
🛡️ Nếu đối tượng không thay đổi được (immutable) → thay đổi không ảnh hưởng ra ngoài.
📌 Tóm tắt:
Kiểu dữ liệu | Có thay đổi được không? | Thay đổi trong hàm ảnh hưởng ra ngoài? |
---|---|---|
int , float , str , tuple | ❌ Không thay đổi được (immutable) | ❌ Không |
list , dict , set | ✅ Có thể thay đổi (mutable) | ✅ Có |
🧩 Tổng kết kiến thức về hàm
Nội dung | Mô tả |
---|---|
def | Khai báo hàm |
return | Trả giá trị về |
*args | Nhận nhiều tham số không tên |
**kwargs | Nhận nhiều cặp key-value |
Tham số mặc định | Có giá trị khi không truyền vào |
Biến cục bộ / toàn cục | Phạm vi của biến trong và ngoài hàm |
🔹 Các bài tập về hàm
✅ Bài 1: Viết hàm tính diện tích hình chữ nhật
Viết hàm dien_tich_chu_nhat(dai, rong)
trả về diện tích hình chữ nhật.
def dien_tich_chu_nhat(dai, rong): return dai * rong print("Diện tích:", dien_tich_chu_nhat(5, 3))
✅ Bài 2: Viết hàm kiểm tra số nguyên tố
Hàm la_so_nguyen_to(n)
kiểm tra xem số n
có phải số nguyên tố không.
def la_so_nguyen_to(n): if n < 2: return False for i in range(2, int(n ** 0.5) + 1): if n % i == 0: return False return True print(la_so_nguyen_to(7)) # True print(la_so_nguyen_to(10)) # False
✅ Bài 3: Viết hàm tính giai thừa
Hàm giai_thua(n)
trả về giai thừa của số n
.
def giai_thua(n): if n == 0 or n == 1: return 1 return n * giai_thua(n - 1) print(giai_thua(5)) # 120
✅ Bài 4: Viết hàm kiểm tra số chẵn hay lẻ
Hàm chan_le(n)
in ra "Chẵn"
hoặc "Lẻ"
.
def chan_le(n): if n % 2 == 0: print("Chẵn") else: print("Lẻ") chan_le(10) # Chẵn chan_le(7) # Lẻ
✅ Bài 5: Viết hàm tính tổng các số chia hết cho 3 từ 1 đến n
def tong_chia_het_cho_3(n): tong = 0 for i in range(1, n + 1): if i % 3 == 0: tong += i return tong print(tong_chia_het_cho_3(10)) # 3 + 6 + 9 = 18