Розкрийте всі можливості функції `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.