主要思想
把运算过程写成函数嵌套调用的表达式
例如数学表达式(1 + 2) * 3 - 4
面向过程
a = 1 + 2;
b = a * 3;
c = b - 4;
函数式
result = subtract(multiply(add(1,2), 3), 4)
add(1,2).multiply(3).subtract(4)
merge([1,2],[3,4]).sort().search("2")
- 简洁,开发快
- 更接近自然语言,更易理解
- 没有中间变量
- 易于并发进程,多核处理,不修改变量,不会死锁
高阶函数
变量指向函数
>>> abs
<built-in function abs>
>>> f = abs
>>> f
<built-in function abs>
>>> f(-10)
10
传入函数–高阶函数
使用函数 做参数
def han(a,b,f):
print(f(a) + f(b))
han(-10,9,abs) # f = abs
函数互换
>>> max,min = min,max
>>> max
<built-in function min>
>>> print(max(1,2,3,4))
1
map/reduce
map
使用:一个函数
,计算,一个 Iterable
==》生成 Iterator
def f(x):
return x*x
r = map(f,range(11))
print(list(r))
map
是惰性序列,通过list
计算全部
reduce
使用:一个函数
(必须有两个参数),计算,一个 Iterable
==》生成 Iterator
reduce(fn,[x1,x2,x3,x4])
== fn( fn( fn(x1,x2), x3 ), x4 )
# 使[3,2,1] ==> 321
from functools import reduce
def fn(x,y):
return x*10 + y
print(reduce(fn,[3,2,1]))
321
数字字符串转化为数字整数 int()强制转化
from functools import reduce
Digits = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
def str2int(s):
def fn(x,y): # 数字列表转化为数字
return x*10 + y
def char2num(s): # 数字字符串转化为数字列表--字典对应查找
return Digits[s]
return reduce(fn,map(char2num,s)) # map reduece 结合使用
print(str2int('342342'))
filter
过滤函数:一个判断函数 + 一个Iterable ==> Iterator
filter()是一个惰性序列,需要list()将其计算完
def ishui(s):
return str(s) == str(s)[::-1]
print(list(filter(isodd,range(1,200))))
sorted
排序得到临时结果,不改变原序列,先根据函数映射得到新的Iterable,再排序
但是排序结果还是原序列,不会改变,默认从低到高
语法:sorted(Iterable, key = 函数, reverse = True)
>>> sorted(l,key = abs) # 对绝对值后排序,但是序列还是原序列
[1, 3, -8, 10, -10]
>>> sorted(['bob','about','Zoo','Credit'],key = str.lower,reverse = True)
['Zoo', 'Credit', 'bob', 'about']
# 对成绩从高到低排列
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_score(t):
return -t[1] # 注意这里加了一个 负号-
L2 = sorted(L, key=by_score)
匿名函数
将简单的显式函数用lambda 参数:返回表达式
一句话隐式表示
def f(x):
return x * x
等价于 lambda x: x * x
偏函数
对于某函数的默认变量int('10001', base=10)
默认识别数字10001
为10进制
,转化为10进制
需要手动int('10001', base=2)
则默认识别数字10001
为2进制
,转化为10进制
可以直接使用偏函数创建一个新的函数
import functools
int2 = functools.partial(int, base=2)
>>> int2('1000000')
64