Python学习笔记——函数式编程和高阶函数

如何理解函数式编程(functional programming)。

百科定义:

函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。

我理解起来,这句话的意思就是,将一个个函数视为最小的运算单元,不关心中间的过程,而重在最后的输出,对于同样的输入,必定有同样的输出,不依赖周围环境,不改变其它变量或者状态。

这里的函数指的是数学意义上的函数:

给定一个数集A,对A施加对应法则f,记作f(A),得到另一数集B,也就是B=f(A)。
那么这个关系式就叫函数关系式,简称函数。函数概念含有三个要素:定义域A、值域C和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。

与其相对应的概念是命令式编程(imperative programming)和声明式编程(declarative programming),主要区别可以参考这里

高阶函数(Higher-Order Function)

  1. 变量可以指向函数
>>> abs(-10)
10
>>> abs
<built-in function abs>
>>> f = abs
>>> f(-10)
10

函数名后加圆括号表示对函数的调用,不加圆括号则返回函数本身。可以将函数本身赋值给一个变量f,此时f就等同于abs函数本身,因此对f的调用与对abs的调用便有着相同的效果。

  1. 函数名也是变量
>>> abs(-10)
10
>>> abs = 'f'
>>> abs(-10)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object is not callable

abs虽然一开始是内置函数名,但仍可以给其赋新的值,此时新值则将对应的函数覆盖。可以理解为abs是一个变量名,初始时这个变量名指向绝对值函数,在人为对其赋予了新的值之后,abs便指向了新的值。

  1. 函数可以作为参数传入至新函数或作为返回值从新函数传出(即闭包,待更新)
>>> def sumABafterF(a,b,f):
...     return f(a) + f(b)
... 
>>> sumABafterF(3,4,abs)
7
>>> sumABafterF(3,4,lambda x: x ** 2)
25
>>> import math
>>> sumABafterF(25,36,math.sqrt)
11.0
>>> 

map()

作用:将一个list按照转换函数逐项操作,并生成一个新的list。接收2个参数,一个转换函数,一个list,返回结果不更改原有list,而是重新生成一个list。

由于list包含的元素可以是任何类型,因此,map() 不仅仅可以处理只包含数值的 list,事实上它可以处理包含任意类型的 list,只要传入的函数f可以处理这种数据类型。
例:将列表中的每一项进行平方。

>>> L = list(range(1,11))
>>> map(lambda x: x ** 2, L)
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

例:将人名规范化

>>> L = ['ADAM', 'pHILADEphia', 'BaSeBaLL']
>>> def capitalize(str):
...     return str[0].upper() + str[1:].lower()
... 
>>> map(capitalize, L)
['Adam', 'Philadephia', 'Baseball']
>>> 

reduce()

reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。

例:求列表各项平方和

>>> from functools import reduce
>>> L = [1,2,3,4]
>>> def f(a,b):
...     return a * b
... 
>>> reduce(f,L)
10

reduce()还可以接收第3个可选参数,作为计算的初始值。

>>> from functools import reduce
>>> L = [1,2,3,4]
>>> def f(a,b):
...     return a * b
... 
>>> reduce(f,L, 100)
110

filter()

filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
例:从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数

>>> L = [1, 4, 6, 7, 9, 12, 17]
>>> def odd(x):
...     return x % 2 == 1
... 
>>> filter(odd,L)
[1, 7, 9, 17]
>>> filter(lambda x: x % 2 == 1,L) #lambda匿名函数与上面的odd函数等价。
[1, 7, 9, 17]

例:删除空白字符串

>>> a.strip()
'1213'
>>> a = '\t\n\r123\n\t\r  '
>>> a.strip()
'123'
>>> #strip函数返回移除字符串头尾指定的字符序列生成的新字符串,默认移除空格
>>>def is_not_empty(s):
...		return s and len(s.strip()) > 0
...
>>> filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
['test', 'str', 'END']

猜你喜欢

转载自blog.csdn.net/leavemetomorrow/article/details/88643609