Я всегда думал, что функциональное программирование может быть сделано на Python. Таким образом, я был удивлен, что Python не получил большого упоминания в этом вопросе, и когда он был упомянут, он обычно не был очень положительным. Однако для этого не было приведено много причин (упоминалось отсутствие сопоставления с образцом и алгебраических типов данных). Итак, мой вопрос: почему Python не очень хорош для функционального программирования? Есть ли больше причин, чем отсутствие сопоставления с образцом и алгебраические типы данных? Или эти концепции настолько важны для функционального программирования, что язык, который их не поддерживает, можно классифицировать только как второсортный язык функционального программирования? (Имейте в виду, что мой опыт функционального программирования весьма ограничен.)
источник
Ответы:
Вопрос, на который вы ссылаетесь, спрашивает, какие языки способствуют как ОО, так и функциональному программированию. Python не продвигает функциональное программирование, даже если он работает довольно хорошо.
Лучший аргумент против функционального программирования в Python - это то, что варианты использования императивного / OO тщательно рассматриваются Guido, а варианты использования функционального программирования - нет. Когда я пишу императивный Python, это один из самых красивых языков, которые я знаю. Когда я пишу функциональный Python, он становится таким же уродливым и неприятным, как ваш обычный язык без BDFL .
Это не значит, что это плохо, просто вы должны работать усерднее, чем если бы вы переключились на язык, который продвигает функциональное программирование или переключился на написание OO Python.
Вот функциональные вещи, которые я пропускаю в Python:
list
вокруг, если вы хотите постоянство. (Итераторы используются один раз)источник
У Гвидо есть хорошее объяснение этого здесь . Вот самая важная часть:
Я вытащил две вещи из этого:
источник
Схема не имеет алгебраических типов данных или сопоставления с образцом, но это, безусловно, функциональный язык. Раздражающие вещи о Python с точки зрения функционального программирования:
Искаженные лямбды. Поскольку лямбда-выражения могут содержать только выражение, и вы не можете делать все так просто в контексте выражения, это означает, что функции, которые вы можете определить «на лету», ограничены.
Если это заявления, а не выражения. Это означает, что, помимо прочего, у вас не может быть лямбды с If внутри. (Это исправлено троичными в Python 2.5, но выглядит некрасиво.)
Гвидо угрожает убрать карту, отфильтровать и уменьшить время от времени
С другой стороны, в Python есть лексические замыкания, лямбды и списки (которые действительно являются «функциональной» концепцией, признает ли это Гвидо). Я много программирую в «функциональном стиле» на Python, но вряд ли скажу, что он идеален.
источник
Я бы никогда не назвал Python «функциональным», но всякий раз, когда я программирую на Python, код всегда оказывается почти чисто функциональным.
По общему признанию, это главным образом из-за чрезвычайно хорошего понимания списка. Поэтому я не обязательно предлагал бы Python как функциональный язык программирования, но я бы предложил функциональное программирование для всех, кто использует Python.
источник
Позвольте мне продемонстрировать фрагмент кода, взятый из ответа на «функциональный» вопрос Python о SO
Python:
Haskell:
Основное отличие в том , что стандартная библиотека Haskell имеет полезные функции для функционального программирования: в этом случае
iterate
,concat
и(!!)
источник
grandKids()
тела с выражениями генератора:return reduce(lambda a, v: concat((x for x in kidsFunc(v)) for v in a), xrange(generation), [val])
.concat
:return reduce(lambda a, v: (x for v in a for x in kidsFunc(v)), xrange(generation), [val])
itertools.chain.from_iterable
Одна вещь, которая действительно важна для этого вопроса (и ответов), заключается в следующем: что, черт возьми, представляет собой функциональное программирование и каковы его самые важные свойства. Я постараюсь дать свой взгляд на это:
Функциональное программирование очень похоже на написание математики на доске. Когда вы пишете уравнения на доске, вы не думаете о порядке выполнения. Там (как правило) нет мутации. Вы не возвращаетесь на следующий день и не смотрите на это, и когда вы делаете расчеты снова, вы получаете другой результат (или вы можете, если у вас было немного свежего кофе :)). По сути, то, что есть на доске, уже есть, и ответ был уже там, когда вы начали записывать вещи, вы просто еще не поняли, что это такое.
Функциональное программирование во многом похоже на это; вы ничего не меняете, вы просто оцениваете уравнение (или, в данном случае, «программа») и выясняете, каков ответ. Программа все еще там, без изменений. То же самое с данными.
Я бы оценил следующее как наиболее важные особенности функционального программирования: а) ссылочная прозрачность - если вы оцениваете одно и то же утверждение в другое время и в другом месте, но с теми же значениями переменных, оно все равно будет означать то же самое. б) без побочных эффектов - независимо от того, как долго вы смотрите на доску, уравнение, на которое другой парень смотрит на другую доску, не изменится случайно. в) функции тоже значения. которые могут быть переданы и применены, или к другим переменным. г) состав функции, вы можете сделать h = g · f и, таким образом, определить новую функцию h (..), которая эквивалентна вызову g (f (..)).
Этот список находится в моем порядке приоритетов, поэтому прозрачность ссылок является наиболее важной, после чего никаких побочных эффектов нет.
Теперь, если вы пройдете через python и проверите, насколько хорошо язык и библиотеки поддерживают и гарантируют эти аспекты - тогда вы уже на пути к ответу на свой вопрос.
источник
Python - это почти функциональный язык. Это «функциональный лайт».
У него есть дополнительные функции, поэтому для некоторых он недостаточно чист.
В ней также отсутствуют некоторые функции, поэтому для некоторых она не является полной.
Недостающие функции относительно легко написать. Проверьте сообщения , как это на FP в Python.
источник
Другая причина, не упомянутая выше, заключается в том, что многие встроенные функции и методы встроенных типов модифицируют объект, но не возвращают измененный объект. Если бы эти измененные объекты были возвращены, это сделало бы функциональный код чище и более кратким. Например, если some_list.append (some_object) вернул some_list с добавленным some_object.
источник
В дополнение к другим ответам, одна из причин, по которой Python и большинство других мультипарадигмальных языков не подходят для настоящего функционального программирования, заключается в том, что их компиляторы / виртуальные машины / среды выполнения не поддерживают функциональную оптимизацию. Такая оптимизация достигается компилятором, понимающим математические правила. Например, многие языки программирования поддерживают
map
функцию или метод. Это довольно стандартная функция, которая принимает функцию в качестве одного аргумента и итеративную в качестве второго аргумента, а затем применяет эту функцию к каждому элементу в итерируемой.В любом случае получается, что так
map( foo() , x ) * map( foo(), y )
же, какmap( foo(), x * y )
. Последний случай на самом деле быстрее, чем первый, потому что первый выполняет две копии, где последний выполняет одну.Лучшие функциональные языки распознают эти математически основанные отношения и автоматически выполняют оптимизацию. Языки, которые не посвящены функциональной парадигме, скорее всего, не будут оптимизированы.
источник
map( foo() , x ) * map( foo(), y ) == map( foo(), x * y )
не верно для всех функций. Например, рассмотрим случай, когдаfoo
вычисляется производная.+
вместо*
.