Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173

Зачем нужна функция enumerate?

14.02.2018, 17:03. Показов 5526. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Если нам нужны индексы элементов списка A, то пишем
Python
1
for i in range(0,len(A)):
если не нужны, то
Python
1
for a in A:
Тогда какой смысл вводить в язык еще одну функцию enumerate()?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2018, 17:03
Ответы с готовыми решениями:

Объясните зачем нужна данная функция
Довольно односложный вопрос. Когда и зачем используется данная функция (соответственно, что будет если ее не использовать)? И что...

Зачем нужна Функция, для чего и в каких моментах используется?
можете рассказать в каких моментах понадобиться функция и для чего? и что можно делать с ним чтобы было представление как с ним работать

Что делает функция Enumerate()?
Господа,может кто-нибудь доступно объяснить,что делает это функция <enumerate()>.Предупреждаю сразу,я ламер,так что, пожалуйста,...

40
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.02.2018, 17:06
А если нужно и то и другое?

Кроме того можно предположить что у нас может быть какой нибудь контейнер без доступа по индексу, только по итератору.
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
14.02.2018, 17:53  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
А если нужно и то и другое?
тогда используется 1-ый вариант, где внутри a[i].
Code
1
2
for i in range(0,len(A)):
  print(i, a[i])
Цитата Сообщение от Avazart Посмотреть сообщение
Кроме того можно предположить что у нас может быть какой нибудь контейнер без доступа по индексу, только по итератору.
в таком случае вряд ли нужно будет знать индекс элемента контейнера, и поэтому используется вариант №2.
(ну а в тех редких случаях, когда нужен счетчик, так можно и count завести. ну хотя да, enumerate по сути и заменяет собой счетчик). короче, хотелось бы увидеть какой-нибудь реальный пример, где имеет смысл использовать enumerate().
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.02.2018, 17:57
Цитата Сообщение от spyphy Посмотреть сообщение
тогда используется 1-ый вариант, где внутри a[i].
А ты не думал, что может быть вот такая ситуация на пример?
Python
1
2
for i, d in enumerate('data'):
    print(i, d)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
14.02.2018, 18:02
например для изменения списка в цикле
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> l = ['joe','lee','nick']
>>> for i in l:
    if i == 'joe': i = i.upper()
 
    
>>> l
['joe', 'lee', 'nick']
>>> for x,i in enumerate(l):
    if i == 'joe': l[x] = i.upper()
 
    
>>> l
['JOE', 'lee', 'nick']
>>>
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
14.02.2018, 18:12  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
for i, d in enumerate('data'):
print(i, d)
Это какой-то плохой стиль программирования вставлять строковый литерал в цикл, и нельзя назвать реальным примером. Но ок, суть я понял.

Добавлено через 7 минут
Цитата Сообщение от vic5710 Посмотреть сообщение
например для изменения списка в цикле
у меня это как вариант-№1
Python
1
2
for i in range(len(l)):
    if l[i] == 'joe': l[i] = l[i].upper()
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.02.2018, 18:22
Цитата Сообщение от spyphy Посмотреть сообщение
у меня это как вариант-№1
Думаю может работать медленнее ибо генерируется последовательность.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.02.2018, 18:28
Цитата Сообщение от spyphy Посмотреть сообщение
Это какой-то плохой стиль программирования вставлять строковый литерал в цикл,
Ну в реальности он может быть в переменной, сути это не поменяет ни на грамм.
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
14.02.2018, 18:33  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
ибо генерируется последовательность.
какая последовательность? range я в стиле python3 пишу (можно считать, что там xrange)

Добавлено через 3 минуты
Цитата Сообщение от alex925 Посмотреть сообщение
Ну в реальности он может быть в переменной, сути это не поменяет ни на грамм.
по-моему, меняет. можно тогда так писать
Python
1
2
3
s = 'data'
for i in range(len(s)):
    print(i, s[i])
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
14.02.2018, 18:34
Цитата Сообщение от spyphy Посмотреть сообщение
enumerate по сути и заменяет собой счетчик
Бинго!

Цитата Сообщение от spyphy Посмотреть сообщение
короче, хотелось бы увидеть какой-нибудь реальный пример, где имеет смысл использовать enumerate().
Он сам тебя найдёт, когда придёт время.
1
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.02.2018, 18:40
Цитата Сообщение от spyphy Посмотреть сообщение
по-моему, меняет. можно тогда так писать

Ты озаботился ерундовым вопросом и городишь много глупостей

dondublon тебе правильно ответил
Цитата Сообщение от dondublon Посмотреть сообщение
Он сам тебя найдёт, когда придёт время.
Когда задача появится, поймешь

Добавлено через 2 минуты
Цитата Сообщение от spyphy Посмотреть сообщение
s = 'data'
for i in range(len(s)):
* * print(i, s[i])
Вообще этот код делает больше телодвижений чем код с enumerate и это очевидно
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
14.02.2018, 19:16  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Когда задача появится, поймешь
а вдруг не пойму. поэтому и хотелось бы уметь обнаруживать такие ситуации. а то мало ли, не замечу и буду клепать повсюду свои range)
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.02.2018, 19:18
Если ты такой не в меру дотошный и любишь докопаться до всякой ерунды, вот тебе отличие одного метода от другого:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import timeit
 
 
def test1():
    s = 'data'
    for i in range(len(s)):
        a = i, s[i]
 
 
