python - 如何将解包迭代器作为参数传递给函数?
问题描述
我有一个关于在函数中传递参数的问题。在 python 中,当你想在右侧解压一个可迭代的 obj 时,你必须在某些上下文中进行,比如元组或集合等。例如,你不能说:
a, b = *(1, 2)
你应该说:
a, b = (*(1, 2),) // a=1, b=2
或者你可以说:
a, b = {*(1, 2)} //a=1, b=2 or a=2, b=1
我说得对吗?
但是,当您想解压可迭代对象并将其作为参数传递给函数时,您根本不需要任何上下文,只需解压可迭代对象即可。例如:
def f(param1, param2):
pass
f(*(1, 2))
而且您不需要像以前那样使用某种上下文。例如,您不说:
f({*(1, 2)}) // it will be f({1, 2})
我认为在这种情况下我们不使用 {} 或任何其他上下文,因为我们正在寻找传递 2 个值作为 f 函数中的参数。因此,我认为我们不得不说f(*(1, 2))
not f({*(1, 2)})
。
如果我是对的,您能否详细解释一下 f(*(1, 2)) 是如何在不使用任何上下文的情况下工作的?
解决方案
f(*(1, 2))
确实有上下文!上下文是函数参数本身的列表(和字典)。本质上,在函数调用f(...)
中,括号之间的内容可以看作是元组和字典文字之间的混合体(仅使用x=4
而不是'x': 4
),然后将其传递给函数:
>>> def f(*args, **kwargs):
... print(args, kwargs)
>>> l = [10, 11]; d = {'a': 12, 'b': 13}
>>> f(1, *l, 2, 3, x=4, y=5, **d, z=6)
(1, 10, 11, 2, 3) {'x': 4, 'y': 5, 'a': 12, 'b': 13, 'z': 6}
这样看来,您可以将序列和字典解包到此上下文中,这是非常有意义的。
推荐阅读
- html - 使用 R 对简单表格进行 HTML 抓取
- kubernetes - 在 Kubernetes 中为 RabbitMQ 警报设置 Prometheus / Grafana
- sapui5 - Mta 应用程序无法部署并出现冲突错误
- perl - Perl if 语句仅指定特定长度的数字
- java - 让 jpackage 在 Mac Catalina 10.15.5 上运行的问题
- php - WooCommerce 中的最小重量和强制性产品类别要求
- python - 返回包含一些文本的行并删除其余行
- python - 尝试在 PHP 中运行 Python 脚本时出现 Exec 格式错误。为什么?
- pytorch - 如何修复缩放优化 pytorch 代码错误
- reactjs - 如何在 React with Typescript 中使用 Immutable.js 对象列表?