2

我是 Python 的初学者,我正在读一本书。

所以这是一个模仿range()的函数

def interval(start, stop=None, step=1):
    'Imitates range() for step > 0'
    if stop is None: 
        start, stop = 0, start      # How is this evaluated?
    result = []
    i = start 
    while i < stop:
        result.append(i)
        i += step
    return result

我的问题是:如何评估:

start, stop = 0, start部分?

因为我知道参数应该像这样评估:

5, stop = 0, 5 (我知道我错了,但我需要你告诉我这部分是如何评估的)

4

4 回答 4

3

表格

x, y = a, b

是一个多重分配,它有很好的(但很迟钝)记录在案。我给出的简单示例相当于

x = a
y = b

或者在你的例子中start, stop = 0, start

stop = start
start = 0

注意我是如何重新排列作业的;这是多重分配的优点之一。在这种情况下,如果您想要相同的效果,则必须添加一个临时变量:

temp = start
start = 0
stop = temp 
于 2013-08-10T19:02:09.123 回答
2

如果你打电话interval( 10 ),那么start = 0stop = 10。何时interval( 5, 10 )调用,然后start = 5stop = 10

start, stop = 0, start相当于stop = start; start = 0

于 2013-08-10T18:55:21.177 回答
1

a, b = c, d 等价于 a = c 和 b = d

于 2013-08-10T19:03:04.713 回答
1

这称为元组解包。

In [24]: x,y = 0,1

In [25]: print(x)
0

In [26]: print(y)
1

您可以对任何序列执行此操作。在上面,您使用 (0,1) 在线指定一个元组。你也可以解包,比如说,一个可迭代的:

In [28]: a,b,c = range(3)

In [29]: a
Out[29]: 0

In [30]: b
Out[30]: 1

In [31]: c
Out[31]: 2

但是你必须确保你提供给 unpack 的参数数量是有意义的。

In [32]: a,b = range(3)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/ben/<ipython-input-32-ec703b8346af> in <module>()
----> 1 a,b = range(3)

ValueError: too many values to unpack (expected 2)

In [33]: a,b,c,d = range(3)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/home/ben/<ipython-input-33-16ef42f82877> in <module>()
----> 1 a,b,c,d = range(3)

ValueError: need more than 3 values to unpack

请注意(这似乎是让您感到困惑的部分)右侧是在左侧之前评估的。这允许常见的成语:

In [34]: x = 0

In [35]: y = 1

In [36]: x,y = y,x 
于 2013-08-10T18:59:38.267 回答