Удивительное поведение функции перечисления

#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)