这段代码有什么作用?我主要谈的是i
和framenum
:
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))
答案 0 :(得分:4)
不,他们并不等同。发生的事情是,在Python中,当iterable的元素也是可迭代的时候,你可以在循环定义中解包它们的值,这就是第一个例子中发生的事情。
换句话说,enumerate
返回一个元组生成器。这些元组有两个元素:枚举对象的索引和实际值。
由于每个元组都有两个元素,因此执行for i, framenum in...
是一种简单易读的方法来命名元组的每个元素。它基本上和以前一样:
for tup in enumerate(range(start, end + 1)):
i = tup[0]
framenum = tup[1]
在第二个示例中,您将在同一个迭代中迭代两次。 i
和framenum
都将永远是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)
。换句话说,i
和framenum
将始终具有完全相同的值。
如果您想要描述嵌套for循环行为,则应使用itertools模块中的product iterator。换句话说,将enumerate(range(start, end+1))
替换为product(range(start, end+1), range(start, end+1))
。