def test2():
    s = 'data'
    for i, d in enumerate(s):
        a = i, d
 
 
print(
    timeit.timeit("test1()", setup="from __main__ import test1", number=10000000)
)
print(
    timeit.timeit("test2()", setup="from __main__ import test2", number=10000000)
)
Результат:
6.165559820015915
5.609512716997415

Вариант с enumerate быстрее.
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
14.02.2018, 20:01  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
Результат:
6.165559820015915
5.609512716997415
Вариант с enumerate быстрее.
А теперь запустити ваш код на pypy.
У меня получилось
2.62080907822
2.86107110977
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
14.02.2018, 20:08
spyphy, а теперь запусти пару-тройку раз и увидишь скорее всего другой результат
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
14.02.2018, 20:13  [ТС]
Цитата Сообщение от alex925 Посмотреть сообщение
а теперь запусти пару-тройку раз и увидишь скорее всего другой результат
Не понял. Вот, если по несколько раз в цикле прогонять. Результат сильно не меняется
test1=2.72747015953
test2=2.96604704857
test1=2.6726899147
test2=2.86479210854
test1=2.69742798805
test2=2.85395407677
test1=2.64251303673
test2=2.94093894958
test1=2.68383789062
test2=2.89104294777
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
14.02.2018, 21:44
Цитата Сообщение от spyphy Посмотреть сообщение
for i in range(0,len(A)):
Это антипаттерн для python. Для тех кто пришел из С\С++\ и т.д. - просто примите это к сведению (читайте PEP'ы по Style Guide - они как раз для вас написаны) - и не пытайтесь программировать по принципу "раз я не понимаю - оно нинужно".

Кроме того enumerate используется вот для таких хитрых конверсий:
Python
1
2
3
4
5
6
>>> names = ['Bob', 'Alice', 'Guido']
>>> list(enumerate(names))
[(0, 'Bob'), (1, 'Alice'), (2, 'Guido')]
>>> list(enumerate(names,1))
[(1, 'Bob'), (2, 'Alice'), (3, 'Guido')]
>>>
Через range будет вот так - не слишком красиво:
Python
1
2
3
4
5
>>> list((i,names[i]) for i in range(len(names)))
[(0, 'Bob'), (1, 'Alice'), (2, 'Guido')]
>>> list((i+1,names[i]) for i in range(len(names)))
[(1, 'Bob'), (2, 'Alice'), (3, 'Guido')]
>>>
Добавлено через 3 минуты
P.S. В lua вас также удивляет наличие функции pairs?
Code
1
for k,v in pairs(t) do body end
0
 Аватар для Vigi
641 / 481 / 179
Регистрация: 28.05.2012
Сообщений: 1,419
15.02.2018, 11:22
Python
1
2
for i, s in enumerate('ABCD', start=1):
    print(i, s, sep='-')
Добавлено через 10 минут
или
Python
1
print(*enumerate('ABCD', start=1))
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,881
15.02.2018, 15:22
Цитата Сообщение от spyphy Посмотреть сообщение
Тогда какой смысл вводить в язык еще одну функцию enumerate()?
Перепишите без использования enumerate():
Python
1
2
a = [x**3 + i*x**2 + x for i, x in enumerate(some_array_of_numbers)]
b = [y*i for i, y in enumerate(x for x in arr if x > 0)]
0
4 / 5 / 3
Регистрация: 03.11.2012
Сообщений: 173
16.02.2018, 00:28  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Перепишите без использования enumerate():
a = [x**3 + i*x**2 + x for i, x in enumerate(some_array_of_numbers)]
b = [y*i for i, y in enumerate(x for x in arr if x > 0)]
там речь шла про реальный код, а не какую-то вымышленную ахению, которая не понятно для чего нужна.

Ну да ладно, вопрос не актуален. Я уже и сам решил поискать реальные куски кода, где enumerate используется. Вот что-то типа такого встречается
Python
1
2
3
    for i, fi in enumerate(eq):
        if isinstance(fi, Equality):
            eq[i] = fi.lhs - fi.rhs
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2018, 00:28
Помогаю со студенческими работами здесь

Зачем нужна вертикальная черта в запросе?
К примеру есть следующий запрос: ( "SELECT * FROM zapys WHERE PrizvishcheImyaPobatkovi AND Stat LIKE ('%' || ? || '%') ", ...

Зачем нужна функция SetCursor?
объясните пожалуйста простым языком зачем нужна функция SetCursor, что она делает и при каких условиях используется.

Зачем нужна функция GetPrivateProfileString?
Объяснить "кусочек" кода)), из то го что есть я понял что с начало в комбобокс добавляются значения с помощью функции InserCBItem, далее...

Зачем нужна функция cin.ignore()?
Объясните пожалуйста почему если убрать из кода cin.ignore(); , в 55 строке присваиваем n = 1, оно возвращает к началу, и getline(cin,...

Зачем нужна отдельная многопоточная функция в libcurl?
Здравствуйте. Подскажите пожалуйста зачем в libcurl имеется еще curl_multi_init, (если я правильно понял, это что-то вроде многопоточного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru