Взаимоотношения чистых и детерминированных функций | OTUS
🚀 OTUS Fest 2021
Бесплатная образовательная онлайн-конференция для IT-специалистов.
Подробнее

Курсы

Программирование
Backend-разработчик на PHP
-9%
Алгоритмы и структуры данных
-9%
Team Lead
-6%
Архитектура и шаблоны проектирования Разработчик IoT
-13%
C# Developer. Professional
-9%
HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Java Developer. Basic C++ Developer. Professional Web-разработчик на Python MS SQL Server Developer Android Developer. Basic Разработчик программных роботов (RPA) на базе UiPath и PIX Microservice Architecture Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов React.js Developer Node.js Developer Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes JavaScript Developer. Basic Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Экспресс-курс «IaC Ansible»
-10%
Administrator Linux.Basic
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Administrator Linux. Professional
-6%
Дизайн сетей ЦОД
-13%
NoSQL Основы Windows Server MS SQL Server Developer Инфраструктурная платформа на основе Kubernetes Cloud Solution Architecture Highload Architect Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Взаимоотношения чистых и детерминированных функций

WebDev_Deep_29.06_site.png

Для начала, вспомним каждое из определений. Чистая функция – это функция, которая не имеет побочных эффектов и для фиксированного набора аргументов возвращает один и тот же результат. Давайте посмотрим на пару примеров.

Чистые функции

Вот функция _sum:

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

Результат её работы не зависит ни от чего, кроме аргументов, и не делает ничего с окружающей средой.

А вот _weighed_sum:

def _weighed_sum(a, b):
    return a * WEIGHT + b

Эта функция «грязная»: результат её работы кроме «a и b» зависит ещё от глобальной переменной WEIGHT. Получается, если мы зафиксируем значения аргументов функции, мы не сможем гарантировать, что результат всегда будет один и тот же.

Теперь посмотрим на _save_sum_to_database:

def _save_sum_to_database(a, b, cursor):
    result = a + b
    cursor.execute(INSERT INTO sum_results (result) VALUES (%s), result)

Эта функция тоже «грязная»: она использует базу данных и результат её работы зависит от БД. Функция будет вести себя по-разному, если БД доступна и недоступна.

С чистыми функциями разобрались! Они используют только свои аргументы, не ходят во «внешний мир» и гарантируют один и тот же результат при тех же аргументах.

Теперь вспомним, что такое детерминированные функции

С ними всё проще: детерминированные функции возвращают один и тот же результат для одних и тех же аргументов. В общем случае детерминированный алгоритм – это алгоритм, поведение которого можно полностью предсказать по входным данным.

Простой пример недетерминированной функции – randint. Входные аргументы мы знаем, а результат – нет.

Если внимательно посмотреть на определения чистых и детерминированных функций, то станет понятно, что чистые функции – подмножество детерминированных.

Это важный вывод: зная это, становится проще понимать свойства разных кусков кода и делать их чище.

Есть вопрос? Напишите в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться