Сообщить об ошибке.

Функция sum() в Python, сумма последовательности

Сумма всех элементов в последовательности

Синтаксис:

sum(iterable, /, start=0)

Параметры:

  • iterable - объект, поддерживающий итерацию,
  • start - число, начальное значение для суммы.

Возвращаемое значение:

  • сумма элементов.

Описание функции sum():

Изменено в Python 3.14: Добавлена специализация для комплексных чисел, использующая тот же улучшенный алгоритм, что и для float.

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

Функция sum() ожидает, что элементы iterable являются числами, а начальное значение start не может быть строкой. Если аргумент iterable пуст, то функция sum() возвращает начальное значение start, если оно указано.

Например:

>>> sum([1, 2, 3])
# 6
>>> sum((1.5, 2.3, 3.2))
# 7.0
>>> sum([1, 2, 3], start=10)
# 16

# доступно с версии Python 3.14
>>> sum([1+2j, 3+4j], start=0j)  
# (4+6j)

В некоторых случаях лучше использовать не функцию sum(), а другие альтернативы:

  • Сложить строки - ''.join(sequence), функция sum() медленная для строк и запрещена начиная с Python 3.x
  • Суммировать числа с плавающей точкой с высокой точностью - math.fsum(), она лучше справляется с погрешностями округления
  • Объединить несколько итерируемых объектов (например, списков) - itertools.chain(), она удобнее и эффективнее для склеивания

О внутреннем устройстве

  • Функция sum() накапливает результат, последовательно прибавляя каждый элемент к промежуточной сумме.
  • Это O(n) операция - линейное время работы.
  • При работе с большими массивами float или complex рекомендуется использовать math.fsum() или NumPy-аналоги.

Распространённые ошибки

sum(['a', 'b', 'c'])
# TypeError: unsupported operand type(s) for +: 'int' and 'str'

sum(['a', 'b', 'c'], start='')
# ValueError: sum() can't sum strings; use ''.join() instead

Правильный способ:

>>> ''.join(['a', 'b', 'c'])  
# 'abc'

Изменения в версиях Python

Изменено в Python 3.8: Теперь параметр start можно указывать как ключевое слово:

# Работает с Python 3.8+
 sum([1, 2, 3], start=5)  # Работает с Python 3.8+

Изменено в Python 3.12: Для суммы чисел с плавающей точкой (float) используется более точный алгоритм, который улучшает коммутативность и уменьшает ошибки округления.

Изменено в Python 3.14: Добавлена специализация для комплексных чисел, использующая тот же улучшенный алгоритм, что и для float.

Примеры вычисления суммы разных последовательностей.

Короткие примеры

Сумма с генератором

total = sum(x * x for x in range(5))
print(total)  # -> 0^2 + 1^2 + 2^2 + 3^2 + 4^2 = 30

Сумма только чётных чисел

numbers = [1, 2, 3, 4, 5, 6]
total = sum(x for x in numbers if x % 2 == 0)
print(total)  # -> 12

Сумма элементов списка списков (плоская сумма)

list_of_lists = [[1, 2], [3, 4], [5]]
total = sum(sum(sublist) for sublist in list_of_lists)
print(total)  # -> 15

Или можно "распаковать" список списков с помощью itertools.chain:

from itertools import chain
total = sum(chain.from_iterable(list_of_lists))
print(total)  # -> 15

Сумма комплексных чисел (начиная с Python 3.14)

complex_numbers = [1+2j, 3+4j, 5+6j]
total = sum(complex_numbers)
print(total)  # -> (9+12j)

Подсчёт количества истинных значений (True/False)

bool_values = [True, False, True, True]
count = sum(bool_values)
print(count)  # -> 3

Потому что в Python: True == 1, False == 0.

Подсчёт совпадений по условию

words = ['apple', 'banana', 'cherry', 'avocado']
count = sum(1 for word in words if word.startswith('a'))
print(count)  # -> 2

Сумма атрибутов объектов

class Product:
    def __init__(self, price):
        self.price = price

products = [
    Product(10),
    Product(20),
    Product(30)
]

total_price = sum(p.price for p in products)
print(total_price)  # -> 60

Сумма по столбцу в таблице (например, список словарей)

data = [
    {'name': 'Alice', 'score': 80},
    {'name': 'Bob', 'score': 90},
    {'name': 'Charlie', 'score': 85}
]

