Почему ответ разный из-за одной скобки

У меня есть функция которая складывает вектора:

    def vector_sum(vectors):
    '''Суммируем все соответствующие элементы'''
    assert vectors, 'Векторы не предоставлены'

    #Проверить, что векторы имеют одинаковый размер
    num_elements = len(vectors[0])
    assert all(len(v) == num_elements for v in vectors), 'Векторы должны иметь одинаковую длину'

    return [sum(vector[i] for vector in vectors)
                for i in range(num_elements)] # Здесь скобка после vectors

print(vector_sum([[1, 2, 3], [4, 5, 6]]))

В итоге ответ таков: [5, 7, 9]

Но в коде, где скобка стоит чуть дальше ответ другой:

    def vector_sum(vectors):
    '''Суммируем все соответствующие элементы'''
    assert vectors, 'Векторы не предоставлены'

    #Проверить, что векторы имеют одинаковый размер
    num_elements = len(vectors[0])
    assert all(len(v) == num_elements for v in vectors), 'Векторы должны иметь одинаковую длину'

    return [sum(vector[i] for vector in vectors
                for i in range(num_elements))] # Здесь скобка после num_elements

print(vector_sum([[1, 2, 3], [4, 5, 6]]))

Вывод: [21]

Объясните пожалуйста)))


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Первый вариант:

return [sum(vector[i] for vector in vectors)
        for i in range(num_elements)] # Здесь скобка после vectors

Это list comprehension, преобразуем его в цикл:

r = []
for i in range(num_elements):
    r.append(sum(vector[i] for vector in vectors))
return r

Внутри суммы generator expression, преобразуем его в цикл:

r = []
for i in range(num_elements):
    s = 0
    for vector in vectors:
        s += vector[i]
    r.append(s)
return r

Второй вариант:

return [sum(vector[i] for vector in vectors
        for i in range(num_elements))] # Здесь скобка после num_elements

Это не list comprehension, это просто литерал - список из одного элемента:

s = sum(vector[i] for vector in vectors for i in range(num_elements))
return [s]

Внутри суммы снова generator expression но более сложный - два вложенных цикла:

s = 0
for vector in vectors:
    for i in range(num_elements):
        s += vector[i]
return [s]

Из этого разбора видно что в первом варианте элементов больше, сами они меньше. Во втором варианте элемент один - сумма всех значений из первого варианта.

→ Ссылка