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.xmath.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 3.8: Теперь параметр
startможно указывать как ключевое слово:
# Работает с Python 3.8+ sum([1, 2, 3], start=5) # Работает с Python 3.8+
Изменено в Python 3.12: Для суммы чисел с плавающей точкой (
float) используется более точный алгоритм, который улучшает коммутативность и уменьшает ошибки округления.
Изменено в Python 3.14: Добавлена специализация для комплексных чисел, использующая тот же улучшенный алгоритм, что и для
float.
sum(),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
complex_numbers = [1+2j, 3+4j, 5+6j] total = sum(complex_numbers) print(total) # -> (9+12j)
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
Предположим, есть файл 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-данные:
{ "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)
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
В этом случае необходимо сначала преобразовать строку с числами, разделенные пробелами/запятыми или какой либо подстрокой в список строк с числами.
Это можно сделать следующими способами:
' ' или ';' методом строки str.split(),re.split(),re.findall().Дальнейший алгоритм вычисления суммы чисел, находящихся в строке с разделителем будет аналогичен предыдущему примеру.
>>> 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 г. Тогда число души считается следующим образом:
Изобразим подсчет числа "Души" на языке 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