Итак, для каждого элемента в cursor создается кортеж с помощью (counter, element); for цикл связывает это с row_number и row соответственно.
ДЕМОНСТРАЦИЯ:
>>> elements = ('foo', 'bar', 'baz') >>> for elem in elements: ... print elem ... foo bar baz >>> for count, elem inenumerate(elements): ... print count, elem ... 0 foo 1 bar 2 baz
По умолчанию enumerate() отсчет начинается с 0, но если вы дадите ему второй целочисленный аргумент, он будет начинаться с этого числа:
>>> for count, elem inenumerate(elements, 42): ... print count, elem ... 42 foo 43 bar 44 baz
Если бы вам пришлось повторно реализовать enumerate() на Python, вот два способа добиться этого; один с использованием itertools.count() для подсчета, другой вручную в функции-генераторе:
from itertools import count
defenumerate(it, start=0): # return an iterator that adds a counter to each element of it returnzip(count(start), it)
и
defenumerate(it, start=0): count = start for elem in it: yield (count, elem) count += 1
Фактическая реализация на C ближе к последнему, с оптимизациями для повторного использования одного объекта tuple для общего for i, ... случая распаковки и использованием стандартного целого значения C для счетчика, пока счетчик не станет слишком большим, чтобы избежать использования целого объекта Python (который неограничен).
Ответ 2
Это встроенная функция, которая возвращает объект, который можно повторять. Смотрите Документацию.
Короче говоря, он перебирает элементы итеративного объекта (например, списка), а также индексный номер, объединенные в кортеж:
for item inenumerate(["a", "b", "c"]): print item
С принтами
(0, "a") (1, "b") (2, "c")
Это полезно, если вы хотите выполнить цикл по последовательности (или другой итеративной вещи), а также хотите иметь в наличии счетчик индекса. Если вы хотите, чтобы счетчик начинался с какого-либо другого значения (обычно 1), вы можете указать это в качестве второго аргумента для enumerate.
Ответ 3
Я читаю книгу (Эффективный Python) Бретта Слаткина, и он показывает другой способ перебора списка, а также знает индекс текущего элемента в списке, но он предполагает, что лучше не использовать его, а использовать enumerate вместо этого. Я знаю, вы спрашивали, что означает enumerate , но когда я понял следующее, я также понял, как enumerate упрощает перебор списка при знании индекса текущего элемента (и делает его более читаемым).
list_of_letters = ['a', 'b', 'c'] for i inrange(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 inenumerate(list_of_letters): print (i, letter)
Ответ 4
Как упоминали другие пользователи, enumerate это генератор, который добавляет инкрементный индекс рядом с каждым элементом итерации.
Итак, если у вас есть список, скажем, l = ["test_1", "test_2", "test_3"], то list(enumerate(l)) выдаст вам что-то вроде этого: [(0, 'test_1'), (1, 'test_2'), (2, 'test_3')].
Теперь, когда это полезно? Возможный вариант использования - это когда вы хотите выполнить итерацию по элементам и пропустить определенный элемент, о котором вам известен только его индекс в списке, но не его значение (потому что его значение на данный момент неизвестно).
for index, value inenumerate(joint_values): if index == 3: continue
# Do something with the other `value`
Итак, ваш код читается лучше, потому что вы также могли бы выполнить обычный цикл for с помощью range но затем для доступа к элементам вам нужно их проиндексировать (т. Е. joint_values[i]).
Хотя другой пользователь упомянул реализацию enumerate using zip , я думаю, что более чистый (но немного более сложный) способ без использования itertools заключается в следующем: