大家好,我是一个工作20多年的老程序员,把自己工作中积累的经验慢慢给大家分享
-begin-函数让代码实现了复用,但如果函数参数个数不固定,比如有时需要计算两个数的和,有时需要计算三个数、四个数的和,总不能每次都定义新函数吧?Python的可变参数就能解决这个问题——它允许函数接收任意数量的参数,灵活应对不同场景,而C语言处理可变参数需要借助专门的库函数,语法复杂且容易出错。
第十三天:可变参数——让函数“按需接收”参数
Python例子:
# 定义带可变参数的函数:计算任意个数的和(*args接收位置参数,打包成元组) def sum_all(*args): total = 0 for num in args: total += num return total # 调用函数,传入不同数量的参数 print("两个数的和:", sum_all(3, 5)) # 8 print("三个数的和:", sum_all(1, 2, 3)) # 6 print("四个数的和:", sum_all(10, 20, 30, 40)) # 100 # 定义带关键字可变参数的函数:打印任意键值对(**kwargs接收关键字参数,打包成字典) def print_kwargs(** kwargs): for key, value in kwargs.items(): print(f"{key}:{value}") # 调用函数,传入不同的关键字参数 print_kwargs(name="张三", age=18, score=90) print_kwargs(city="北京", weather="晴朗") |
运行结果:
两个数的和: 8 三个数的和: 6 四个数的和: 100 name:张三 age:18 score:90 city:北京 weather:晴朗 |
详细分析:
1.位置可变参数(*args):
◦定义函数时,在参数名前加*,表示该参数可以接收任意数量的位置参数。
◦这些参数会被打包成一个元组(tuple),在函数内部可以像遍历元组一样处理。
◦比如sum_all(3,5)中,args就是(3,5);sum_all(1,2,3)中,args就是(1,2,3)。
2.**关键字可变参数(kwargs):
◦定义函数时,在参数名前加**,表示该参数可以接收任意数量的关键字参数(格式为键=值)。
◦这些参数会被打包成一个字典(dictionary),在函数内部可以通过键访问对应的值。
◦比如print_kwargs(name="张三", age=18)中,kwargs就是{"name": "张三", "age": 18}。
3.混合使用:
可变参数可以和普通参数一起使用,但顺序有讲究:普通参数 →*args→**kwargs。例如:
def func(a, b, *args, **kwargs): print("普通参数a:", a) print("普通参数b:", b) print("可变位置参数:", args) print("可变关键字参数:", kwargs) func(1, 2, 3, 4, x=5, y=6) # 输出: # 普通参数a: 1 # 普通参数b: 2 # 可变位置参数: (3, 4) # 可变关键字参数: {'x': 5, 'y': 6} |
对比C语言:
C语言通过<stdarg.h>库处理可变参数,语法复杂:
#include <stdio.h> #include <stdarg.h> // 必须包含该头文件 // 计算n个数的和(n表示参数个数,后面跟n个int类型的数) int sum_all(int n, ...) { va_list args; // 定义参数列表变量 va_start(args, n); // 初始化参数列表,n是最后一个固定参数 int total = 0; for (int i = 0; i < n; i++) { total += va_arg(args, int); // 按int类型获取下一个参数 } va_end(args); // 清理参数列表 return total; } int main() { printf("两个数的和:%d\n", sum_all(2, 3, 5)); // 8(第一个参数2表示后面有2个参数) printf("三个数的和:%d\n", sum_all(3, 1, 2, 3)); // 6 return 0; } |
主要区别:
4.易用性:Python的可变参数通过*和**轻松实现,无需手动指定参数个数和类型;C语言需要用va_list、va_start等宏,还要提前确定参数个数和类型,容易出错(比如类型不匹配会导致结果异常)。
5.参数类型灵活性:Python的*args可以接收任意类型的参数(整数、字符串、列表等);C语言的可变参数需要提前声明类型(如va_arg(args, int)),无法动态处理不同类型。
6.关键字参数支持:Python的**kwargs原生支持关键字参数,调用时更清晰;C语言不支持关键字可变参数,只能按位置传递,参数含义不直观。
7.参数打包形式:Python自动将可变参数打包成元组或字典,方便遍历;C语言需要手动逐个提取参数,代码繁琐。
-end-
如果文章对你有提升,帮忙点赞,分享,关注。非常感谢