在学习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"最终在输出列表中加倍?
这么简单的代码,却让我失去理智。 提前致谢!感谢您的时间
答案 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的下一次迭代中,double
为temp*2
。由于temp
为2,double
为4.现在double的值存储在数组的第二个索引中。行temp = values[i]
将在temp
中存储4,但是因为循环结束所以没有关系,因为数组的长度是3,并且循环仅在i <1时重复。 3。
当我们完成时,最终的数组是{0,2,4}。