【问题标题】:What is the difference in *args, **kwargs vs calling with tuple and dict? [duplicate]*args、**kwargs 与使用 tuple 和 dict 调用有什么区别? [复制]
【发布时间】:2016-09-03 21:48:05
【问题描述】:

这是一个基本问题。做起来有区别吗

def foo(*args, **kwargs):
    """standard function that accepts variable length."""
    # do something

foo(v1...vn, nv1=nv1...nvn=nvn)

def foo(arg, kwargs):
    """convention, call with tuple and dict."""
    # do something

mytuple = (v1, ..vn)
mydict = {nv1=nv1, ...nvn=nvn}
foo(mytuple, mydict)

我可以对两者做同样的事情,只是后者有一个奇怪的约定,即创建 tupledictionary。但基本上有区别吗?我可以解决处理无限事物的相同计算问题,因为dicttuple 无论如何都可以为我解决这个问题?

这是否更像是 Python 的一个惯用部分,即对于你所做的事情来说是一个很好的语法糖?即function 将为您处理此问题!

PS:虽然我同意这是Why use packed *args/**kwargs instead of passing list/dict? 的副本,但不确定是否有这么多反对意见,并且可能应该在重复信息中进行更正。这个问题得到了赞成。那我是不是因为找不到那个而被否决了?

【问题讨论】:

  • 您可以在您的 sn-ps 中看到差异 - 第一个版本允许您传递任意位置和关键字参数,第二个版本要求您精确传递两个参数。
  • 你是什么意思“无限长度”?元组和字典可以包含任意数量的元素,但您的 RAM 基本上是有限的。您可能想查看生成器和itertools,和/或解释您要解决的实际问题是什么。
  • 我会说第二个是 less 干净的,当然也不那么惯用,但是 YMMV。
  • 我认为你被否决了,因为你没有正确解释你的问题。

标签: python arguments parameter-passing


【解决方案1】:

argskwargs 只是名称。
这里真正重要的是***

在您的第二个示例中,您只能使用 2 个参数调用该函数,而第一个示例中您可以使用基本上无限的参数调用该函数。

【讨论】:

  • 但是用元组和字典调用它的约定实际上解决了我得到无限项的问题,不是吗?
  • @Nishant:foo(*sequence, **mapping) 也是如此。
  • @Nishant 不。这里没有魔法。您实际上应该避免使用名称 tuple,因为它会隐藏内置名称。
  • @DeepSpace:他们正在寻找相同的语法调用函数时。他们想传入任意数量的参数。
  • @MartijnPieters 创建元组字典并调用它有根本区别吗? def foo(*args, **kwargs): 传递一个方便的语法糖吗?
猜你喜欢
  • 2017-03-26
  • 2012-05-16
  • 2020-11-08
  • 2010-09-22
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 2019-04-21
  • 2020-12-11
相关资源
最近更新 更多