python学习笔记之函数式编程

主要思想

把运算过程写成函数嵌套调用的表达式

例如数学表达式(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)默认识别数字1000110进制,转化为10进制

需要手动int('10001', base=2)则默认识别数字100012进制,转化为10进制

可以直接使用偏函数创建一个新的函数

import functools
int2 = functools.partial(int, base=2)

>>> int2('1000000')
64
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值