在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技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
👉Python必备开发工具👈
👉Python学习视频合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉实战案例👈
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉Python副业兼职路线&方法👈
学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。
👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方二维码免费领取