total_score = sum(item['score'] for item in data)
print(total_score)  # -> 255

Работа с float (начиная с Python 3.12 точнее!)

floats = [0.1] * 10
total = sum(floats)
print(total)  # -> 1.0 (или очень близко к нему)

Начиная с Python 3.12 используется улучшенный алгоритм суммирования для float, который лучше учитывает ошибки округления.

Сумма длин строк в списке

words = ['hello', 'world', 'Python']
total_length = sum(len(word) for word in words)
print(total_length)  # -> 5 + 5 + 6 = 16

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

Анализ данных: Подсчёт общего дохода

orders = [
    {'product': 'Телефон', 'quantity': 2, 'price': 600},
    {'product': 'Чехол', 'quantity': 5, 'price': 30},
    {'product': 'Зарядка', 'quantity': 3, 'price': 20}
]

total_income = sum(order['quantity'] * order['price'] for order in orders)
print(f"Общий доход: {total_income} руб.")  
# Общий доход: 1410 руб.

Финансовый анализ: Сумма всех расходов по категориям

expenses = {
    'еда': [120, 80, 50],
    'транспорт': [30, 45],
    'развлечения': [100, 75]
}

total_expenses = sum(sum(values) for values in expenses.values())
print(f"Всего потрачено: {total_expenses} руб.")
# Всего потрачено: 490 руб.

Игра: Подсчёт очков игрока (например, в карточной игре)

player_hand = [5, 10, 'J', 'A']

card_values = {
    'J': 11,
    'Q': 12,
    'K': 13,
    'A': 14
}

total_score = sum(card_values.get(card, card) for card in player_hand)
print(f"Очки игрока: {total_score}")
# Очки игрока: 40

Работа с CSV: Подсчёт суммы значений из файла

Предположим, есть файл sales.csv:

product,sales
apples,100
bananas,150
oranges,80

Подсчёт суммы значений из файла:

import csv

with open('sales.csv', newline='') as csvfile:
    reader = csv.DictReader(csvfile)
    total_sales = sum(int(row['sales']) for row in reader)

print(f"Итого продаж: {total_sales}")
# Итого продаж: 330

Обработка JSON: Сумма чисел в структуре

Допустим, у нас есть JSON-данные:

{
  "data": {
    "values": [10, 20, 30, 40]
  }
}

Сумма чисел в структуре

import json

json_data = '{"data": {"values": [10, 20, 30, 40]}}'
data = json.loads(json_data)
total = sum(data['data']['values'])
print(f"Сумма: {total}")  
# Сумма: 100

Обработка текста: Сумма длин слов, удовлетворяющих условию

text = "Python is awesome and powerful"
words = text.split()
total_length = sum(len(word) for word in words if len(word) > 3)
print(f"Суммарная длина слов длиннее 3 букв: {total_length}")
# -> Суммарная длина слов длиннее 3 букв: 14 (Python + awesome + powerful)

Подсчёт True/False в логических операциях

results = [True, False, True, True, False]
success_count = sum(results)
print(f"Количество успешных проверок: {success_count}")
# Количество успешных проверок: 3

Игра "Больше-меньше": Подсчёт количества правильных ответов

answers = [(5, 10), (3, 3), (7, 2), (1, 9)]
correct = sum(1 for a, b in answers if a < b)
print(f"Правильных ответов: {correct}")
# Правильных ответов: 2

Математика: Подсчёт суммы арифметической прогрессии

start, stop, step = 1, 10, 2
sequence = range(start, stop, step)
total = sum(sequence)
print(f"Сумма арифметической последовательности: {total}")
# Сумма арифметической последовательности: 25

Вычисление суммы списка строк с числами.

Для преобразования списка строк с числами включая десятичные c разделением их по типам int и float, необходимо перед преобразованием в тип float проверять строку на вхождение точки '.'.

Для проверки строки на целое число перед преобразованием проверим, что строка состоит только из десятичных чисел str.isdigit().

После выполнения всех преобразований применим функцию sum().

>>> str_list = ['8.3', '11', 'девять.', '1', '5', '3', '9', 'пять', '15', '13', '7', '13.9', 'число']
>>> def str_to_num(str):
...     str = str.strip()
...     if '.' in str and str.replace('.', '').isdigit():
...         return float(str)
...     elif str.isdigit():
...         return int(str)
... 
>>> num_list = []
>>> for i in str_list:
...     n = str_to_num(i)
...     if n is not None:
...         num_list.append(str_to_num(i))

>>> num_list
# [8.3, 11, 1, 5, 3, 9, 15, 13, 7, 13.9]
>>> sum(num_list)
# 86.2

Подсчет суммы чисел в строке разделенных пробелами/запятыми/подстрокой.

В этом случае необходимо сначала преобразовать строку с числами, разделенные пробелами/запятыми или какой либо подстрокой в список строк с числами.

Это можно сделать следующими способами:

Дальнейший алгоритм вычисления суммы чисел, находящихся в строке с разделителем будет аналогичен предыдущему примеру.

>>> line = '8.3 11 девять 1 5 3 9 пять 15 13 7 13.9 число'
# 1 - используем метод строки str.split()
>>> str_list = line.split(' ')
>>> str_list
# ['8.3', '11', 'девять', '1', '5', '3', '9', 'пять', '15', '13', '7', '13.9', 'число']

# 3 способ - используем функцию re.findall()
>>> line = '8.3 11 девять. 1 5 3 9 пять 15 13 7 13.9 число'
>>> match = re.findall(r'[\d\.?,?]+', line)
>>> list(match)
# ['8.3', '11', '1', '5', '3', '9', '15', '13', '7', '13.9']

# Далее будем делать то же самое что и в предыдущем примере
...
# Выполняем преобразование списка строк с 
# числами str_list в  список целых и десятичных чисел
...

# в итоге преобразований, описанных в предыдущем
# примере получаем список чисел, к которым 
# применим функцию 'sum()'
>>> num_list
# [8.3, 11, 1, 5, 3, 9, 15, 13, 7, 13.9]
>>> sum(num_list)
# 86.2

Подсчет суммы цифр в числе.

Допустим есть число, целое или вещественное и необходимо подсчитать сумму цифр этого числа. Для того, что бы это сделать нужно это число преобразовать в список входящих в него цифр, а потом применить к полученному списку функцию sum().

Алгоритм действий будет следующим:

  • преобразуем число в строку при помощи функции str();
  • число может быть как int, так и float, следовательно необходимо произвести замену десятичного разделителя '.' при помощи строкового метода str.replace();
  • преобразовываем полученную строку с числом в список строк с цифрами функцией list();
  • далее преобразовываем каждый элемент полученного списка строк с цифрами в список целых чисел используя функцию map();
  • применяем функцию sum() к итоговому списку.
>>> pi = 3.1415926
# число в строку
>>> str_pi = str(pi)
# производим замену десятичного разделителя
>>> str_pi = str_pi.replace('.', '')
# строку с числом в список строк с цифрами
>>> lst_str = list(str_pi)
# преобразовываем каждый элемент полученного
# списка строк с цифрами в список целых чисел
>>> lst_num = map(int, lst_str)
# применяем функцию `sum()`
>>> s = sum(lst_num)
>>> s
# 31

Считаем число "Души" (нумерология).

Есть такая эзотерическая концепция "Нумерология", согласно которой числа определяют нашу жизнь и существование всего, что нас окружает. Так вот, в ней есть понятие "числа души человека", которое считается сложением всех цифр в дате его рождения, пока не получится число, которое меньше 10. То есть число от 1 до 9.

Например, есть дата рождения 29.09.2019 г. Тогда число души считается следующим образом:

  1. 2 + 9 + 0 + 9 + 2 + 0 + 1 + 9 = 32
  2. 3 + 2 = 5

Изобразим подсчет числа "Души" на языке Python. Для краткости, воспользуемся понятием выражения генератора-списка:

def soul(num):
    # считаем до тех пор пока длина 
    # строкового представления `num` больше 1 
    while len(str(num)) > 1:
        # функция sum() складывает список цифр
        # для краткости воспользуемся генератором списка
        num = sum( # генератор-списка
                  [int(n) # преобразуем строку в цифру   
                   # проходимся по элементам списка строк
                   for n in list(str(num)) # список строк из числа (даты)
                   # проверяем строку на цифру
                   if n.isdigit()]
                 )
    return num

# дата
date = '29.09.2019'
s = soul(date)
print(date, '=>', s)
# 29.09.2019 => 5

# целое число
num = 1357
s = soul(num)
print(num, '=>', s)
# 1357 => 7

# вещественное число 
pi = 3.1415926
s = soul(pi)
# 3.1415926 => 4