gpt4 book ai didi

python - Python 给函数参数赋值的过程是怎样的?

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:39 24 4
gpt4 key购买 nike

我一直在努力理解 Python 在为函数参数赋值时遵循的算法,但它非常令人困惑。我想更好地理解该算法,以便我可以真正知道什么值被分配给什么参数以及什么时候。有位置参数、关键字参数、*args、*kwargs 和仅关键字参数。这些都是如何分配的,以什么顺序分配?

以下面的代码片段为例:

def func(a, b, c):
print(a, b, c)

如果我按以下格式调用这个函数,它会正常运行:

func(c=3, *(1, 2)) # prints 1 2 3

但是,如果我使用它运行它,它会给出一个SyntaxError:

func(c=3, 1, 2)

这两种调用形式有何不同?在第一次调用中,元组被解压为单独的参数。这不就和转化为第二形态一样吗?如果发生这种情况,那么第二种形式也应该有效,但事实并非如此。

那么这里到底发生了什么?

最佳答案

没有什么特别之处:这就是 Python 的工作方式。

Python 禁止在命名参数之后传递位置参数。就像您不能在 after 可选参数或 after 仅关键字参数的情况下定义带有强制参数的函数一样。然而,当调用一个函数时,在命名参数之前使用位置参数更多的是可读性问题,而对于函数定义,它实际上是一个“消除歧义”的问题。但它的工作方式肯定具有某种对称性。

您可以通过使用解包绕过它,但它是有代价的:由于额外的工作,它有点慢:

def func(a, b, c):
pass

%timeit func(c=3, *(1, 2))
# 810 ns ± 16.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit func(1, 2, c=3)
# 383 ns ± 1.47 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

记住这一点实际上非常重要:如果你试图与 Python 语言作斗争,你就会付出性能代价。


如果您有兴趣,它基本上就像您的函数只有 *args**kwargs 作为参数一样工作。它收集 *args 中的所有位置参数和 **kwargs 中的所有命名参数,然后尝试将它们“绑定(bind)”到实际的函数参数。

关于python - Python 给函数参数赋值的过程是怎样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46073077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com