Справочник по Python · модуль 3 · списки и циклы
Глава 3.15
Функция sum()
sum() последовательно складывает числовые элементы итерируемого объекта. Она заменяет ручной цикл с накоплением суммы и хорошо сочетается с выражениями, которые создают числа по одному.
- Категория
- Встроенные функции
- Уровень
- Средний
- Связанные темы
- Коллекции, циклы, логические значения
- Зачем это знать
- Суммировать и считать без ручного накопителя
§1Назначение и синтаксис
sum(iterable, start=0) складывает элементы iterable, начиная со значения start. Второй аргумент необязателен.
| Параметр | Что передаём | По умолчанию |
|---|---|---|
iterable | объект, который выдаёт складываемые значения | обязателен |
start | значение, прибавляемое до элементов | 0 |
§2Обычная сумма
numbers = [1, 2, 3, 4] result = sum(numbers) print(result)
10
Ручной цикл дал бы тот же результат, но потребовал бы отдельно создать переменную-накопитель и обновлять её на каждой итерации.
§3Параметр start
Начальное значение не заменяет первый элемент. Оно прибавляется к сумме всех элементов.
numbers = [1, 2, 3] result = sum(numbers, 10) print(result)
16
§4Разные итерируемые объекты
sum() принимает не только список. Важно не название типа, а возможность получить из объекта складываемые значения.
values = (5, 10, 15) unique = {1, 2, 3, 4} print(sum(values)) print(sum(unique)) print(sum(range(5)))
30 10 10
§5Пустая коллекция
Без элементов результат равен начальному значению. Поэтому sum([]) возвращает 0, а не вызывает ошибку.
print(sum([])) print(sum([], 100))
0 100
§6Подсчёт элементов по условию
В арифметике Python True ведёт себя как 1, а False — как 0. Поэтому сумма результатов проверок равна количеству выполненных условий.
numbers = [1, 2, 3, 4, 5] checks = [number > 2 for number in numbers] print(checks) print(sum(checks))
[False, False, True, True, True] 3
§7Сумма преобразованных значений
Внутри sum() можно формировать каждое слагаемое. Такая запись не требует заранее создавать отдельный список квадратов.
numbers = [1, 2, 3] result = sum(number ** 2 for number in numbers) print(result)
14
Конструкцию внутри скобок подробно разберём в следующей главе. Пока достаточно читать её как «квадрат каждого числа из numbers».
§8Объединение списков и строк
sum(lists, []) способен объединить небольшие списки, но многократно создаёт промежуточные списки. Для крупных данных лучше использовать специализированные способы.
groups = [[1, 2], [3, 4], [5, 6]] print(sum(groups, []))
[1, 2, 3, 4, 5, 6]
sum(["Hello", "World"], "") вызывает TypeError. Для объединения строк используйте " ".join(words).
words = ["Hello", "World"] result = " ".join(words) print(result)
Hello World
§9Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
sum(1, 2, 3) | TypeError: первым аргументом должен быть один итерируемый объект | sum([1, 2, 3]) |
sum([1, 2, "3"]) | TypeError: число и строку нельзя сложить | преобразовать данные к числам заранее |
sum(words, "") | TypeError: sum() запрещает строковый start | "".join(words) |
sum(numbers, 10) считают заменой первого числа | 10 прибавится ко всем элементам | читать start как начальное значение накопителя |
объединять через sum() тысячи списков | создаётся много промежуточных списков | выбрать способ без повторного копирования данных |
§10Проверьте себя
Чему равно sum([], 7)?
7: элементов нет, поэтому результатом остаётся начальное значение.
Что означает второй аргумент sum()?
Начальное значение, к которому прибавляются все элементы.
Как объединить список строк?
Методом separator.join(words), например " ".join(words).
§11Шпаргалка
sum(numbers)sum(numbers, start)sum(checks)separator.join(words)Итог главы
sum() складывает значения из одного итерируемого объекта. Необязательный start задаёт начальное значение, пустая коллекция возвращает именно его, а сумма логических результатов позволяет подсчитать выполненные условия. Для строк используется join().