Python:列表理解和功能编程

hqt*_*hqt 6 python functional-programming list-comprehension

在我的Python学习书中,当我阅读时List Comprehension,作者有一个小说明解释:

Python的列表理解是语言对函数式编程概念的支持的一个例子.

我已经去维基百科阅读有关函数式编程的内容.但我很难想象,因为我List Comprehension在维基页面上没有看到任何关联和这个概念.

请给我一个明确的解释(如果能,请给我一些关于Java或C#函数式编程的例子:D)

Arn*_*tta 6

如果你的问题是"给我一些展示FP如何在python中运行的例子",那么:

什么是纯函数式编程(在Python中)?

它是一种编程范例,它避免了状态和可变数据,而是依赖于函数返回值.这意味着用python编写的纯函数程序不会有变量,状态等.

不是那么纯粹的FP

您可以将FP和命令式范例结合起来,并获得良好的结果(请参见此处).链接的要点是我几个月前为python类制作的数学测验程序.随意使用代码随意做任何事情.

Java/C#中的FP

我个人没有C#的经验,所以其他人需要发布一个C#示例,但你可以在Java中使用FP,但不能使用纯FP.示例:

int fib (int x) { 
    if (x < 2) return x;
    return fib (x-1) + fib(x-2);
}
Run Code Online (Sandbox Code Playgroud)

上面的方法完全是FP,但在使用Java时不能在纯FP上下文中使用.这需要放在CJava 中的类中,并且只能在实例化该类型的对象才能调用.最后一部分取消了Java类的CFP,但该方法仍然是.

编辑:实际上,您可以在Java中使用静态方法,无需任何实例化即可使用.因此,如果您将签名更改为static int fib (int x),则如果以FP方式调用,则方法及其方法调用可能仍为FP.


回复:你的评论

递归可能是FP,但它不一定是(见下文):

def f(first, rest):
    print first
    first = rest[0]; rest = rest[1:]
    f(first, rest)
Run Code Online (Sandbox Code Playgroud)

你也可以没有递归的FP:

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

 def square(c):
     return c*c

 def square_of_sum (x,y):
     return square(sum(x,y))
Run Code Online (Sandbox Code Playgroud)


Har*_*hof 5

Python 的map()、reduce() 和 filter()接受一个序列,将您选择的另一个函数应用于它,然后向您返回一个不同的序列,保持原始序列不变。

您可以说这是功能性的,因为它不会触及原始序列,不会在内部触及其状态,也不会产生副作用。(尽管您自己提供给它的功能可以执行上述某些操作,例如产生副作用)

函数式编程是一种不同的编程和构建应用程序的方式,以减少由副作用(直接更改另一个静态位置或进程中的某些值)引起的错误,并减少或消除同步访问共享数据的需要。有些语言强迫你这样做,比如erlang和其他语言让你更多地选择当时最适合你的路径(程序或函数),优先选择编程范围的函数方面,比如scala

  • 副作用基本上是任何影响“外部世界”(在您的功能范围之外的含义),即使是简单的文本打印也是一种副作用。 (4认同)