Почему ответ разный из-за одной скобки
У меня есть функция которая складывает вектора:
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]
Из этого разбора видно что в первом варианте элементов больше, сами они меньше. Во втором варианте элемент один - сумма всех значений из первого варианта.