Суммирование с помощью sum(): синтаксис, примеры, рекомендации

Раздел: Основы Python -> Встроенные функции для чисел

Основы работы с sum()

Функция sum() в Python принимает итерируемый объект (список, кортеж, генератор и т.д.) и возвращает сумму его элементов. По умолчанию начальное значение равно 0, но его можно изменить через второй аргумент start. Это базовый инструмент для численных вычислений.

numbers = [4, 2, 7, 1]
result = sum(numbers)
print(result)

Sum python (функция sum() в python)

14

Такой вызов подходит для любых числовых типов, поддерживающих сложение.

Как задать нестандартное начальное значение суммы?

Если требуется начать суммирование с определённого числа, используется второй аргумент start.

total = sum([10, 20, 30], 100)
print(total)
160

Параметр start полезен, когда нужно накопить сумму поверх уже существующего значения.

Как суммировать значения, полученные на лету, без создания списка?

Генераторное выражение позволяет экономить память. Например, сумма квадратов чисел от 1 до 5.

square_sum = sum(x**2 for x in range(1,6))
print(square_sum)
55

Такой подход предпочтителен для больших последовательностей.

Как сложить числовые значения словаря?

Метод values() возвращает представление всех значений, которое подходит для sum(). Для суммирования ключей (если они числа) передаётся сам словарь.

prices = {'яблоки': 50, 'бананы': 30}
print(sum(prices.values()))
80
numeric_keys = {1: 'a', 2: 'b'}
print(sum(numeric_keys))
3

Как подсчитать количество истинных значений в списке?

Логические значения True и False в численном контексте равны 1 и 0. Поэтому sum() выдаёт число элементов, равных True.

booleans = [True, False, True, True]
print(sum(booleans))
3

Как объединить несколько списков в один с помощью sum()?

Если передать список списков и пустой список в качестве start, произойдёт конкатенация. Однако такой способ неэффективен для большого числа списков из-за квадратичной сложности.

nums = [[1,2], [3,4], [5]]
flat = sum(nums, [])
print(flat)
[1, 2, 3, 4, 5]

Проблема: при большом количестве вложенных списков каждый вызов + создаёт новый список, что приводит к высоким затратам памяти и времени. Альтернатива - использовать itertools.chain.from_iterable().

Типичная ошибка: попытка суммировать строки. Функция sum() воспринимает строки как нечисловой тип и вызывает TypeError.

sum(['a', 'b', 'c'], '')
TypeError: sum() can't sum strings [use ''.join(seq) instead]

Для конкатенации строк используется метод ''.join().

Сложности с плавающей точкой: при суммировании большого количества чисел с плавающей точкой возможна потеря точности. Рассмотреть использование math.fsum() для более точного суммирования.

Расширенные примеры использования sum()

Пример 1: Суммирование после применения функции map.

Пример
nums = [1,2,3,4,5]
result = sum(map(lambda x: x*10, nums))
print(result)
150

Пример 2: Суммирование элементов, удовлетворяющих условию, с помощью генератора.

Пример
values = [1, 2, 3, 4, 5, 6]
sum_even = sum(v for v in values if v % 2 == 0)
print(sum_even)
12

Пример 3: Комплексные числа.

Пример
c = [1+2j, 3+4j]
print(sum(c))
(4+6j)

Пример 4: Точное суммирование чисел с плавающей точкой через math.fsum(). Можно сравнить.

Пример
import math
data = [0.1]*10
print(sum(data))
print(math.fsum(data))
0.9999999999999999
1.0

Пример 5: Использование sum для подсчета количества вхождений определенного значения в списке (с помощью генератора сравнений).

Пример
items = ['a', 'b', 'a', 'c', 'a']
count_a = sum(1 for x in items if x == 'a')
print(count_a)
3

Пример 6: Суммирование вложенных списков с помощью itertools.chain (эффективный способ).

Пример
from itertools import chain
big_list = [[1,2],[3,4],[5,6]]
flat = list(chain.from_iterable(big_list))
print(sum(flat))
21

Пример 7: Суммирование с начальным значением, равным другому списку, для конкатенации (демонстрация неэффективности).

Пример
list_of_lists = [[1],[2],[3]]
result = sum(list_of_lists, [])
print(result)
[1, 2, 3]

Пример 8: Суммирование больших диапазонов с генератором.

Пример
gen = (i for i in range(10**6))
print(sum(gen))
499999500000

Пример 9: sum с пользовательским объектом, имеющим метод __add__.

Пример
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __add__(self, other):
        return Point(self.x+other.x, self.y+other.y)
    def __repr__(self):
        return f'Point({self.x},{self.y})'
pts = [Point(1,2), Point(3,4)]
print(sum(pts))
Point(4,6)

Пример 10: Суммирование с элементами кортежа (кортеж чисел).

Пример
tup = (5, 10, 15)
print(sum(tup))
30

Функция sum() в Python - comments

En
Sum python (python)