对于带有两个变量的enumerate()循环

时间:2016-12-07 20:02:22

标签: python range nested-loops enumerate

这段代码有什么作用?我主要谈的是iframenum

for i, framenum in enumerate(range(start, end + 1)):                  
    s.append(self.getSkeleton(framenum))
    d[i] = self.getDepth(framenum)
    u[i] = to_grayscale(self.getUser(framenum))
    g[i] = to_grayscale(self.getRGB(framenum))

我可以说,i的每次更改都会framenum更改range(start, end + 1)次吗? 这相当于:

for i in enumerate(range(start, end + 1)):
    for framenum in enumerate(range(start, end + 1)):              
        s.append(self.getSkeleton(framenum))
        d[i] = self.getDepth(framenum)
        u[i] = to_grayscale(self.getUser(framenum))
        g[i] = to_grayscale(self.getRGB(framenum))

2 个答案:

答案 0 :(得分:4)

不,他们并不等同。发生的事情是,在Python中,当iterable的元素也是可迭代的时候,你可以在循环定义中解包它们的值,这就是第一个例子中发生的事情。

换句话说,enumerate返回一个元组生成器。这些元组有两个元素:枚举对象的索引和实际值。

由于每个元组都有两个元素,因此执行for i, framenum in...是一种简单易读的方法来命名元组的每个元素。它基本上和以前一样:

for tup in enumerate(range(start, end + 1)):
    i = tup[0]
    framenum = tup[1]

在第二个示例中,您将在同一个迭代中迭代两次。 iframenum都将永远是enumerate生成的元组之一,所以它绝对没有意义。

更多示例:

iterable1 = [[1,2], [3,4]]
for i, j in iterable1:
    print(i)
    print(j)

i将为1,j将在第一次迭代中为2。

for i in iterable1:
    print(i)

i在第一次迭代中将为[1,2]

iterable2 = [[1,2,3], [4,5,6]]
for i, j, k in iterable2:
    print(i)
    print(j)
    print(k)

i将为1,j将为2,k将在第一次迭代中为3。

for i in iterable2:
    print(i)
第一次迭代中

i将为[1,2,3]

for i,j in iterable2:
    print(i)
    print(j)

这会引发错误,因为元素([1,2,3][4,5,6])不是具有2个元素的可迭代的。

答案 1 :(得分:2)

不,不是。 enumerate返回索引和值。因此,enumerate(range(start, end+1))将返回(start, start)(start + 1, start + 1),... (end, end)。换句话说,iframenum将始终具有完全相同的值。

如果您想要描述嵌套for循环行为,则应使用itertools模块中的product iterator。换句话说,将enumerate(range(start, end+1))替换为product(range(start, end+1), range(start, end+1))