Какая функция нужна для сложения числе в Python?
Встроенная функция sum() cуммирует начало (необязательный аргумент) и элементы итерации слева направо и возвращает итоговую сумму.
sum(iterable, /, start=0)
iterable — объект, поддерживающий итерацию по его элементам, при том, что подразумевается, что элементы объекта являются числами, не строками. start — число, начальное значение для последующей суммы. Если iterable пуст, функция sum() вернёт только начальное значение (по умолчанию 0)
# Возвращаемое значение для пустого списка x = [] print(sum(x)) # здесь start равен 0 # => 0 print(sum(x, 2)) # здесь start равен 2 # => 2 # Возвращаемое значение для списка целых чисел x = [5, 10, 15] print(sum(x)) # => 30 # Возвращаемое значение для списка вещественных чисел x = [1.4, 3.5, 5.2] print(sum(x)) # => 10.1
Python. Подвох в функции sum()
Сидите вы на работе и смотрите на дневную статистику по заявкам разных типов:
monday = tuesday = wednesday =
Задача — посчитать агрегированную статистику за все дни. Всё вроде понятно. Тут подходит тимлид и говорит, что если решите задачу однострочником, он подарит вам жёлтую резиновую уточку.
Устоять перед этим решительно невозможно.
Словари → счётчики
Сначала от словарей надо перейти к счётчикам. Воспользуемся для этого функцией map() . Она принимает на входе функцию и последовательность (iterable), после чего применяет функцию к каждому элементу последовательности и возвращает, что получилось. Например:
>>> mapped = map(abs, [-1, -2, -3]) >>> list(mapped) [1, 2, 3]
abs() возвращает абсолютное значение числа, а list() тут нужен, чтобы отработал map (сам по себе он ленивый, пока не пнёшь — не полетит).
В нашем случае последовательностью будет набор дневных статистик, а функцией — конструктор счётчика:
>>> map(Counter, [monday, tuesday, wednesday])
map object — это итератор, который сделает из словарей счётчики, когда нам это действительно понадобится — в момент суммирования.
Счётчики → агрегат
Окей, теперь осталось только посчитать сумму от этого добра. Как мы знаем, у счётчиков перекрыт оператор сложения, так что почему бы просто не вызвать sum() на них?
>>> sum(map(Counter, [monday, tuesday, wednesday])) Traceback (most recent call last): File "", line 1, in TypeError: unsupported operand type(s) for +: 'int' and 'Counter'
Эээ, что? Откуда тут int , мы же суммируем объекты Counter ?
Оказывается, функция sum() принимает два аргумента:
- последовательность, которую суммируем
- первое слагаемое для итоговой суммы, по умолчанию — 0
>>> sum([1, 2, 3]) 6 >>> sum([1, 2, 3], 10) 16
Получается, в нашем случае sum() пытается сложить 0 со счётчиком от monday , и, естественно, ломается. Решение — передать в качестве первого слагаемого пустой счётчик:
sum(. Counter())
Объединяем всё вместе:
>>> sum(map(Counter, [monday, tuesday, wednesday]), Counter()) Counter()
Почему вздыхает Гвидо
Гвидо ван Россум недолюбливает map() и, кажется, функциональщину как таковую. Вместо неё он предпочитает пользоваться comprehensions.
В нашем случае вместо map() можно использовать такую конструкцию:
(Counter(stat) for stat in [monday, tuesday, wednesday])
Используйте с осторожностью
Ради жёлтой резиновой уточки на многое можно пойти, но всё-таки лучше использовать однострочники с осторожностью. Главный критерий хорошего кода — простота понимания. Поэтому вполне можно добавить промежуточную переменную, а то и две:
daily_stats = map(Counter, [monday, tuesday, wednesday]) empty_stat = Counter() sum(daily_stats, empty_stat)
А если не хотите, чтобы читатель мучительно вспоминал, что за такой второй аргумент в sum() , можно и вовсе сделать так:
daily_stats = map(Counter, [monday, tuesday, wednesday]) functools.reduce(operator.add, daily_stats)
Лично мне такой вариант даже больше нравится ツ
Подписывайтесь на канал, чтобы не пропустить новые заметки
Как работает sum в python
Суммирует элементы указанного объекта и возвращает результат.
sum(iterable[, start])
iterable — Объект, поддерживающий итерацию по его элементам. Ожидается, что элементы этого объекта являются числами, но не строками. Если объект пуст, функция вернёт начальное значение (start).
start=0 — Число, с которого следует начать суммирование.
sum([]) # 0
sum([1, 2, 3]) # 6
sum([], 3) # 3
sum([1, 2], 3) # 6
На заметку
Выражение sum(range(n), m) эквивалентно reduce(operator.add, range(n), m) .
Идиомы суммирования
- Для суммирования чисел с плавающей запятой с расширенной точностью используйте math.fsum() .
- Для конкатенации последовательностей, содержащих строки, используйте ».join(sequence) .
- Для конкатенации нескольких последовательностей можно использовать itertools.chain() .
Синонимы поиска: sum, сумма
Метод sum(). Объясните, как работает в данном участке кода
Объясните, пожалуйста, почему программа выводит число 4, ведь при проверке получаются True и False. Как метод sum считает в данном случае?
Отслеживать
задан 19 ноя 2019 в 21:42
23 5 5 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
В Python 3.x True (при конвертации в число) всегда равно 1, а False равно 0.
>>> int(False) 0 >>> int(True) 1
Во втором питоне обычно так же, но не гарантируется, потому что True и False можно переопределить (в третьем — нельзя).
PS. Этот код работает в Python 2.x:
False = 3
Но не будет работать в Python 3.x.