2014-10-01 54 views
1

我想了解发电机和所遇到下面的代码:发电机在Python查询

def reverse(data): 
    for index in range(len(data)-1, -1, -1): 
     yield data[index] 


for s in reverse([1,2,3]): 
    print s 

我明白,我们在指数2,减量在-1开始通过1和结束。我没有得到的是,事实上,我认为停止点-1应该参考"3",但它似乎指的是"1"在这里? :

3 
2 
1 

感谢

+1

在假设之前检查'range(len(data)-1,-1,-1)'的输出关于停车点的任何事情(特别是因为证据点违背你的假设) – njzk2 2014-10-01 22:13:48

+1

'range'实际上在上限之前停止。假设它的行为方式是确保'我在范围内(3)'将按照大多数人所期望的那样迭代3次,'i'取值为'[0,1,2]'。在你的情况下,'range(2,-1,-1)'输出'[2,1,0]',这对应于你所看到的输出的索引。 – 2014-10-01 22:16:05

回答

1

请参阅https://docs.python.org/2/library/functions.html#range看到的范围是如何工作的。我可以看到它最初可能会让人阅读文档时感到困惑,但希望下面的解释对你有所帮助。

具体来说,上述文档中的这些行可以回答你的问题: '完整的表单返回一个普通整数列表[start, start + step, start + 2 * step, ...]。如果step为正数,则最后一个元素为最大start + i * step小于stop;如果步是否定的,最后一个元素是不是停止更大最小start + i * step

在你的情况start=2(LEN(数据)-1), stop =-l and step=-1。因此,潜在的整数列表将是[2, 2-1, 2-2*1, 2-3*1 ...],它是[2,1,0,-1 ...]。然而,由于你的步骤是否定的,即-1,所以最后一个元素将是最小的(start + i*step)大于停止。在潜在列表中,大于停止,即大于-1的最小项目为0.因此range(len(data)-1, -1, -1)返回[2,1,0]