【问题标题】:For loop over enumerate() with two variablesFor 循环遍历 enumerate() 与两个变量
【发布时间】:2016-12-07 20:02:22
【问题描述】:

这段代码有什么作用?我说的主要是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))

【问题讨论】:

    标签: python range nested-loops enumerate


    【解决方案1】:

    不,它们不相等。发生的情况是,在 Python 中,当您的可迭代元素也是可迭代对象时,您可以在循环定义中解压缩它们的值,这就是第一个示例中发生的情况。

    换句话说,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 个元素的可迭代对象。

    【讨论】:

    • 似乎 "i" 从 0 到 ((end + 1) - start),而 "framenum" 从 start 到 (end + 1)。语法不是很直观,但我明白它现在的作用
    • @Pototo 迭代enumerate(range(...)) 是不寻常的,因为i 可以从framenum 计算得出。为了让列表项和它们的索引同时可用,在enumerate(someList) 上看到循环更为常见。
    【解决方案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))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-18
      • 2014-11-28
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 2020-11-17
      • 1970-01-01
      相关资源
      最近更新 更多