Таким образом, для каждого элемента в cursorсоздается кортеж с (counter, element); то forпетля связывает , что row_numberи row, соответственно.
Демо-версия:
>>> 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
Если бы вам пришлось заново реализовать enumerate()в Python, вот два способа достижения этого; один использует itertools.count()для подсчета, другой - для подсчета вручную в функции генератора :
from itertools import count
def enumerate(it, start=0):# return an iterator that adds a counter to each element of itreturn zip(count(start), it)
и
def enumerate(it, start=0):
count = start
for elem in it:yield(count, elem)
count +=1
Фактическая реализация в C ближе к последнему, с оптимизациями повторно использовать один объект кортежа для общей for i, ...распаковки дела и с использованием стандартного С целочисленного значения для счетчика , пока счетчик не становится слишком большим , чтобы избежать использования целочисленного объекта Python (который является неограничена).
Это встроенная функция, которая возвращает объект, который может быть повторен. Смотри документацию .
Короче говоря, он проходит по элементам итерируемого (например, списка), а также по порядковому номеру, объединенному в кортеж:
for item in enumerate(["a","b","c"]):print item
печать
(0,"a")(1,"b")(2,"c")
Это полезно, если вы хотите перебрать последовательность (или другую итеративную вещь), а также хотите иметь доступный счетчик индекса. Если вы хотите, чтобы счетчик начинался с какого-то другого значения (обычно 1), вы можете указать его в качестве второго аргумента enumerate.
если вы добавите вторую переменную, itemто можете удалить круглые скобки: D
Abdelouahab
2
Pedantic: это функция, возвращающая итератор, а не генератор. Генераторы - это определенный класс пользовательских функций (использующих yield/ yield fromили выражения генератора, которые неявно yield); enumerateне генератор. Для всех целей, связанных с типизацией утки, нет никакой разницы, но явная проверка типов и документы на языке Python используют термин «генератор» только для одной цели, которая не распространяется enumerate.
ShadowRanger
22
Я читаю книгу ( 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 =0for 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)
Как уже упоминали другие пользователи, 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`
Таким образом, ваш код читается лучше, потому что вы также можете сделать обычный цикл for, rangeно затем для доступа к элементам вам нужно их проиндексировать (т.е. joint_values[i]).
Хотя другой пользователь упомянул реализацию enumerateиспользования zip, я думаю, что более чистый (но немного более сложный) способ без использования itertoolsзаключается в следующем:
Причина, по которой упоминается другой ответ, itertoolsзаключается в том, что ваш rangeподход работает только с контейнерами. enumerateработает с произвольными итерациями; если вы хотите перебрать файл,for lineno, line in enumerate(myfile): работает, но вы не можете этого сделать, range(len(myfile))потому что длина неизвестна, пока вы не достигнете EOF.
ShadowRanger
12
Функция перечисления работает следующим образом:
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')
Ответы:
enumerate()
Функция добавляет счетчик на итератор.Таким образом, для каждого элемента в
cursor
создается кортеж с(counter, element)
; тоfor
петля связывает , чтоrow_number
иrow
, соответственно.Демо-версия:
По умолчанию
enumerate()
начинается отсчет с,0
но если вы дадите ему второй целочисленный аргумент, он будет начинаться с этого числа:Если бы вам пришлось заново реализовать
enumerate()
в Python, вот два способа достижения этого; один используетitertools.count()
для подсчета, другой - для подсчета вручную в функции генератора :и
Фактическая реализация в C ближе к последнему, с оптимизациями повторно использовать один объект кортежа для общей
for i, ...
распаковки дела и с использованием стандартного С целочисленного значения для счетчика , пока счетчик не становится слишком большим , чтобы избежать использования целочисленного объекта Python (который является неограничена).источник
Это встроенная функция, которая возвращает объект, который может быть повторен. Смотри документацию .
Короче говоря, он проходит по элементам итерируемого (например, списка), а также по порядковому номеру, объединенному в кортеж:
печать
Это полезно, если вы хотите перебрать последовательность (или другую итеративную вещь), а также хотите иметь доступный счетчик индекса. Если вы хотите, чтобы счетчик начинался с какого-то другого значения (обычно 1), вы можете указать его в качестве второго аргумента
enumerate
.источник
item
то можете удалить круглые скобки: Dyield
/yield from
или выражения генератора, которые неявноyield
);enumerate
не генератор. Для всех целей, связанных с типизацией утки, нет никакой разницы, но явная проверка типов и документы на языке Python используют термин «генератор» только для одной цели, которая не распространяетсяenumerate
.Я читаю книгу ( Effective Python ) Бретта Слаткина, и он показывает другой способ перебора списка, а также знает индекс текущего элемента в списке, но он предполагает, что лучше не использовать его, а использовать
enumerate
вместо него. Я знаю, что вы спросили, что означает перечисление, но когда я понял следующее, я также понял, какenumerate
сделать итерацию по списку, зная индекс текущего элемента, легче (и более читабельно).Выход:
Я также делал что-то, еще глупее, прежде чем читать о
enumerate
функции.Это дает тот же результат.
Но с
enumerate
я просто должен написать:источник
Как уже упоминали другие пользователи,
enumerate
это генератор, который добавляет инкрементный индекс рядом с каждым элементом итерируемого.Так что если у вас есть список сказать
l = ["test_1", "test_2", "test_3"]
, тоlist(enumerate(l))
даст вам что - то вроде этого:[(0, 'test_1'), (1, 'test_2'), (2, 'test_3')]
.Теперь, когда это полезно? Возможный вариант использования - это когда вы хотите перебирать элементы и хотите пропустить конкретный элемент, для которого вы знаете только его индекс в списке, но не его значение (потому что его значение в данный момент неизвестно).
Таким образом, ваш код читается лучше, потому что вы также можете сделать обычный цикл for,
range
но затем для доступа к элементам вам нужно их проиндексировать (т.е.joint_values[i]
).Хотя другой пользователь упомянул реализацию
enumerate
использованияzip
, я думаю, что более чистый (но немного более сложный) способ без использованияitertools
заключается в следующем:Пример:
Вывод:
Как упоминалось в комментариях, этот подход с диапазоном не будет работать с произвольными итерациями, как оригинальная
enumerate
функция.источник
itertools
заключается в том, что вашrange
подход работает только с контейнерами.enumerate
работает с произвольными итерациями; если вы хотите перебрать файл,for lineno, line in enumerate(myfile):
работает, но вы не можете этого сделать,range(len(myfile))
потому что длина неизвестна, пока вы не достигнете EOF.Функция перечисления работает следующим образом:
Выход
источник