Dav*_*one 319 python functional-programming
我一直认为函数式编程可以用Python完成.因此,我很惊讶Python在这个问题上没有得到很多提及,当提到它时,它通常不是很积极.然而,没有给出很多理由(没有提到模式匹配和代数数据类型).所以我的问题是:为什么Python不适合函数式编程?是否有更多的原因,而不是缺乏模式匹配和代数数据类型?或者这些概念对函数式编程如此重要,以至于不支持它们的语言只能被归类为二级函数式编程语言?(请记住,我在函数式编程方面的经验非常有限.)
Nat*_*ers 387
您引用的问题询问哪些语言促进OO和函数式编程.Python不会促进函数式编程,即使它运行得相当好.
反对 Python 中函数式编程的最佳理由是Guido仔细考虑了命令式/ OO用例,而函数式编程用例则不然.当我编写命令式Python时,它是我所知道的最漂亮的语言之一.当我编写功能性Python时,它变得像你没有BDFL的普通语言那样丑陋和不愉快.
这并不是说它很糟糕,只是你必须比你改用一种促进函数式编程或转而编写OO Python的语言更加努力.
以下是我在Python中遗漏的功能性内容:
list如果想要持久性,则将调用分散到周围.(迭代器使用一次)Jas*_*ker 101
圭多有一个很好的解释在这里.这是最相关的部分:
无论人们怎么说或想到,我都从未认为Python会受到功能语言的严重影响.我更熟悉C和Algol 68等命令式语言,尽管我已经将函数设置为第一类对象,但我并未将Python视为函数式编程语言.但是,早些时候,显然用户希望使用列表和函数做更多事情.
...
值得注意的是,即使我没有将Python视为一种函数式语言,闭包的引入在许多其他高级编程特性的开发中也很有用.例如,新式类,装饰器和其他现代功能的某些方面依赖于此功能.
最后,尽管多年来已经引入了许多函数式编程特性,但Python仍然缺乏"真实"函数式编程语言中的某些特性.例如,Python不执行某些类型的优化(例如,尾递归).一般来说,由于Python具有极强的动态性,因此不可能从Haskell或ML等函数式语言中进行编译时优化.那没关系.
我从中得出两件事:
Jac*_*b B 52
Scheme没有代数数据类型或模式匹配,但它肯定是一种函数式语言.从函数式编程的角度来看,有关Python的烦人事:
残废的Lambdas.由于Lambdas只能包含表达式,并且您无法在表达式上下文中轻松完成所有操作,这意味着您可以"动态"定义的函数是有限的.
如果是陈述,而不是表达.这意味着,除其他外,你不能在里面有一个带有if的lambda.(这在Python 2.5中由三元组修复,但看起来很难看.)
另一方面,python具有词法闭包,Lambdas和列表推导(无论Guido是否承认它,它都是一个"功能性"概念).我在Python中做了很多"函数式"编程,但我很难说它是理想的.
Kon*_*lph 22
我永远不会称Python为"功能",但每当我使用Python编程时,代码总是最终几乎完全是功能性的.
不可否认,这主要是由于非常好的列表理解.所以我不一定会建议Python作为函数式编程语言,但我建议使用Python的任何人进行函数式编程.
yai*_*chu 17
让我演示一段代码,该代码取自对SO 的"功能" Python问题的回答
蟒蛇:
def grandKids(generation, kidsFunc, val):
layer = [val]
for i in xrange(generation):
layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
return layer
Run Code Online (Sandbox Code Playgroud)
哈斯克尔:
grandKids generation kidsFunc val =
iterate (concatMap kidsFunc) [val] !! generation
Run Code Online (Sandbox Code Playgroud)
这里的主要区别是,Haskell的标准库中有函数式编程有用的功能:在这种情况下iterate,concat和(!!)
小智 14
对于这个问题(以及答案)而言,一件非常重要的事情是:函数式编程到底是什么,以及它最重要的属性是什么.我会尝试给出我的看法:
函数式编程就像在白板上编写数学一样.当您在白板上编写方程式时,您不会考虑执行顺序.(通常)没有突变.你不会在第二天回来看看它,当你再次进行计算时,你会得到不同的结果(或者,如果你有一些新鲜的咖啡,你也许可以:)).基本上,董事会上的内容是存在的,当你开始写下来时,答案已经存在,你还没有意识到它是什么.
函数式编程非常类似; 你不改变事物,你只需要评估等式(或者在这种情况下,"程序")并找出答案是什么.该计划仍在那里,未经修改.与数据相同.
我将以下列为函数式编程最重要的特性:a)引用透明性 - 如果您在其他时间和地点评估相同的语句,但具有相同的变量值,它仍然意味着相同.b)没有副作用 - 无论你盯着白板多久,另一个人看着另一块白板的等式都不会意外改变.c)功能也是值.它可以传递给其他变量并应用于其他变量.d)函数组合,你可以做h = g·f,从而定义一个新函数h(..),相当于调用g(f(..)).
此列表按我的优先顺序排列,因此参考透明度是最重要的,后面没有副作用.
现在,如果你通过python并检查语言和库如何支持和保证这些方面 - 那么你就可以回答你自己的问题了.
S.L*_*ott 10
Python几乎是一种功能语言.它是"功能性精简版".
它有额外的功能,所以它对某些人来说不够纯粹.
它也缺少一些功能,所以对某些人来说还不够完整.
缺少的功能相对容易编写.看看像帖子这对FP Python编写的.
上面没有提到的另一个原因是许多内置函数和内置类型的方法修改了一个对象但是没有返回修改后的对象.功能代码更清晰,更简洁.例如,如果some_list.append(some_object)返回了some_list并附加了some_object.
小智 5
除了其他答案之外,Python 和大多数其他多范式语言不太适合真正的函数式编程的原因之一是它们的编译器/虚拟机/运行时不支持函数优化。这种优化是通过编译器理解数学规则来实现的。例如,许多编程语言支持一个map函数或方法。这是一个相当标准的函数,它将一个函数作为一个参数,一个可迭代对象作为第二个参数,然后将该函数应用于可迭代对象中的每个元素。
无论如何,事实证明这map( foo() , x ) * map( foo(), y )与map( foo(), x * y ). 后一种情况实际上比前一种情况快,因为前者执行两个副本,而后者执行一个。
更好的函数式语言识别这些基于数学的关系并自动执行优化。不专用于功能范式的语言可能不会优化。
| 归档时间: |
|
| 查看次数: |
122595 次 |
| 最近记录: |