资源行业动态不要再乱用 *args 和 **kwargs 啦 (Python)

不要再乱用 *args 和 **kwargs 啦 (Python)

2020-02-19 | |  58 |   0

原标题: 不要再乱用 *args 和 **kwargs 啦 (Python)

来源:AI 研习社     链接:https://www.yanxishe.com/TextTranslation/2407



网上有很多教程,目的是教你在用Python定义函数时如何使用*args和**kwargs。也许你已经花了好几个小时想办法释放他们的潜能。也许,经过这么多的研究,你现在对他们有信心了。


不要掉以轻心

强大工具通常伴随着危险,虽然他们可以让你轻松些,但记住我的话,它可能会影响你后续的步骤。

为什么呢?

一些基本知识


Python函数中的参数可以接受两种类型的参数:



1、按位置传递的位置参数。


2、关键字提供的关键字参数。

def foo(start, end):
    print(start, end)

例如,foo('Hi',end='Bye!')提供位置参数“Hi”和关键字参数“Bye!”使用关键字end to function foo。函数的参数是预先定义的;函数中接受的参数数是固定的。然而,情况并非总是如此。

*args允许您向函数传递任意数量的位置参数。星号*是一个解包参数。它们在函数中打包为一个iterable元组。


image.png  

另一方面,kwargs允许向函数传递不同数量的关键字参数。由于每个关键字参数都有一个关键字和一个值,因此它在函数中被分组为一个iterable字典。

image.png

  图片来自   Unsplash的 Susan Holt Simpson

问题

在大多数情况下,您不需要*args和**kwargs。您多久不知道一个预定义函数应该接收多少个参数?

如果您滥用代码,则很难调试代码,因为您正在将任意数量的参数传递给函数,并且函数可能具有不可预知的行为。

显式比隐式好。-python之禅  

什么时候用?

简而言之:在你真正需要的时候使用它们。例如,一个有很多可选字段的函数,其中一些只在某些情况下使用。例如,一个函数绘制一个图形,您可以传递各种可选参数来修改其颜色、样式、大小等。

每次使用*args和/或**kwargs时,请确保文档非常清晰,以避免混淆。

有一种情况下,它们的使用可能是不可避免的。如果要为具有未知参数的函数创建包装器,则必须接受任意数量的位置参数和关键字参数,然后将它们传递给函数。

例如,Python中的decorators作为包装器工作,可以在不更改函数代码本身的情况下更改代码的行为,从而增加额外的功能。


在下面的例子中,我们构建了一个trace函数,它打印出执行函数的名称作为一个全面的检查。decorator被应用到函数的顶部,使用@trace,如下所示。因为我们想将这个decorator应用于任何带有任意数量参数的函数,所以我们需要使用*args和**kwargs。

image.png  

说明

可以的话,尽量不要使用*args和**kwargs。

需要注意,args和kwargs不过是默认的命名,你可以随意更改这些变量名,真正起作用的是星号*和**。

感谢你的阅读!如果你想进一步提高Python技能,以下文章可能会有所帮助:

5 Python features I wish I had known earlier(我希望尽早知道的5个python功能)

4 Common Mistakes Python Beginners should Avoid(python初学者应该避免的4个常见错误)

4 Hidden Python Features that Beginners should Know(初学者应该知道的4个python隐藏功能)

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:几个高效 Pandas 实用技巧

下一篇:算法攻破人脸识别「口罩」难题,两天落地千人小区准确率达97% | AI 战疫

用户评价
全部评价

热门资源

  • 国内人才报告:机...

    近日,BOSS 直聘职业科学实验室 &BOSS 直聘研究院...

  • AI使物联网更智能...

    看到微软对物联网和人工智能的结合感兴趣是一个明...

  • 推荐一批学习自然...

    这里推荐一批学习自然语言处理相关的书籍,当然,...

  • 机器学习中的线性...

    机器学习中的线性回归是一种来源于经典统计学的有...

  • 基于Spark的数据分...

    Spark是在借鉴了MapReduce之上发展而来的,继承了...