Tham số *args
Thuộc phần Lập trình hướng đối tượng trong hành trình Python của Coddy. Bài học 42 trên 64.
Tham số (parameter) *args cho phép một phương thức (method) nhận bất kỳ số lượng đối số vị trí (positional arguments) nào. Dấu hoa thị gom tất cả đối số vị trí bổ sung vào một tuple.
Đây là ví dụ về một phương thức (method) sử dụng *args:
class Calculator:
def add_numbers(self, *args):
return sum(args)
def show_numbers(self, *args):
for i, num in enumerate(args):
print(f"Number {i+1}: {num}")Gọi phương thức với số lượng đối số khác nhau:
calc = Calculator()
result1 = calc.add_numbers(1, 2, 3)
result2 = calc.add_numbers(10, 20, 30, 40, 50)
print(result1) # 6
print(result2) # 150*args gom tất cả đối số vào một tuple:
calc.show_numbers(5, 10, 15, 20)Đầu ra:
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20Kết hợp tham số thông thường với *args:
class Logger:
def log_message(self, level, *messages):
print(f"[{level}]", end=" ")
for message in messages:
print(message, end=" ")
print() # Xuống dòng
logger = Logger()
logger.log_message("INFO", "User", "logged", "in")
logger.log_message("ERROR", "Connection", "failed")Sử dụng *args trong các phương thức hàm khởi tạo:
class Team:
def __init__(self, team_name, *players):
self.team_name = team_name
self.players = list(players)
def show_team(self):
print(f"Team: {self.team_name}")
for player in self.players:
print(f"- {player}")
team = Team("Warriors", "Alice", "Bob", "Charlie", "Diana")
team.show_team()Đầu ra:
6
150
Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20
[INFO] User logged in
[ERROR] Connection failed
Team: Warriors
- Alice
- Bob
- Charlie
- DianaBạn cũng có thể giải nén các đối số khi gọi phương thức:
numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers) # Giải nén danh sách
print(result) # 15Điểm chính: *args gom mọi số lượng đối số vị trí vào một tuple. Dùng nó khi bạn không biết sẽ truyền bao nhiêu đối số cho một phương thức. Tên args là tên theo quy ước. Bạn có thể dùng bất kỳ tên nào sau dấu hoa thị, nhưng args là tên tiêu chuẩn.
Thử thách
DễTrong thử thách này, bạn sẽ triển khai một hàm tiện ích linh hoạt để xử lý số.
Chỉnh sửa tệp number_utils.py để triển khai hàm sum_all_numbers, hàm này chấp nhận số lượng đối số kiểu số bất kỳ và trả về tổng của chúng. Hàm cần:
- Trả về 0 nếu không có đối số nào được cung cấp
- In ra "Error: All arguments must be numbers" và trả về None nếu có bất kỳ đối số nào không phải kiểu số
- Không xem giá trị Boolean (
True/False) là số trong trường hợp này và cũng phải từ chối chúng, mặc dùboollà lớp con củaint
Tệp number_utils.py có các chú thích TODO chi tiết để hướng dẫn bạn triển khai. Hãy làm theo các chú thích này cẩn thận để lời giải đáp ứng mọi yêu cầu.
Tự làm thử
from number_utils import sum_all_numbers
# Xử lý toàn diện các test case
test_case = input()
if test_case == "basic_test":
# Kiểm tra chức năng cơ bản với các số nguyên dương
print(sum_all_numbers(1, 2, 3)) # Trả về 6
print(sum_all_numbers()) # Trả về 0
print(sum_all_numbers(10, 20, 30, 40)) # Trả về 100
print(sum_all_numbers(1, 2, "three")) # In ra lỗi và trả về None
elif test_case == "float_test":
# Kiểm tra với các số thực
print(sum_all_numbers(1.1, 2.2, 3.3)) # Trả về 6.6
print(sum_all_numbers(5.5, 5.0)) # Trả về 10.5
elif test_case == "mixed_numbers_test":
# Kiểm tra với cả số nguyên và số thực
print(sum_all_numbers(5, 5.5)) # Trả về 10.5
print(sum_all_numbers(10, 20.5, 30, 40)) # Trả về 100.5
elif test_case == "zero_values_test":
# Kiểm tra với các giá trị bằng 0
print(sum_all_numbers(0, 0, 0)) # Trả về 0
print(sum_all_numbers(0)) # Trả về 0
print(sum_all_numbers()) # Trả về 0
elif test_case == "negative_values_test":
# Kiểm tra với các giá trị âm
print(sum_all_numbers(-1, -2, -3)) # Trả về -6
print(sum_all_numbers(-5, -5)) # Trả về -10
print(sum_all_numbers(-5, 5)) # Trả về 0
elif test_case == "large_values_test":
# Kiểm tra với các giá trị rất lớn
print(sum_all_numbers(1000000000, 1000000000)) # Trả về 2000000000
print(sum_all_numbers(1000000000, 2000000000.5)) # Trả về 3000000000.5
elif test_case == "single_value_test":
# Kiểm tra với một giá trị duy nhất
print(sum_all_numbers(5)) # Trả về 5
print(sum_all_numbers(-10)) # Trả về -10
print(sum_all_numbers(3.5)) # Trả về 3.5
elif test_case == "error_handling_test":
# Kiểm tra với nhiều giá trị không phải số
print(sum_all_numbers("string")) # In ra lỗi và trả về None
print(sum_all_numbers([1, 2, 3])) # In ra lỗi và trả về None
print(sum_all_numbers({"key": "value"})) # In ra lỗi và trả về None
print(sum_all_numbers(True)) # In ra lỗi và trả về None
print(sum_all_numbers(None)) # In ra lỗi và trả về None
elif test_case == "mixed_valid_invalid_test":
# Kiểm tra với cả giá trị hợp lệ và không hợp lệ
print(sum_all_numbers(1, 2, "three")) # In ra lỗi và trả về None
print(sum_all_numbers(1, [2, 3], 4)) # In ra lỗi và trả về None
print(sum_all_numbers(1.5, "two", 3)) # In ra lỗi và trả về None
elif test_case == "empty_args_test":
# Kiểm tra khi không có đối số
print(sum_all_numbers()) # Trả về 0Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Lập trình hướng đối tượng
1Nền tảng về lập trình hướng đối tượng
Tệp bên ngoàiGiới thiệu về lập trình hướng đối tượngLớp và đối tượngTham số selfPhương thứcThuộc tínhPhương thức khởi tạo (__init__)Ôn tập: máy tính đơn giản4Kế thừa
Kế thừa cơ bảnHàm super()Ghi đè phương thứcKế thừa đa lớpThứ tự phân giải phương thứcÔn tập: hệ thống phân cấp nhân viên2Decorator
Giới thiệu về decoratorDecorator thuộc tínhDecorator phương thức tĩnhDecorator phương thức lớp5Tính đa hình
Xem lại cách ghi đè phương thứcKiểu gõ vịtLớp và phương thức trừu tượngThiết kế giao diệnÔn tập: máy tính hình học8Các khái niệm OOP nâng cao
Kết hợp và kế thừaMixinPhương thức tĩnh và phương thức lớpDecorator lớpTrình quản lý ngữ cảnhTự luyện tập: Trình biên dịch Python online