Перейти до змісту

Чисті функції

Детермінована функція — функція яка для одного й того ж набору вхідних значень завжди повертає однаковий результат.

Приклад детермінованої функції:

def sum(a, b):
    return a + b

Скільки б раз ми не викликали функцію sum з аргументами 3 і 6 — завжди отримаємо 9.

І приклад недетермінованої функції:

from random import randint
def roll_dice():
    return randint(1, 6)

Чиста Функція (pure function) — детермінована функція яка не має ніяких побічних ефектів.

Функція не має побічних ефекті, якщо:

  • не використовує ввід-вивід (файлову систему, стандартні потоки, мережа)
  • не використовує глобальні змінні
  • не міняє передані їй аргументи
  • не міняє хід виконання програми
  • не використовує нечисті функції

Переваги чистих функцій:

  • надійніші, оскільки не залежать «від погоди» і стану оточення, тільки від аргументів
  • легше читати і розуміти
  • легше тестувати
  • легше пітримувати
  • не залежать від порядку виклику
  • можна виконувати паралельно
  • можна кешувати результат

Приклад функції з побічним ефектом:

def sort_by_sort(some_list):
    some_list.sort()
    print(some_list)

У вищенаведеної функції два побічних ефекти:

  1. міняє значення аргумента
  2. присутній вивід

А ось функція без побічних ефектів:

def sort_by_sorted(some_list):
    return sorted(some_list)

Намагайтесь робити функції чистими!

Коли розробник читає чужий код, він у більшості випадків сприймає усі функції як чисті. Якщо ж ви створюєте нечисту функцію, обов'язково вкажіть на це! Наприклад у документації до функції. Навіть ім'я функції має вказувати що вона нечиста. Приклади імен нечистих функцій:

  • print_list
  • write_data
  • save_config
  • store_to_database
  • fetch_response

Додаткові матеріали

Back to top