Функция sum: как суммировать элементы в Python
Функция sum в Python: обзор и применение
Функция sum - это встроенный инструмент для вычисления суммы элементов итерируемого объекта. Она принимает два аргумента: iterable (обязательный) и start (необязательный, по умолчанию 0). Наиболее эффективное решение - передать последовательность чисел напрямую:
numbers = [10, 20, 30, 40]
result = sum(numbers)
print(result) # 100Python max (функция max в python)
Функция работает с любым итерируемым объектом: списками, кортежами, множествами, генераторами.
Типичные ошибки:
- Передача строк - вызовет
TypeError, так какsumне предназначен для конкатенации строк (используйте''.join()). - Пустой итератор:
sum([])вернет 0, это безопасно, но если нужна проверка на пустоту - используйте дополнительное условие. - Смешанные типы (строки + числа) приведут к ошибке.
Как задать начальное значение для суммы?
Параметр start позволяет начать суммирование с произвольного числа:
values = [1, 2, 3]
total = sum(values, 10)
print(total) # 16функция bin python (встроенная функция bin() в python)
Это удобно, когда нужно добавить фиксированную константу к итогу или работать с накопительными расчётами.
Если start не число, а, например, список, то функция попытается сложить элементы с помощью оператора +. Для списков это приведет к конкатенации, но работает крайне неэффективно из-за создания копий на каждой итерации. Лучше использовать itertools.chain.
Как суммировать элементы по условию?
Выражение-генератор внутри sum позволяет отфильтровать данные:
numbers = [1, 2, 3, 4, 5, 6]
even_sum = sum(n for n in numbers if n % 2 == 0)
print(even_sum) # 12Python id name (использование id() и name в python)
Такой подход не создает промежуточный список, экономя память.
Как суммировать результаты функции для каждого элемента?
Комбинация sum и map:
prices = [100, 200, 150]
with_tax = sum(map(lambda x: x * 1.2, prices))
print(with_tax) # 540.0команда open в python (команда open для открытия файлов в python)
Или с именованной функцией:
def double(x):
return x * 2
values = [5, 10, 15]
total = sum(map(double, values))
print(total) # 60Enumerate python (функция enumerate в python)
Если map возвращает итератор, а последовательность очень большая, такой вариант не расходует лишнюю память.
Что делать, если нужно суммировать числа с плавающей точкой без ошибок округления?
Для критичных к точности расчётов применяют Decimal из модуля decimal:
from decimal import Decimal
decimals = [Decimal('0.1'), Decimal('0.2'), Decimal('0.3')]
total = sum(decimals)
print(total) # 0.6функция sum в python (функция sum в python)
Обычный float дал бы 0.6000000000000001.
Обратите внимание: sum с Decimal работает корректно, так как для них определён оператор сложения. Аналогично для Fraction.
Как объединить несколько списков в один с помощью sum?
Технически возможно (но не рекомендуется из-за квадратичной сложности):
list_of_lists = [[1, 2], [3, 4], [5, 6]]
flattened = sum(list_of_lists, [])
print(flattened) # [1, 2, 3, 4, 5, 6]
Этот способ создает новый список на каждом шаге. Для больших данных лучше использовать itertools.chain.from_iterable.
Проблема проявляется с ростом числа вложенных списков - время работы растёт квадратично. В учебных целях пример допустим, но не для продакшена.
Расширенные примеры использования sum
Суммирование комплексных чисел
complex_nums = [1+2j, 3-1j, 4+5j]
result = sum(complex_nums)
print(result) # (8+6j)
Использование с генератором бесконечной последовательности (ограниченным)
def generate_values(n):
for i in range(n):
yield i * 2
total = sum(generate_values(1000000))
print(total) # 999999000000
Генератор не хранит все значения в памяти.
Суммирование с помощью itertools.chain (объединение итераторов)
import itertools
seq1 = [1, 2, 3]
seq2 = (4, 5)
seq3 = {6, 7}
combined = itertools.chain(seq1, seq2, seq3)
total = sum(combined)
print(total) # 28
Работа с Fraction (дроби)
from fractions import Fraction
fractions = [Fraction(1, 2), Fraction(1, 3), Fraction(1, 6)]
total = sum(fractions)
print(total) # 1
Суммирование с использованием Decimal и контекстом точности
from decimal import Decimal, getcontext
getcontext().prec = 50
decimals = [Decimal('1.12345678901234567890'), Decimal('2.98765432109876543210')]
total = sum(decimals)
print(total) # 4.11111111011111111100
Производительность: sum vs reduce vs цикл
import time
from functools import reduce
numbers = list(range(10**7))
start = time.time()
total = sum(numbers)
print('sum:', time.time() - start)
start = time.time()
total = reduce(lambda a, b: a + b, numbers)
print('reduce:', time.time() - start)
start = time.time()
total = 0
for n in numbers:
total += n
print('loop:', time.time() - start)
sum: 0.08 reduce: 0.35 loop: 0.28
Видно, что sum - самая быстрая за счёт реализации на C.
Суммирование с обработкой ошибок (типы)
mixed = [1, 2, '3']
try:
total = sum(mixed)
except TypeError as e:
print(f"Ошибка: {e}")
Ошибка: unsupported operand type(s) for +: 'int' and 'str'
Использование sum для подсчёта логических значений
booleans = [True, False, True, True, False]
count_true = sum(booleans)
print(count_true) # 3