Комментарии 25
Эту статью я старался написать максимально просто
Не использовать запятые — это все-таки уже лишнее упрощение.
Популяризация ФП – это, конечно, хорошо, но в таком виде я бы слона не купил...
Цель ФП заключается в том чтобы писать код более простой, понятный и который легче поддерживать а также который занимает меньше памяти ну и куда же без этого — разумеется главная новая мораль программирования DRY (Don’t Repeat Yourself — Не повторяйся).
А цель ООП – писать сложный, непонятный и неподдерживаемый код? А этой "главной новой морали" уже больше 20 лет (The Pragmatic Programmer: From Journeyman to Master, 1999 г.) При том, что самому ФП еще больше.
Замена def
на lambda
– это не ФП. И даже "такие функции как Map, Zip, Filter и Reduce" не сделают императивный код функциональным.
Складывается такое впечатление из пункта "Итак, начнем":
Лично я знаю две самые часто упоминаемые парадигмы в повседневном программировании — это ООП и ФП.
ООП – это…
ФП – это…
В большинстве своем ФП (как я его воспринимаю) это просто упрощенное написание кода. Любой код написанный в функциональном стиле может быть довольно легко переписан в обычном без потери качества но более примитивно. Цель ФП заключается в том...
Что для вас "обычный" стиль?
Но, собственно, это не основной посыл моего комментария. Код, который вы показали – это обычная императивная лапша, только с lambda
вместо def
. К ФП это имеет весьма отдаленное отношение.
Плюс к этому, ФП код не всегда "более простой" (может быть и наоборот, императивный аналог оказывается более простым для понимания) и не всегда "занимает меньше памяти".
Вроде бы неплохо но это все может выглядеть куда круче если записывать это через lambda
PEP8 не рекомендует присваивать имена лямбдам.
«Совсем начинающим» не стоит лазить в лямбды: это грузит их девственный мозг лишним сахаром, отвлекая от формирования нужных извилин — алгоритмического мышления, например. По своему опыту преподавания должен сказать, что лямбды (а также for-else и другие сладости) стоит давать не раньше, чем ученики съедят хотя бы щенка на обычных def-ах.
Explicit is better than implicit.
Simple is better than complex.
Не злоупотребляйте лямбдами, если нужен поддерживаемый код. Анонимные функции в некоторых случаях можно применять как колбеки. В подавляющем большинстве случаев стоит передавать именованую функцию/класс в качестве колбека.
# пример с django-моделями, псевдокод
@transaction.atomic
def create_view(request):
dataset = json.loads(request.content)
related_dataset = dataset.pop('related')
instance = MyModel(**dataset)
related_instances = map(RelatedModel, related_dataset)
instance.related_set.set(related_instances)
instance.save()
return 201
Для случаев с параметризироваными функциями покрываются методом partial из модуля functools:
import functools
import operator
mul_8 = map(functools.partial(operator.mul, 8), range(10))
Когда я был самым маленьким, я думал что ФП это про написание функций без сайд эффектов, когда каждое новое действие производит операции над имеющимися переменными и записывает результат в новую ячейку памяти, позволяя тем самым тестировать функции безотносительно контекста, от которого они могут зависеть или который они могут поменять в нефункциональном программировании. Но теперь благодаря автору я точно знаю, что ФП — это замена обычных функций на лямбда, бессмысленная и беспощадная, а описанное мной выше придется назвать иным словом. А жаль, так хочется остаться в детской сказке.
Чистая функция вообще не должна ничего никуда писать, ни в новую ячейку, ни в существующую. Чистая функция просто возвращает результат.
AlexBrown А теперь ещё раз перечитайте определение «чистой» функции — ответ станет очевидным. Нет, не имеет права. По определению.Читаю — любые действия работающей программы, изменяющие среду выполнения. Тогда почему перезапись считается побочным эффектом, лишающим функцию ее чистоты, а создание новой копии нет (ведь новая копия — это тоже изменение среды выполнения)?
Значит чистая функция просто должна возвращать результат (ookami_kb). А перезапись или создание новой копии — это всегда сайд-эффект. Тогда почему второе в ФП принимается, а первое нет?
Ну тут надо определиться с контекстом. С исходным заявлением "записывает результат в новую ячейку памяти" я не согласен – поэтому и написал, что чистая функция не должна ничего никуда писать. А просто создание новой копии – это не изменение среды (ну если оставаться на уровне языка программирования, не вмешивая физические процессы в компьютере – иначе, строгих математически чистых функций мы в принципе не получим).
Вообще, мне кажется, проще всего объяснить чистую функцию через 2 условия:
- Она всегда возвращает одно и то же значение, если вызывать с одними и теми же параметрами.
- Вызов функции можно заменить на ее результат без каких-либо последствий (ссылочная прозрачность).
проще всего объяснить чистую функцию через 2 условия:....Да, я тоже так думаю.
А просто создание новой копии – это не изменение средыРазве? Ведь эта копия где-то же хранится…
Ведь эта копия где-то же хранится
Ну да, поэтому я и сделал потом оговорку, что мы остаемся на уровне "языка", не вдаваясь в подробности, что хранение копия во временной переменной – это работа с оперативной памятью, а значит тоже операция ввода-вывода. Иначе всё ФП так и останется на уровне красивой математической абстракции...
Если вы готовы смириться с тем, что
- чтение/запись будет синхронным и блокирующим;
- любая ошибка чтения/записи будет крэшить программу;
- вы не перезаписываете файлы, а только создаете новые (по крайней мере, пока данные в "области видимости");
- вы явно получаете и возвращаете дескриптор файла, а не "внезапно" читаете этот файл (или пишете в него) внутри функции,
то, пожалуй, ничем.
Я только начинаю изучать программирование, занимаюсь буквально пару месяцев, то есть, как я понял, именно на меня рассчитана эта статья. И, скажу честно, она абсолютно не выполняет своей цели.
Она не дала мне абсолютно никакого понимания того, что такое ФП, хотя Вы вначале сказали, что и не ставите себе такую задачу, но пытаться объяснить как работает ФП без понимания, что это вообще такое — как минимум странно.
Само содержание также вызывает у меня вопросы — примеры использования лямбда функций ну очень простые. Мне кажется, любая статья, документация, видео в ютуб объясняют как минимум в той же мере, если не больше. По крайней мере я абсолютно ничего нового не узнал. И совершенно не понял, как это связано с функциональными программированием.
Я прошу прощения за такой негативный комментарий, но я надеюсь, что критика была достаточно объективной и поможет Вам писать лучше, потому что, мне кажется, статьи для начинающих должны быть очень высокого качества — новичка легко запутать, ввести в заблуждение или отбить все желание учиться.
Функциональное программирование на Python для самых маленьких — Часть 1 — Lambda Функция