请帮助我理解以下代码[重复]

乘风 python 443

原文标题Please help me understand the following code [duplicate]

for row_number, row in enumerate(cursor):在Python中做什么?

enumerate在这种情况下是什么意思?

原文链接:https://stackoverflow.com//questions/71686073/please-help-me-understand-the-following-code

回复

我来回复
  • ♦的头像
    评论

    enumerate() 函数向可迭代对象添加计数器。

    所以对于cursor中的每一个元素,用(counter, element)产生一个元组; for循环将其分别绑定到row_numberrow

    演示:

    >>> elements = ('foo', 'bar', 'baz')
    >>> for elem in elements:
    ...     print elem
    ... 
    foo
    bar
    baz
    >>> for count, elem in enumerate(elements):
    ...     print count, elem
    ... 
    0 foo
    1 bar
    2 baz
    

    默认情况下,enumerate()0开始计数,但如果你给它第二个整数参数,它将从那个数字开始:

    >>> for count, elem in enumerate(elements, 42):
    ...     print count, elem
    ... 
    42 foo
    43 bar
    44 baz
    

    如果您要在 Python 中重新实现enumerate(),这里有两种实现方式;一个使用itertools.count()进行计数,另一个在生成器功能中手动计数:

    from itertools import count
    
    def enumerate(it, start=0):
        # return an iterator that adds a counter to each element of it
        return zip(count(start), it)
    

    def enumerate(it, start=0):
        count = start
        for elem in it:
            yield (count, elem)
            count += 1
    

    Cis 中的实际实现更接近后者,优化了在常见的for i, ...解包情况下重用单个元组对象并为计数器使用标准 C 整数值,直到计数器变得太大而无法避免使用 Python 整数对象(这是无界的)。

    2年前 0条评论
  • RemcoGerlich的头像
    RemcoGerlich 评论

    它是一个内置函数,返回一个可以迭代的对象。请参阅文档。

    简而言之,它循环遍历可迭代的元素(如列表)以及索引号,组合成一个元组:

    for item in enumerate(["a", "b", "c"]):
        print item
    

    印刷

    (0, "a")
    (1, "b")
    (2, "c")
    

    如果您想遍历一个序列(或其他可迭代的事物),并且还希望有一个可用的索引计数器,这将很有帮助。如果您希望计数器从某个其他值(通常为 1)开始,您可以将其作为第二个参数提供给enumerate

    2年前 0条评论
  • Dora的头像
    Dora 评论

    我正在阅读 Brett Slatkin 的一本书(Effective Python),他展示了另一种迭代列表的方法,并且还知道列表中当前项目的索引,但建议最好不要使用它并改用enumerate。我知道你问枚举是什么意思,但是当我理解以下内容时,我也理解了enumerate如何在知道当前项的索引的同时更容易(并且更易读)遍历列表。

    list_of_letters = ['a', 'b', 'c']
    for i in range(len(list_of_letters)):
        letter = list_of_letters[i]
        print (i, letter)
    

    输出是:

    0 a
    1 b
    2 c
    

    在我读到enumerate函数之前,我也曾经做过一些事情,甚至更愚蠢。

    i = 0
    for n in list_of_letters:
        print (i, n)
        i += 1
    

    它产生相同的输出。

    但是有了enumerate我只需要写:

    list_of_letters = ['a', 'b', 'c']
    for i, letter in enumerate(list_of_letters):
        print (i, letter)
    
    2年前 0条评论
  • Rafael的头像
    Rafael 评论

    正如其他用户所提到的,enumerate是一个生成器,它在可迭代的每个项目旁边添加一个增量索引。

    所以如果你有一个清单说l = ["test_1", "test_2", "test_3"]list(enumerate(l))会给你这样的东西:[(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]

    现在,什么时候有用?一个可能的用例是当您想要迭代项目,并且您想要跳过一个特定的项目,您只知道它在列表中的索引而不知道它的值(因为它的值在时间)。

    for index, value in enumerate(joint_values):
       if index == 3:
           continue
    
       # Do something with the other `value`
    

    所以你的代码读起来更好,因为你也可以用range做一个常规的for循环,然后访问你需要索引它们的项目(即joint_values[i])。

    虽然另一位用户提到了enumerateusingzip的实现,但我认为不使用itertools的更纯粹(但稍微复杂一点)的方式如下:

    def enumerate(l, start=0):
        return zip(range(start, len(l) + start), l)
    

    例子:

    l = ["test_1", "test_2", "test_3"]
    enumerate(l)
    enumerate(l, 10)
    

    输出:

    [(0, ‘test_1’), (1, ‘test_2’), (2, ‘test_3’)]

    [(10, ‘test_1’), (11, ‘test_2’), (12, ‘test_3’)]

    正如评论中所提到的,这种具有范围的方法不会像原始enumerate函数那样适用于任意迭代。

    2年前 0条评论
  • Ashok Kumar Jayaraman的头像
    Ashok Kumar Jayaraman 评论

    枚举函数的工作原理如下:

    doc = """I like movie. But I don't like the cast. The story is very nice"""
    doc1 = doc.split('.')
    for i in enumerate(doc1):
         print(i)
    

    输出是

    (0, 'I like movie')
    (1, " But I don't like the cast")
    (2, ' The story is very nice')
    
    2年前 0条评论
  • Vince Payandeh的头像
    Vince Payandeh 评论

    我假设您知道如何迭代某些列表中的元素:

    for el in my_list:
        # do something
    

    现在有时不仅需要迭代元素,而且每次迭代都需要索引。一种方法是:

    i = 0
    for el in my_list:
        # do somethings, and use value of "i" somehow
        i += 1
    

    但是,更好的方法是使用“枚举”函数。 enumerate 所做的是它接收一个列表,并返回一个类似列表的对象(一个可以迭代的可迭代对象),但是这个新列表本身的每个元素都包含 2 个元素:索引和来自原始输入列表的值:所以如果你有

    arr = ['a', 'b', 'c']
    

    然后命令enumerate(arr)返回如下内容:

    [(0,'a'), (1,'b'), (2,'c')]
    

    现在,如果您遍历一个列表(或可迭代),其中每个元素本身都有 2 个子元素,您可以在for循环中捕获这两个子元素,如下所示:

    for index, value in enumerate(arr):
        print(index,value)
    

    这将打印出 enumerate 输出的子元素。

    通常,您基本上可以将列表中的多个项目“解包”为多个变量,如下所示:

    idx,value = (2,'c')
    print(idx)
    print(value)
    

    这将打印

    2
    c
    

    这是在循环的每次迭代中发生的那种赋值,enumerate(arr)as iterable。

    2年前 0条评论
  • young boss的头像
    young boss 评论

    enumerate 函数同时计算元素索引和元素值。我相信以下代码将有助于解释发生了什么。

    for i,item in enumerate(initial_config):
         print(f'index{i} value{item}')
    
    2年前 0条评论