Python:难以理解前面的双重函数

时间:2018-04-18 00:33:41

标签: python python-3.x function range

在学习python的过程中,坚持理解这段代码。它有效,本书要求我测试它,我已成功,但无法理解第一个索引如何在代码中结束。

def double_preceding(values):
    """(list) -> NoneType

    Replace each item in the list with twice the value of the preceding item, and replace the first item with 0.

    >>> L = [l , 2 , 3]
    >>> double_preceding(L)
    >>> L
    (0, 2, 4]
    """

    if values != []:
        temp = values[0]
        values[0] = 0
        for i in range(1, len(values)):
            double = 2 * temp
            temp = values[i]
            values[i] = double

范围从索引1开始,它将跳过索引0,那么2的输出如何进入(来自doctest)?这意味着值1加倍,但范围跳过索引0 ......?

还有一个问题,是不是values[0] = 0将[0]中的值更改为0?价值如何" 1"最终在输出列表中加倍?

这么简单的代码,却让我失去理智。 提前致谢!感谢您的时间

2 个答案:

答案 0 :(得分:2)

def double_preceding(values):
    """(list) -> NoneType

    Replace each item in the list with twice the value of the preceding item, and replace the first item with 0.

    >>> L = [1 , 2 , 3]
    >>> double_preceding(L)
    >>> L
    (0, 2, 4]
    """

    if values != []:
        temp = values[0] # temp is 1 now
        values[0] = 0 #sets 1 to 0
        for i in range(1, len(values)): # start at second item in array and go until end
            double = 2 * temp # double it by the last (which is stored in temp)
            temp = values[i] # temp is now equal to the item we just doubled (the "preceding item")
            values[i] = double # change the value of the item at the index so it is actually the doubled item

答案 1 :(得分:2)

这是一个有趣的循环,我将向您介绍它的工作原理。

语句if values != []:检查循环是否为空。如果没有,它就会继续。

语句temp = values[0]values[0]的原始值存储在temp中。这是程序知道如何加倍1.所以在我们的例子中,temp的值将是1.

下一步values[0] = 0将第一个元素的值设置为0,但我们仍然知道数组的原始值是什么,因为我们将它存储在temp中。

现在我们开始循环。循环从1一直到循环结束。

变量double保持temp的值乘以2.因此在我们的示例中,由于temp为1,因此double保持为2.

现在语句temp = values[i]会将循环的当前迭代值存储在temp中。在我们的示例中,我们将处于第一次迭代,因此values[1]为2,因此temp中有2。

最后,语句values[i] = double将double的值存储在数组中。目前,我们处于索引1,因为double是2,这就是索引所具有的。

我们可以再次循环这个序列。目前,我们的数组有{0,2,3}。在for的下一次迭代中,doubletemp*2。由于temp为2,double为4.现在double的值存储在数组的第二个索引中。行temp = values[i]将在temp中存储4,但是因为循环结束所以没有关系,因为数组的长度是3,并且循环仅在i <1时重复。 3。

当我们完成时,最终的数组是{0,2,4}。