在Python中,我们可以通过位置参数或关键字参数向函数传递数据,这种灵活性让Python函数的使用变得非常方便。然而,这种方式也有一些局限性。例如,你可能希望某些参数仅限于使用位置来指定,而另一些参数则只能通过关键字来指定。此外,常见的一种需求是将带有默认值的参数放在没有默认值的参数之前,这样可以使参数看起来更加有序,使用起来也更加简单。在Python中,通过使用*和/符号,可以实现这些特定的需求。
众所周知,在Python中可以通过位置参数或关键字参数传递数据给函数。让我们看看下面这个简单的例子:
def output(a, b, c):
print(f'{a=}, {b=}, {c=}')
只要关键参数放在位置参数后面,我们可以使用位置参数或关键字参数调用此函数:
这几种调用方式都有效,而且结果都一样。
/ 指定仅限位置参数在函数定义中,放在 / 符号之前的参数必须作为位置参数传递。现在让我们使用 /更新 output() 函数:
def output_v2(a, /, b, c):
print(f'{a=}, {b=}, {c=}')
在这个更新版本中,a 只能通过位置参数传递,而 b 和 c 仍然可以通过位置参数和关键字参数传递:
如果参数 a 我们通过关键字参数传递,则会报类型错误:
* 指定仅限关键字参数在函数定义中,* 号后面的参数必须通过关键字参数传递。我们再次修改 output() 函数,将 / 修改为 *:
def output_v3(a, *, b, c):
print(f'{a=}, {b=}, {c=}')
现在,a 可以通过位置参数或关键字参数传递,但b 和 c 必须通过关键字参数传递:
如果 b 和 c 通过位置参数传递的话,就会报类型错误:
上面的错误说明这个函数只有一个参数支持位置传递,即 * 号前面的 a。
* 号的一个非常有用的功能是,它允许你在没有默认值的参数之前放置具有默认值的参数,使得参数看起来更有组织性或结构性。例如,我们可以给 b 一个默认值,仍然可以使用星号在 b 之后放置 c :
def output_v4(a, *, b=2, c):
print(f'{a=}, {b=}, {c=}')
这是 Python 中的有效语法,并且常用于具有复杂函数参数的第三方 Python 库。
现在 b 和 c 都必须通过关键字参数传递,而且 b 具有默认值:
* 和 /我们可以结合 * 和 / 来定义函数,其中一些参数是仅限位置传递,另一些则仅限关键字传递:
def output_v5(a, /, *, b=2, c):
print(f'{a=}, {b=}, {c=}')
在这个案例中,a 是仅位置参数,而 b 和 c 是仅关键字参数。
如果 a 使用关键字传递,b 和 c 使用位置传递,则都会发生类型错误和语法错误:
在这篇文章中,我们介绍了在函数定义中使用 * 和 / 符号的方法,它们具有以下有趣的用途:
“如果你觉得这篇文章对你有用,请“点赞➕关注”支持我!关注我,带你解锁更多Python实用技能、数据分析知识以及更多AI工具和新玩法!
Thank you for reading!
- END -
推荐阅读👇👇👇
震惊全球!!!谷歌解雇了它整个Python基础团队,释放了什么信号?
Pandas高级功能:提升您的数据处理技能。值得一看!(建议收藏~~)
原文作者:数据派探险家;如有侵权,请联系管理员删除。