Menu
CoddyTech

*args 参数

本课属于 Coddy Python 学习旅程的“面向对象编程”单元。第 42 课,共 64 课。

*args 参数允许方法接受任意数量的位置参数。星号会将所有额外的位置参数收集到一个元组中。

下面是一个使用 *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}")

用不同数量的参数调用该方法:

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 会将所有参数收集到一个元组中:

calc.show_numbers(5, 10, 15, 20)

输出:

Number 1: 5
Number 2: 10
Number 3: 15
Number 4: 20

将常规参数与 *args 结合使用:

class Logger:
    def log_message(self, level, *messages):
        print(f"[{level}]", end=" ")
        for message in messages:
            print(message, end=" ")
        print()  # 换行

logger = Logger()
logger.log_message("INFO", "User", "logged", "in")
logger.log_message("ERROR", "Connection", "failed")

在构造方法中使用 *args:

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()

输出:

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
- Diana

调用方法时,你也可以解包参数:

numbers = [1, 2, 3, 4, 5]
result = calc.add_numbers(*numbers)  # 解包列表
print(result)  # 15

要点:*args 会将任意数量的位置参数收集到一个元组中。当你不知道会向方法传入多少个参数时,就可以使用它。args 这个名称是约定俗成的。星号后面可以使用任何名称,但 args 是标准写法。

challenge icon

挑战

简单

在这个挑战中,你将实现一个灵活的数字工具函数。

编辑 number_utils.py 文件,实现 sum_all_numbers 函数。这个函数接受任意数量的数值参数,并返回它们的和。函数应当:

  • 如果没有提供参数,则返回 0
  • 如果提供了非数值参数,则打印 "Error: All arguments must be numbers" 并返回 None
  • 布尔值(True / False)不算作这里的数字,也必须被拒绝,即使 bool 是 int 的子类

number_utils.py 文件中包含详细的 TODO 注释,可指导你完成实现。请仔细遵循这些注释,确保你的答案满足所有要求。

亲手试试

from number_utils import sum_all_numbers

# 综合测试用例处理程序
test_case = input()

if test_case == "basic_test":
    # 用正整数测试基本功能
    print(sum_all_numbers(1, 2, 3))  # 应返回 6
    print(sum_all_numbers())  # 应返回 0
    print(sum_all_numbers(10, 20, 30, 40))  # 应返回 100
    print(sum_all_numbers(1, 2, "three"))  # 应输出错误并返回 None

elif test_case == "float_test":
    # 用浮点数测试
    print(sum_all_numbers(1.1, 2.2, 3.3))  # 应返回 6.6
    print(sum_all_numbers(5.5, 5.0))  # 应返回 10.5

elif test_case == "mixed_numbers_test":
    # 用整数和浮点数的组合测试
    print(sum_all_numbers(5, 5.5))  # 应返回 10.5
    print(sum_all_numbers(10, 20.5, 30, 40))  # 应返回 100.5

elif test_case == "zero_values_test":
    # 用零值测试
    print(sum_all_numbers(0, 0, 0))  # 应返回 0
    print(sum_all_numbers(0))  # 应返回 0
    print(sum_all_numbers())  # 应返回 0

elif test_case == "negative_values_test":
    # 测试负数值
    print(sum_all_numbers(-1, -2, -3))  # 应返回 -6
    print(sum_all_numbers(-5, -5))  # 应返回 -10
    print(sum_all_numbers(-5, 5))  # 应返回 0

elif test_case == "large_values_test":
    # 测试非常大的值
    print(sum_all_numbers(1000000000, 1000000000))  # 应返回 2000000000
    print(sum_all_numbers(1000000000, 2000000000.5))  # 应返回 3000000000.5

elif test_case == "single_value_test":
    # 测试单个值
    print(sum_all_numbers(5))  # 应返回 5
    print(sum_all_numbers(-10))  # 应返回 -10
    print(sum_all_numbers(3.5))  # 应返回 3.5

elif test_case == "error_handling_test":
    # 测试各种非数字值
    print(sum_all_numbers("string"))  # 应输出错误并返回 None
    print(sum_all_numbers([1, 2, 3]))  # 应输出错误并返回 None
    print(sum_all_numbers({"key": "value"}))  # 应输出错误并返回 None
    print(sum_all_numbers(True))  # 应输出错误并返回 None
    print(sum_all_numbers(None))  # 应输出错误并返回 None

elif test_case == "mixed_valid_invalid_test":
    # 测试有效值和无效值的混合情况
    print(sum_all_numbers(1, 2, "three"))  # 应输出错误并返回 None
    print(sum_all_numbers(1, [2, 3], 4))  # 应输出错误并返回 None
    print(sum_all_numbers(1.5, "two", 3))  # 应输出错误并返回 None

elif test_case == "empty_args_test":
    # 测试不传参数的情况
    print(sum_all_numbers())  # 应返回 0
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Python 在线编译器