Розуміння функції суми Python [With Examples]

Розкрийте всі можливості функції `sum()` у Python: від основ синтаксису до її застосування з різноманітними ітераційними структурами, доповнені наочними прикладами коду.

Під час обробки ітерованих об’єктів у Python, наприклад, списків чисел, часто виникає потреба обчислити загальну суму всіх елементів. Такі задачі можуть з’являтися при роботі з різними типами ітераторів, такими як кортежі та множини.

Хоча існує декілька способів розв’язання цієї задачі, найбільш рекомендованим і “пітонічним” є використання вбудованої функції `sum()`.

Спершу ми розглянемо альтернативні підходи, зокрема використання циклів та створення користувацької функції. Потім, перейдемо до детального вивчення синтаксису функції `sum()` у Python та наведемо приклади коду для глибшого розуміння її роботи.

Обчислення суми значень в ітераційних об’єктах Python

📋 Ви можете виконувати приклади коду у Python REPL або скористатися онлайн-редактором Python на techukraine.net.

Розглянемо наступний список чисел:

>>> nums = [2,8,5,3,11,7,9]

Наша мета – обчислити суму всіх чисел у цьому списку. Перш ніж перейти безпосередньо до функції `sum()`, розглянемо кілька інших методів, які можна використовувати. До них належать:

  • Застосування звичайного циклу `for`
  • Використання функції `reduce()` з модуля `functools`
  • Створення спеціальної функції

Застосування циклів

Для обчислення суми всіх елементів списку можна скористатися циклом `for`:

  • Спочатку ініціалізуємо змінну `total` нульовим значенням.
  • Перебираємо список чисел, отримуючи доступ до кожного елементу.
  • Додаємо кожен елемент до змінної `total`.
>>> nums = [2,8,5,3,11,7,9]
>>> total = 0
>>> for num in nums:
...     total += num
...
>>> total
45

Використання функції `reduce()`

Інший спосіб підсумування ітерованих об’єктів — використання функції `reduce()`. Функція `reduce()`, що входить до модуля `functools` Python, приймає функцію та ітераційний об’єкт. Вона послідовно застосовує функцію до елементів ітератора, зводячи його до єдиного значення.

Тут ми використовуємо лямбда-функцію для визначення операції додавання двох чисел та передаємо список `nums` як ітерований об’єкт.

>>> nums = [2,8,5,3,11,7,9]
>>> from functools import reduce
>>> total = reduce(lambda n1, n2: n1 + n2, nums)
>>> total
45

Функція `reduce()` працює шляхом послідовного додавання двох чисел — зліва направо — доки не отримає підсумкове значення:

Створення користувацької функції

Ми також можемо визначити власну функцію для цієї задачі. Тут ми створюємо функцію `sum_list`, яка:

  • Приймає список чисел як вхідний аргумент;
  • Повертає суму елементів цього списку.

Тіло функції використовує цикл, як ми вже розглянули раніше. Але визначення функції надає нам можливість її повторного використання.

>>> def sum_list(some_list):
...     total = 0
...     for num in some_list:
...        total += num
...     return total
...

Виклик функції `sum_list()` зі списком `nums` повертає суму 45:

>>> nums = [2,8,5,3,11,7,9]
>>> total = sum_list(nums)
>>> total
45

Далі, вивчимо вбудовану функцію `sum()`. Вона не тільки лаконічна, але й надійна, оскільки коректно працює з різними типами ітераційних об’єктів та даними.

Синтаксис функції `sum()` у Python

Синтаксис використання функції `sum()` має такий вигляд:

sum(iterable, start)

де:

  • `iterable` – це обов’язковий аргумент. Він може представляти будь-який ітераційний об’єкт, для якого визначена операція підсумовування, наприклад, список або кортеж чисел. Виклик функції `sum()` зі строками призведе до виникнення винятку `TypeError` (про це детальніше пізніше).
  • `start` – це необов’язковий аргумент. Він додається до обчисленої суми. Це може бути корисним, коли потрібно додати певне значення до результату.

Тепер, коли ми ознайомилися із синтаксисом функції `sum()`, давайте застосуємо її для підсумовування ітерованих об’єктів.

Підсумовування ітерованих елементів за допомогою функції `sum()`

#1. Список

Обчислимо суму чисел у списку `nums` за допомогою функції `sum()`:

>>> nums = [2,8,5,3,11,7,9]
>>> sum_1 = sum(nums)
>>> sum_1
45

Застосування додаткового початкового значення

Щоб додати постійне значення до суми, можна скористатися функцією `sum()` з необов’язковим початковим значенням. Тут ми передаємо початкове значення `100` як позиційний аргумент:

>>> sum_start = sum(nums,100)
>>> sum_start
145

Початкове значення також можна вказати як аргумент ключового слова:

>>> sum_start = sum(nums,start=10)
>>> sum_start
55

#2. Кортеж

Функція `sum()` також працює з кортежами. Ми створюємо кортеж `nums_tuple` шляхом приведення списку `nums` до кортежу:

>>> nums_tuple = tuple(nums)
>>> nums_tuple
(2, 8, 5, 3, 11, 7, 9)
>>> sum_2 = sum(nums_tuple)
>>> sum_2
45

#3. Множина

Ми також можемо використовувати функцію `sum()` з множиною чисел:

>>> nums_set = set(nums)
>>> nums_set
{2, 3, 5, 7, 8, 9, 11}

Тут ми перетворюємо список `nums` на множину Python і обчислюємо суму елементів у `nums_set`.

>>> sum_3 = sum(nums_set)
>>> sum_3
45

#4. Словник

Розглянемо словник `student_dict` з числовими ключами. Зверніть увагу, що відбувається, коли ви викликаєте функцію `sum()` з цим словником як аргументом.

>>> students_dict = {1:106,2:112,3:127}
>>> sum_4 = sum(students_dict)
>>> sum_4
6

Функція `sum()` за замовчуванням повертає суму ключів.

Підсумовування ключів

Ми знаємо, що за замовчуванням функція `sum()` підсумовує ключі словника.

Проте, ви можете зробити це явним, використовуючи метод `keys()` словника для доступу до ключів, а потім передати список ключів до функції `sum()`:

>>> sum_keys = sum(students_dict.keys())
>>> sum_keys
6

Підсумовування значень

Якщо натомість ви хочете підсумувати значення словника, отримайте доступ до значень, викликавши метод `values()` для об’єкта словника:

>>> sum_vals = sum(students_dict.values())
>>> sum_vals
345

Використання функції `sum()` у Python з іншими числовими типами

До цього моменту ми розглядали використання функції `sum()` з ітерованими цілими числами. Тепер розглянемо кілька прикладів з іншими числовими типами.

Комплексні числа

Функцію `sum()` також можна використовувати для підсумовування комплексних чисел. У цьому прикладі `nums_c` – це список комплексних чисел:

>>> nums_c = [3 + 4j, 1 + 2j]
>>> sum_c = sum(nums_c)
>>> sum_c
(4+6j)

Числа з плаваючою комою

Тут ми використовуємо функцію `sum()`, щоб підсумувати список чисел з плаваючою комою `nums_f`:

>>> nums_f = [1.8,2.5,3.6,7.2]
>>> sum_f = sum(nums_f)
>>> sum_f
15.100000000000001

📑 Для підвищення точності при додаванні чисел з плаваючою комою можна скористатися функцією `fsum()` з модуля `math`, щоб підсумувати ітеровані значення з плаваючою комою.

Зведення за допомогою функції `sum()`

Подивимося, як функцію `sum()` можна використовувати для зведення та конкатенації ітерованих об’єктів.

Зведення списку

Припустімо, у нас є вкладений список:

>>> lists = [[2,4,6],[3,5,7]]

Коли ми викликаємо функцію `sum()`, передаючи цей вкладений список як аргумент разом з порожнім списком як початковим значенням:

>>> sum(lists,[])
[2, 4, 6, 3, 5, 7]

Ми бачимо, що вкладений список тепер зведено в один список чисел.

Аналогічно, якщо уявити, що список має форму `l3 = [l1,l2]`, функція `sum()` об’єднує два списки `l1` та `l2`, вкладені в список `l3`.

📝 Як швидку вправу, спробуйте використати функцію `sum()` для інших вкладених ітераторів.

Поширена помилка: не використовувати функцію `sum()` з рядками

Оскільки ми побачили, що функцію `sum()` можна використовувати для зведення та конкатенації списків (та інших ітераційних об’єктів, таких як кортежі), може виникнути спокуса використати її для конкатенації рядків.

Але якщо ви спробуєте це зробити, ви отримаєте `TypeError`:

>>> sum(['a','b','c'],'')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]

Отже, функцію `sum()` не можна використовувати для підсумовування (або конкатенації) рядків.

Проте, як видно з повідомлення про помилку вище, можна скористатися методом `join()`, щоб об’єднати список рядків в один рядок.

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

Висновок

У цьому посібнику ми навчилися використовувати вбудовану функцію `sum()`, щоб знайти суму всіх елементів в ітераторі. Загальний синтаксис для використання функції `sum()` такий: `sum(iterable, start)`, де `iterable` – обов’язковий аргумент, а `start` – необов’язковий.

Ми розглянули кілька прикладів, щоб зрозуміти використання функції `sum()` з ітерованими об’єктами, такими як списки, кортежі, множини та словники. Згодом, ми вивчили, як функція `sum()` може використовуватись для зведення та конкатенації ітераційних об’єктів, за винятком рядків Python.

Сподіваємося, цей посібник був корисним для вас. Далі, можливо, ви захочете ознайомитися з цим посібником щодо функції `map()` у Python.