Функції
У програмуванні часто трапляються завдання, які повторюються знову й знову: сортування списків, фільтрація даних, пошук елементів, обчислення середнього значення тощо. Було б нераціонально щоразу писати однакові алгоритми наново. Уявіть собі, що для кожного проєкту вам доводиться вручну переписувати одну й ту саму сортувальну функцію — це якби кожного разу будувати велосипед з нуля замість того, щоб просто сісти й поїхати.
Саме тому в Python, як і в будь-якій мові програмування, існує поняття функції.
У цьому розділі:
Що таке функція?
Функція (також зустрічаються синоніми: підпрограма, процедура) — це фрагмент коду, який виконує певне завдання і до якого можна багаторазово звертатися з різних частин програми. Завдяки цьому один раз написаний алгоритм можна використовувати десятки і сотні разів без дублювання коду.
Функції бувають:
- вбудовані — уже існують у мові, наприклад
len()
,print()
,sum()
; - бібліотечні — імпортуються з модулів, наприклад
math.sqrt()
,random.choice()
; - користувацькі (створені програмістом) — ви самі визначаєте, що робить така функція.
Функції — це основа для організації коду: вони допомагають структурувати програму, зменшити повторення, зробити код зручнішим для читання, тестування та підтримки.
Без функцій програми перетворилися б на хаотичну мішанину-копіпасту, де кожен шматок логіки треба було б шукати та оновлювати вручну. А з функціями — код стає більш модульним, лаконічним і перевикористовуваним.
Переваги використання функцій
Використання функцій — це не просто стиль написання коду, а стратегія, яка робить програму кращою у багатьох сенсах. Ось основні переваги:
1. Економія часу
Коли алгоритм одного разу реалізований у вигляді функції, його можна багаторазово використовувати без повторного написання. Це значно скорочує час розробки та дозволяє зосередитись на вирішенні нових завдань, а не на технічному дублюванні коду.
Метафора: функція — це як форма для печива: замість того, щоб щоразу вирізати фігурки вручну, ми просто натискаємо — і отримуємо готовий результат.
2. Надійність
Функції часто створюються з розрахунком на багаторазове використання, і з часом вони проходять перевірку практикою. Використовуючи перевірені функції (вбудовані, бібліотечні або власні), ми зменшуємо ризик помилок — адже їхня логіка вже протестована та працює стабільно.
3. Покращена читабельність коду
Коли програма поділена на окремі невеликі функції з чіткими назвами, її легше зрозуміти. Замість великого суцільного блоку коду ми бачимо логічну структуру: що робиться, у якому порядку, з якими даними.
- ❌ Поганий приклад: Великий шматок коду на 100 рядків без єдиної функції.
- ✅ Хороший приклад: 100 рядків коду розбиті на 5 зрозумілих функцій, кожна з яких виконує одне завдання.
4. Зручність для тестування
Коли код поділено на функції, кожну з них можна перевірити окремо. Це робить програму більш тестопридатною (англ. testable): ми можемо написати тести для кожної функції й упевнитися, що вона працює правильно незалежно від решти програми.
Наприклад, функцію calculate_discount(price, percent)
можна протестувати окремо — не потрібно запускати всю програму.
Як створити функцію?
Для того, щоб використати функцію, її треба оголосити — дати зрозуміти інтерпретатору, що це функція і її будуть викликати. Розглянемо на прикладі оголошення функції minimum
, яка повертає мінімальне значення з двох цілих чисел.
def minimum(a, b) :
"""Мінімальне значення з двох цілих чисел."""
if b < a:
return b
else:
return a
# Виклик функції. Повинно повернути 4.
print(minimum(17, 4))
# Можемо викликати багато разів. Повинно повернути 100.
print(minimum(100, 200))
# Повинно повернути -2.
print(minimum(2, -2))
У загальному випадку оголошення функції виглядає так:
def <імʼя_функції>(<перелік_аргументів>):
<тіло_функції>
Елемент | Опис |
---|---|
def |
Обовʼязкове ключове слово. |
<імʼя_функції> | Імʼя функції, повинно відповідати усім правилам ідентифікаторів. В нашому прикладі це minimum . |
<перелік_аргументів> | Функція може приймати 0, 1, 2 або більше аргументів. В нашому прикладі функція приймає два аргументи: a, b . |
<тіло_функції> | Оператори, що будуть виконані, якщо викликати цю функцію. |
Як викликати функцію?
Для того, щоб викликати функцію достатньо написати її імʼя (ідентифікатор) та передати аргументи. У загальному випадку виклик функції виглядає так:
<імʼя_функції>(<перелік_аргументів>)
# Приклад:
minimum(17, 4)
Елемент | Опис |
---|---|
<імʼя_функції> | Імʼя функції, яку ми оголосили раніше, або імпортували, або імʼя вбудованої функції. В нашому прикладі це minimum . |
<перелік_аргументів> | Значення, які ми передаємо у функцію. В нашому прикладі це 17 та 4 . |
Аргументи за замовчуванням
Функції в Python можуть мати аргументи за замовчуванням — це значення, які використовуються, якщо під час виклику функції відповідний аргумент не передано. Це робить функції гнучкішими: ми можемо викликати їх із різною кількістю аргументів.
Значення за замовчуванням задаються просто під час оголошення функції. У цьому прикладі аргумент greeting
має значення за замовчуванням "Привіт"
. Якщо ми його не передамо, буде використано це значення.
def greet(name, greeting="Привіт"):
print(f"{greeting}, {name}!")
# Передаємо лише імʼя
greet("Іване") # Виведе: Привіт, Іване!
# Передаємо обидва аргументи
greet("Оксано", "Доброго ранку") # Виведе: Доброго ранку, Оксано!
Якщо функція має кілька аргументів із замовчуванням, ви можете передати лише ті, що хочете змінити, за іменем:
def show_info(name, age=18, city="Київ"):
print(f"{name}, {age} років, з міста {city}")
show_info("Марко") # Марко, 18 років, з міста Київ
show_info("Марко", city="Львів") # Марко, 18 років, з міста Львів
Аргументи зі значенням за замовчуванням мають іти після всіх звичайних аргументів. Якщо порушити це правило, то виникне помилка «SyntaxError: parameter without a default follows parameter with a default»:
def func(a, b=0): # ✅ дозволено
...
def func(a=0, b): # ❌ помилка: SyntaxError: parameter without a default follows parameter with a default
...