Суммирование с помощью sum(): синтаксис, примеры, рекомендации
Основы работы с 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