这大概算是Python最难啃的一块骨头吧。在我 Python生涯的这一年里,我遇到了一些Pythoner,他们毫无例外地彻底不会使用函数式编程(有些人喜欢称为Pythonic),好比,历来不会 传递函数,不知道lambda是什么意思,知道列表展开但历来不知道用在哪里,对Python不提供经典for循环感到无所适从,言谈之中表现出对函数式 风格的一种抗拒甚至厌恶。 html
我尝试剖析这个问题,最终总结了这么两个缘由:一、不想改变,认为现有的知识能够完成任务;二、对小众语言的歧视,Python目前在国内市场份额仍然很小很小,熟悉Python风格用处不大。 算法
然而我认为,学习使用一种大相径庭的风格能够颠覆整个编程的思想。我会慢慢总结一个系列共4篇文字,篇幅都不大,轻松就能看完,但愿对喜欢Python的人们有所帮助,由于我我的确实从中受益不浅。 编程
仍是那句老话,尊重做者的劳动,转载请注明原做者和原地址:)数据结构
函数式编程使用一系列的函数解决问题。函数仅接受输入并产生输出,不包含任何能影响产生输出的内部状态。任何状况下,使用相同的参数调用函数始终能产生一样的结果。 闭包
在 一个函数式的程序中,输入的数据“流过”一系列的函数,每个函数根据它的输入产生输出。函数式风格避免编写有“边界效应”(side effects)的函数:修改内部状态,或者是其余没法反应在输出上的变化。彻底没有边界效应的函数被称为“纯函数式的”(purely functional)。避免边界效应意味着不使用在程序运行时可变的数据结构,输出只依赖于输入。 app
能够认为函数式编程恰好站在了面 向对象编程的对立面。对象一般包含内部状态(字段),和许多能修改这些状态的函数,程序则由不断修改状态构成;函数式编程则极力避免状态改动,并经过在函 数间传递数据流进行工做。但这并非说没法同时使用函数式编程和面向对象编程,事实上,复杂的系统通常会采用面向对象技术建模,但混合使用函数式风格还能 让你额外享受函数式风格的优势。 编程语言
函数式的风格一般被认为有以下优势: ide
支持函数式编程的语言一般具备以下特征,大量使用这些特征的代码便可被认为是函数式的: 模块化
1
2
3
4
5
6
7
8
9
|
#伪代码
interface Comparator {
compare(o1, o2)
}
lst
=
list
(
range
(
5
))
lst.sort(Comparator() {
compare(o1, o2) {
return
o2
-
o1
/
/
逆序
})
|
1
2
3
4
|
def
compare(o1, o2):
return
o2
-
o1
#逆序
lst
=
list
(
range
(
5
))
lst.sort(compare)
|
1
|
lst.sort(
lambda
o1, o2: o1.compareTo(o2))
|
1
2
3
4
|
lst2
=
list
()
for
i
in
range
(
len
(lst)):
#模拟经典for循环
if
lst[i] >
0
:
lst2.append(lst[i])
|
1
|
lst2
=
filter
(
lambda
n: n >
0
, lst)
|
1
2
3
4
5
6
7
8
9
|
class
greater_than_helper:
def
__init__(
self
, minval):
self
.minval
=
minval
def
is_greater_than(
self
, val):
return
val >
self
.minval
def
my_filter(lst, minval):
helper
=
greater_than_helper(minval)
return
filter
(helper.is_greater_than, lst)
|
1
2
|
def
my_filter(lst, minval):
return
filter
(
lambda
n: n > minval, lst)
|