【问题标题】:excess positional arguments, unpacking argument lists or tuples, and extended iterable unpacking多余的位置参数,解包参数列表或元组,以及扩展的可迭代解包
【发布时间】:2011-03-13 02:57:00
【问题描述】:

这个问题会比较长,所以我先道歉。

在 Python 中,我们可以在以下三种情况下使用 *:

I.在定义一个我们希望可以使用任意数量的参数调用的函数时,例如in this example

def write_multiple_items(file, separator, *args):
    file.write(separator.join(args))

在这种情况下,多余的位置参数被收集到一个元组中。

II. 相反的情况是,当参数已经在 listtuple 中时,我们希望将它们解包以便需要单独位置参数的函数调用,例如in this example:

>>> range(3, 6)             # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> range(*args)            # call with arguments unpacked from a list
[3, 4, 5]

III. 从 Python 3 开始,* 也用于扩展 listtuple 解包的上下文中,例如 in this example对于元组:

>>> a, *b, c = range(5)
>>> b
[1, 2, 3]

或者对于列表:

>>> [a, *b, c] = range(5)
>>> b
[1, 2, 3]

在这两种情况下,被解包的可迭代对象中所有未分配给任何强制表达式的项都将分配给一个列表

所以问题来了:如果 I 额外的参数被收集到一个 tuple 中,而如果 III 额外的项目被分配列表。这种差异从何而来?我能找到的唯一解释是在 PEP 3132 中说:

讨论的可能变化是:

[...]

使加星标的目标成为元组而不是列表。这将是 与函数的 *args 一致, 但进一步处理 结果更难。

然而,从教学的角度来看,这种缺乏一致性是有问题的,特别是考虑到如果你想处理结果,你总是可以说 list(b) (假设上面的例子中的 b 是一个元组)。我错过了什么吗?

【问题讨论】:

    标签: python list tuples


    【解决方案1】:

    你错过了一个。

    IV.另外,在 Python 3 中,参数列表中的 * 表示位置参数的结束,允许 keyword-only arguments

    def foo(a, b, *, key = None):
        pass
    

    这可以称为foo(1, 2, key = 3),但不能称为foo(1, 2, 3)

    【讨论】:

    • 谢谢。虽然不能真正回答我的问题,但很高兴将所有案例集中在一个线程中。
    【解决方案2】:

    在 Python 中,我们可以在 以下三种情况:

    你的意思是 prefix * 当然 -- infix * 用于乘法。

    然而,从教学 透视这种缺乏一致性 是有问题的,尤其是考虑到 如果你想处理结果, 你总是可以说 list(b) (假设 b 在上面的例子中是一个元组)。 我错过了什么吗?

    我会说设计问题(陈旧而且很长!)是这样一个事实,即当您接收任意参数时,您将它们作为元组获取,而列表在许多情况下会更有用没有真正缺点的情况(在函数调用开销的上下文中,创建列表而不是元组可能需要的少量额外处理和内存可以忽略不计——序列解包,为此重要;制作列表以及元组所需的额外处理和内存确实更烦人)。

    你可以用元组做的很少,但不能用列表——基本上,只是散列它(用作集合项或字典键)——而列表提供了更多额外的功能,而不是 只是为了改变它......像countindex这样的方法也很有用。

    【讨论】:

    • 感谢您的回答。简而言之,我所听到的是案例 I 应该被设计为给出一个列表。
    • @Alexandros,这确实是我的观点——当然,事后看来是 20/20,并且做出了这个决定......我不确定什么时候,但它已经在 Python 1.5 中了。 2,超过 11 年前。
    猜你喜欢
    • 1970-01-01
    • 2017-09-06
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2023-03-09
    • 2013-09-30
    相关资源
    最近更新 更多