函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。
一、高阶函数
高阶函数简单的理解就是,一个函数在调用的时候将另外一个函数作为参数传入,这个函数就是高阶函数。
函数式编程就是指这种高度抽象的编程范式。
# -*- coding:utf-8 -*-
def function_test(a,b,f):
print f(a)
print f(b)
return f(a) + f(b)
if __name__ == '__main__':
print "--------------------"
print function_test(-3,-4,abs)
注意:在函数作为形参的时候,只需要传入函数名就可以了。
# -*- coding:utf-8 -*-
def test(f):
print abs(f)
def function_test(a,b,s):
s(a)
if __name__ == '__main__':
print "--------------------"
function_test(-3,-4,test)
map()
函数接收两个参数,一个是函数,一个是序列,map
将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回
# -*- coding:utf-8 -*-
def test(x):
return x*x
if __name__ == '__main__':
L = map(test,[1,2,3,4,5,6])
for x in xrange(0,len(L)):
print L[x]
reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算.
# -*- coding:utf-8 -*-
def test(x,y):
return x+y
if __name__ == '__main__':
sum = reduce(test,[1,2,3,4])
print sum
高阶函数filter()
:
filter()
函数在使用的时候也需要传入两个参数,一个是函数,一个是序列,filter()
会将传入的函数作用于序列中的每一个元素,结果根据函数返回值是True
还是False
决定保留还是丢弃该元素。
# -*- coding:utf-8 -*-
def test(x):
return x % 2 != 0
if __name__ == '__main__':
L = filter(test,[1,2,3,4,5,6,7,8,9,10])
print L
def not_empty(s):
return s and s.strip()
print filter(not_empty, ['A', '', 'B', None, 'C', ' '])
高阶函数sorted():
这是一个排序函数是Python内置的函数,直接使用的时候按照默认的排序方式排序,由小到大。这个函数还可以接受一个自定义的排序函数,将自定义的排序函数作用于序列中的每一个元素。
# -*- coding=utf-8 -*-
L = [4,77,4,2,9,76,45]
print sorted(L)
print sorted(['df','DRFDU','jkTUU','TERWRfdjj'])
def cmp_ignore_case(s1, s2):
u1 = s1.upper()
u2 = s2.upper()
if u1 < u2:
return -1
if u1 > u2:
return 1
return 0
print sorted(['bob','about','Zoueh','ERYfdgk','ryeu'],cmp_ignore_case)