Как работает sum в python
Перейти к содержимому

Как работает sum в python

  • автор:

Какая функция нужна для сложения числе в 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() принимает два аргумента:

  1. последовательность, которую суммируем
  2. первое слагаемое для итоговой суммы, по умолчанию — 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *