#python
#python
Вопрос:
Я написал некоторый код на Python, используя функцию enumerate.
A = [2,3,5,7]
for i, x in enumerate(A):
# calculate product with each element to the right
for j, y in enumerate(A, start=i 1):
print(x*y)
Я ожидал, что он вычислит 6 продуктов: 2*3, 2*5, 2*7, 3*5, 3*7, 5*7
Вместо этого он рассчитал все возможные 16 продуктов. Что происходит?
Ответ №1:
start
Параметр enumerate
влияет только на первое значение полученного кортежа (т.Е. i
and j
), он не влияет на то, с какого индекса начинается перечисление. Как указано в руководстве, enumerate
эквивалентно этому:
def enumerate(sequence, start=0):
n = start
for elem in sequence:
yield n, elem
n = 1
Чего вы хотите, так это:
for i, x in enumerate(A):
for y in A[i 1:]:
print(x * y)
Комментарии:
1. Спасибо, я понял. Без сомнения, эта функция кому-то полезна. Выбор имени неудачен. «Начальный параметр enumerate … не влияет на то, с какого индекса начинается перечисление. »
Ответ №2:
Вопрос здесь, во-первых, в том, что сделал enumerate, а во-вторых, почему вы его используете. Базовая функция enumerate заключается в преобразовании итерации формы (a,b,c)
в итерацию формы ((start,a), (start 1,b), (start 2,c))
. Он добавляет новый столбец, который обычно используется в качестве индекса; в вашем коде это i
and j
. Это не изменяет записи, содержащиеся в последовательности.
Я считаю, что операция, которую вы намеревались выполнить, представляет собой фрагмент, извлекающий только часть списка:
for i, x in enumerate(A):
for y in A[i 1:]:
print(x*y)
Если важно не копировать список (это редко бывает), вы можете заменить A[i 1:]
на itertools.islice(A, i 1, len(A))
.
Дополнительное замечание заключается в том, что start
аргумент может быть полезен во внешнем цикле в этом коде. Мы используем только i 1
, не i
поэтому мы можем также использовать это значение в качестве нашего индекса:
for nextindex, x in enumerate(A, 1):
for y in A[nextindex:]:
print(x*y)