Функції

У програмуванні часто трапляються завдання, які повторюються знову й знову: сортування списків, фільтрація даних, пошук елементів, обчислення середнього значення тощо. Було б нераціонально щоразу писати однакові алгоритми наново. Уявіть собі, що для кожного проєкту вам доводиться вручну переписувати одну й ту саму сортувальну функцію — це якби кожного разу будувати велосипед з нуля замість того, щоб просто сісти й поїхати.

Саме тому в 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
    ...

Типові помилки при роботі з функціями