page contents

用*args和**kwargs,让你的Python更灵活

我见过太多Python新手写函数时把参数写得死死的。他们定义函数就像在填表格,每个位置都要对号入座,少一个参数就报错,多一个参数就崩溃。你肯定也遇到过这种情况:写了一个函数,第二天加了个需求,结果要改所有调用这个函数的地方。头疼不头疼?

attachments-2026-08-13b9yOCs6a7bccdcd1793.png

我见过太多Python新手写函数时把参数写得死死的。他们定义函数就像在填表格,每个位置都要对号入座,少一个参数就报错,多一个参数就崩溃。你肯定也遇到过这种情况:写了一个函数,第二天加了个需求,结果要改所有调用这个函数的地方。头疼不头疼?

别急,Python给了你两颗解药:args 和 kwargs。这两兄弟能让你的函数变得像橡皮泥一样柔软,想怎么捏就怎么捏。

先说 args。它能把多个位置参数打包成一个元组。举个例子,你要写一个计算总分的函数。以前你可能会写:

def sum_score(score1, score2, score3):    return score1 + score2 + score3

这个函数死板得不行。要是今天考了四门课,明天考了五门课,你得改定义,还得改所有调用。用args就简单了:

def sum_score(args): 

   total = 0

   for score in args:

       total += score

    return total

 

现在你可以随便传几个分数进去,三个也行,十个也行。函数里args就是一个包含所有分数的元组,你爱怎么处理都行。

kwargs就更灵活了。它把关键字参数打包成一个字典。比如你要记录一个学生的信息,要写一个print_student_info函数。如果用固定参数,你得写一堆重复代码,还得担心漏掉某个字段。用kwargs试试:

def print_student_info(kwargs): 

   for key, value in kwargs.items():

        print(f'{key}: {value}')

 

调用的时候,你可以随意添加学生属性。

print_student_info(name='小明', age=18, score=95) print_student_info(name='小红', height=165, weight=50, city='北京')

看到没有,同一个函数处理了不同数量的属性信息,完全不需要改动函数本身。这就是灵活性的价值。

实际开发中,args和kwargs最常见的用法是包装函数。比如你要写一个日志装饰器,记录每次函数调用的参数:

def log_call(func): 

   def wrapper(args, kwargs):

       print(f'调用函数 {func.__name__}')

       print(f'位置参数: {args}')

       print(f'关键字参数: {kwargs}')

       return func(args, kwargs)

    return wrapper

 

这个装饰器可以加在任何函数上,不管函数参数长什么样,它都能正确记录。你不需要知道原函数有多少个参数,也不用管它们是位置参数还是关键字参数。args和kwargs在这里起到了一个万能接口的作用。

还有一个场景能让你体会到它的好处。当你在写一个类,你需要把某些参数传给父类的初始化方法:

class Child(Parent): 

   def __init__(self, child_attr, args, kwargs):

       self.child_attr = child_attr

        super().__init__(args, kwargs)

 

这种写法能让你的子类透明地支持父类的所有参数。你不必知道父类需要什么参数,只要把剩下的参数原样传过去就行。这比你手动复制父类参数列表要干净得多。

要注意的是,不要太贪心。如果你的函数只有两三个明确的参数,就不要滥用args和kwargs。写上def add(a, b)就足够清晰了,强行写成def add(args)反而会让读代码的人猜来猜去。灵活不等于模糊,好的代码应该是清晰且灵活的。

你可能会觉得这个东西用不上,等你自己写出一个被七八个地方调用的函数,然后突然要加一个参数时,你就会想起它。改参数列表改到吐的时候,回头看这篇文章。你会感谢Python给了你args和kwargs。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2307 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. Pack 2307 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章