在作业中使用逗号有什么用?

时间:2014-02-11 23:38:56

标签: python syntax

我正在阅读关于斐波纳契序列的另一页:

How do I print a fibonacci sequence to the nth number in Python?

我想知道是否有人可以分解正在发生的事情以及这条特定线路的工作原理。我不完全理解“cur”和“i”是如何变化的。

cur, old, i = cur+old, cur, i+1

它是斐波那契函数的一部分

def fib(n):
    cur = 1
    old = 1
    i = 1
    while (i < n):
        cur, old, i = cur+old, cur, i+1
    return cur

2 个答案:

答案 0 :(得分:3)

您提供的行等同于:

cur, old, i = (cur+old, cur, i+1)

使用称为unpacking *的技术。

以下是演示:

>>> x, y, z = (1, 2, 3)  # Parenthesis are optional here
>>> x
1
>>> y
2
>>> z
3
>>>  

在更长的形式中,您的行等同于:

tmp = cur
cur = cur+old
old = tmp
i = i+1

可以简化为:

tmp = cur
cur += old
old = tmp
i += 1

*注意:实际上,它有很多名字。除了解包之外,一个非常常见的是multiple assignment。 @ user2864740还在他的comment中提到了另外两个名字。

答案 1 :(得分:3)

更一般地说,在Python中用作l值的l值的汇总列表将从右侧的可迭代解包到左侧的部分。

在您的情况下,这意味着右侧会创建值为cur+oldcuri+1的三元组,然后将其解压缩到{{1}分别是{,curold,因此它与说:

相同
i

但是,它更有用,因为old = cur cur = cur + old i = i + 1 cur被分配之前没有被破坏。它也可以更普遍地使用 - 左侧可以包含任何l值,右侧可以是任何可迭代的,您可以执行以下操作:

old

a, b, c = range(3)

d = [0] * 10
d[3], d[7] = 1, 2

在Python3中,您还可以使用星号表达式来解包迭代的“其余部分”;例如,像这样

e, f, g = d[2:5]

然而,这在Python2中不起作用。

有关详细信息,请参阅section 7.2 of the language reference