I have always thought that functional programming can be done in Python. Thus, I was surprised that Python didn't get much of a mention in this question, and when it was mentioned, it normally wasn't very positive. However, not many reasons were given for this (lack of pattern matching and algebraic data types were mentioned). So my question is: why isn't Python very good for functional programming? Are there more reasons than its lack of pattern matching and algebraic data types? Or are these concepts so important to functional programming that a language that doesn't support them can only be classed as a second rate functional programming language? (Keep in mind that my experience with functional programming is quite limited.)
当前回答
让我用一段代码来演示,这段代码摘自一个关于SO的“函数式”Python问题的答案
Python:
def grandKids(generation, kidsFunc, val):
layer = [val]
for i in xrange(generation):
layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
return layer
Haskell:
grandKids generation kidsFunc val =
iterate (concatMap kidsFunc) [val] !! generation
这里的主要区别是Haskell的标准库具有用于函数式编程的有用函数:在本例中是iterate、concat和(!!)
其他回答
In addition to other answers, one reason Python and most other multi-paradigm languages are not well suited for true functional programming is because their compilers / virtual machines / run-times do not support functional optimization. This sort of optimization is achieved by the compiler understanding mathematical rules. For example, many programming languages support a map function or method. This is a fairly standard function that takes a function as one argument and a iterable as the second argument then applies that function to each element in the iterable.
不管怎样,map(foo(), x) * map(foo(), y)和map(foo(), x * y)是一样的。后者实际上比前者快,因为前者执行两个副本,而后者执行一个副本。
更好的函数式语言能够识别这些基于数学的关系,并自动执行优化。不致力于函数式范式的语言可能无法优化。
您引用的问题是哪些语言同时促进面向对象和函数式编程。Python并不提倡函数式编程,尽管它工作得相当好。
反对Python中函数式编程的最佳论据是Guido仔细考虑了命令式/OO用例,而函数式编程用例则没有。当我编写命令式Python时,它是我所知道的最漂亮的语言之一。当我编写函数式Python时,它变得像没有BDFL的普通语言一样丑陋和令人不快。
这并不是说它不好,只是说您必须比转换到促进函数式编程的语言或转换到编写OO Python时更加努力。
以下是我在Python中遗漏的函数性内容:
模式匹配 尾递归 大型列表函数库 函数式字典类 自动加脂法 简洁的组合函数的方法 懒惰的列表 简单、强大的表达式语法(Python的简单块语法阻止Guido添加它)
No pattern matching and no tail recursion mean your basic algorithms have to be written imperatively. Recursion is ugly and slow in Python. A small list library and no functional dictionaries mean that you have to write a lot of stuff yourself. No syntax for currying or composition means that point-free style is about as full of punctuation as explicitly passing arguments. Iterators instead of lazy lists means that you have to know whether you want efficiency or persistence, and to scatter calls to list around if you want persistence. (Iterators are use-once) Python's simple imperative syntax, along with its simple LL1 parser, mean that a better syntax for if-expressions and lambda-expressions is basically impossible. Guido likes it this way, and I think he's right.
让我用一段代码来演示,这段代码摘自一个关于SO的“函数式”Python问题的答案
Python:
def grandKids(generation, kidsFunc, val):
layer = [val]
for i in xrange(generation):
layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
return layer
Haskell:
grandKids generation kidsFunc val =
iterate (concatMap kidsFunc) [val] !! generation
这里的主要区别是Haskell的标准库具有用于函数式编程的有用函数:在本例中是iterate、concat和(!!)
Python几乎是一种函数式语言。它是“功能精简版”。
它有额外的特性,所以对某些人来说不够纯。
它还缺乏一些功能,因此对某些人来说还不够完整。
缺少的特性相对容易编写。查看类似这样的关于Python中的FP的帖子。
上面没有提到的另一个原因是,许多内置类型的内置函数和方法修改了对象,但不返回修改后的对象。如果返回这些修改后的对象,将使函数代码更干净、更简洁。例如,如果some_list.append(some_object)返回附加some_object的some_list。
推荐文章
- 插入一行到熊猫数据框架
- 要列出Pandas DataFrame列
- 在Django模型中存储电话号码的最佳方法是什么?
- 从导入的模块中模拟函数
- 滚动或滑动窗口迭代器?
- python的方法找到最大值和它的索引在一个列表?
- 如何读取文件的前N行?
- 如何删除matplotlib中的顶部和右侧轴?
- 解析.py文件,读取AST,修改它,然后写回修改后的源代码
- Visual Studio Code:如何调试Python脚本的参数
- 使用元组/列表等等。从输入vs直接引用类型如list/tuple/etc
- 结合conda环境。Yml和PIP requirements.txt
- 将命名元组转换为字典
- 如何使x轴和y轴的刻度相等呢?
- Numpy在这里函数多个条件