Functions (hàm) là một phần quan trọng trong lập trình Python, giúp tổ chức mã nguồn thành các khối logic, dễ quản lý và tái sử dụng. Hàm cho phép bạn thực hiện các tác vụ cụ thể và có thể được gọi từ bất kỳ đâu trong chương trình. Bài viết này sẽ hướng dẫn chi tiết về hàm trong Python, bao gồm các chủ đề như các loại hàm trong Python, định nghĩa hàm, gọi hàm, truyền tham chiếu và giá trị, các loại đối số hàm, hàm ẩn danh, phạm vi của biến, và sự khác biệt giữa biến toàn cục và biến cục bộ.
Các loại hàm trong Python
Python hỗ trợ hai loại hàm chính:
- Hàm tích hợp sẵn (Built-in Functions): Các hàm này được cung cấp sẵn bởi Python và có thể được sử dụng trực tiếp mà không cần định nghĩa. Ví dụ:
print()
,len()
,type()
, v.v. - Hàm do người dùng định nghĩa (User-defined Functions): Các hàm này được định nghĩa bởi người dùng để thực hiện các tác vụ cụ thể.
Định nghĩa hàm trong Python (Defining a Python Function)
Để định nghĩa một hàm trong Python, bạn sử dụng từ khóa def
theo sau là tên hàm, danh sách các tham số trong dấu ngoặc đơn, và dấu hai chấm. Khối mã của hàm được thụt lề dưới dòng định nghĩa hàm.
Cú pháp định nghĩa hàm
python
def function_name(parameters):
"""Docstring"""
# Khối mã của hàm
return value
Ví dụ về định nghĩa hàm
python
def greet(name):
"""Hàm này in ra lời chào với tên được cung cấp."""
print(f"Hello, {name}!")
Gọi hàm trong Python
Để gọi một hàm, bạn sử dụng tên hàm theo sau là dấu ngoặc đơn chứa các đối số (nếu có).
Ví dụ về gọi hàm
python
# Định nghĩa hàm
def greet(name):
print(f"Hello, {name}!")
# Gọi hàm
greet("Alice")
Truyền tham chiếu và giá trị
Trong Python, các đối số được truyền cho hàm theo cơ chế "truyền tham chiếu" (pass by reference). Điều này có nghĩa là nếu bạn thay đổi giá trị của đối số bên trong hàm, thay đổi đó sẽ ảnh hưởng đến biến gốc bên ngoài hàm.
Ví dụ về truyền tham chiếu
python
def modify_list(lst):
lst.append(4)
print("Bên trong hàm:", lst)
my_list = [1, 2, 3]
modify_list(my_list)
print("Bên ngoài hàm:", my_list)
Các loại đối số hàm trong Python
Python hỗ trợ nhiều loại đối số hàm khác nhau, bao gồm:
- Đối số vị trí hoặc bắt buộc (Positional or Required Arguments)
- Đối số từ khóa (Keyword Arguments)
- Đối số mặc định (Default Arguments)
- Đối số chỉ từ khóa (Keyword-only Arguments)
- Đối số chỉ vị trí (Positional-only Arguments)
- Đối số tùy ý hoặc có độ dài biến đổi (Arbitrary or Variable-length Arguments)
Đối số vị trí hoặc bắt buộc (Positional or Required Arguments)
Đối số vị trí là các đối số được truyền cho hàm theo thứ tự mà chúng được định nghĩa.
Ví dụ về đối số vị trí
python
def add(a, b):
return a + b
result = add(5, 3)
print("Kết quả:", result)
Đối số từ khóa
Đối số từ khóa là các đối số được truyền cho hàm bằng cách sử dụng tên của chúng.
Ví dụ về đối số từ khóa
python
def greet(name, message):
print(f"{message}, {name}!")
greet(name="Alice", message="Good morning")
Đối số mặc định
Đối số mặc định là các đối số có giá trị mặc định. Nếu không có giá trị nào được truyền cho chúng, giá trị mặc định sẽ được sử dụng.
Ví dụ về đối số mặc định
python
def greet(name, message="Hello"):
print(f"{message}, {name}!")
greet("Alice")
greet("Bob", "Good evening")
Đối số chỉ từ khóa
Đối số chỉ từ khóa là các đối số phải được truyền bằng từ khóa. Chúng được định nghĩa sau dấu *
trong danh sách tham số.
Ví dụ về đối số chỉ từ khóa
python
def greet(*, name, message="Hello"):
print(f"{message}, {name}!")
greet(name="Alice")
greet(name="Bob", message="Good evening")
Đối số chỉ vị trí
Đối số chỉ vị trí là các đối số phải được truyền theo vị trí. Chúng được định nghĩa trước dấu /
trong danh sách tham số.
Ví dụ về đối số chỉ vị trí
python
def greet(name, /, message="Hello"):
print(f"{message}, {name}!")
greet("Alice")
greet("Bob", message="Good evening")
Đối số tùy ý hoặc có độ dài biến đổi
Đối số tùy ý cho phép bạn truyền một số lượng đối số không xác định cho hàm. Chúng được định nghĩa bằng cách sử dụng dấu *
hoặc **
.
*args
: Đối số vị trí tùy ý.**kwargs
: Đối số từ khóa tùy ý.
Ví dụ về đối số tùy ý
python
def add(*args):
return sum(args)
result = add(1, 2, 3, 4, 5)
print("Kết quả:", result)
def greet(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
greet(name="Alice", message="Good morning", age=25)
Hàm Python với giá trị trả về
Hàm trong Python có thể trả về giá trị bằng cách sử dụng từ khóa return
. Nếu không có giá trị nào được trả về, hàm sẽ trả về None
.
Ví dụ về hàm với giá trị trả về
python
def add(a, b):
return a + b
result = add(5, 3)
print("Kết quả:", result)
Hàm ẩn danh
Hàm ẩn danh, còn được gọi là hàm lambda, là các hàm không có tên và được định nghĩa bằng từ khóa lambda
. Chúng thường được sử dụng cho các tác vụ đơn giản và ngắn gọn.
Cú pháp của hàm lambda
python
lambda arguments: expression
Ví dụ về hàm lambda
python
# Hàm lambda để cộng hai số
add = lambda a, b: a + b
print("Kết quả:", add(5, 3))
# Hàm lambda để tính bình phương của một số
square = lambda x: x ** 2
print("Bình phương của 4 là:", square(4))
Phạm vi của biến
Phạm vi của biến xác định nơi mà biến có thể được truy cập. Python có hai loại phạm vi chính:
- Phạm vi cục bộ (Local Scope): Biến được định nghĩa bên trong một hàm và chỉ có thể được truy cập bên trong hàm đó.
- Phạm vi toàn cục (Global Scope): Biến được định nghĩa bên ngoài tất cả các hàm và có thể được truy cập từ bất kỳ đâu trong chương trình.
Ví dụ về phạm vi cục bộ và toàn cục
python
x = 10 # Biến toàn cục
def my_function():
y = 5 # Biến cục bộ
print("Bên trong hàm, x:", x)
print("Bên trong hàm, y:", y)
my_function()
print("Bên ngoài hàm, x:", x)
# print("Bên ngoài hàm, y:", y) # Sẽ gây ra lỗi vì y là biến cục bộ
Biến toàn cục và biến cục bộ
Biến toàn cục có thể được truy cập từ bất kỳ đâu trong chương trình, trong khi biến cục bộ chỉ có thể được truy cập từ bên trong hàm mà nó được định nghĩa. Để thay đổi giá trị của biến toàn cục từ bên trong hàm, bạn cần sử dụng từ khóa global
.
Ví dụ về biến toàn cục và biến cục bộ
python
x = 10 # Biến toàn cục
def my_function():
global x
x = 5 # Thay đổi giá trị của biến toàn cục
print("Bên trong hàm, x:", x)
my_function()
print("Bên ngoài hàm, x:", x)
Kết luận
Hàm là một phần quan trọng trong lập trình Python, giúp tổ chức mã nguồn thành các khối logic, dễ quản lý và tái sử dụng. Bài viết này đã giới thiệu chi tiết về các loại hàm trong Python, cách định nghĩa và gọi hàm, truyền tham chiếu và giá trị, các loại đối số hàm, hàm ẩn danh, phạm vi của biến, và sự khác biệt giữa biến toàn cục và biến cục bộ. Hy vọng rằng bạn đã có thể hiểu rõ hơn về cách sử dụng hàm trong Python và sẵn sàng viết mã Python của riêng mình.