python中使用函数编程的意义_Python函数式编程学习笔记

Python函数式编程学习笔记

Python函数式编程基础

理解函数名也是一个变量

理解Python中的变量都具有指向意义

函数式编程就是一个高阶函数的输入参数是几个参数和几个函数名称,而输出也可能是一个函数名称的编程模式。

>>> def add(x, y, f):

return f(x) + f(y)

>>> f = abs

>>> add(-5, 6, abs)

11

map函数:

输入:函数名,list

输出:list

功能:将输入list中的每一个元素传入函数中,将所有结果放入list中输出

>>> def f(x):

... return x * x

...

>>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

[1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])

['1', '2', '3', '4', '5', '6', '7', '8', '9']

reduce函数:

输入:双输入函数名,list

输出:一个值

功能:按顺序两个两个将list中的元素输入到函数中得到一个值,最终将list合并为一个值

关于reduce的直观解释如下

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

如果按位处理一个整数的话

>>> def fn(x, y):

... return x * 10 + y

...

>>> reduce(fn, [1, 3, 5, 7, 9])

13579

字符串转整型数就是这样

>>> def fn(x, y):

... return x * 10 + y

...

>>> def char2num(s):

... return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

...

>>> reduce(fn, map(char2num, '13579'))

13579

还可以包装起来

def str2int(s):

def fn(x, y):

return x * 10 + y

def char2num(s):

return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

return reduce(fn, map(char2num, s))

不是特别复杂的函数可以用lambda代替

def char2num(s):

return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]

def str2int(s):

return reduce(lambda x,y: x*10+y, map(char2num, s))

filter函数

输入:bool函数,list

输出:list

功能:根据传入的bool函数过滤list中的元素,true的留下,false的去掉

def is_odd(n):

return n % 2 == 1

filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])

sorted函数

输入:list,函数名

输出:list

功能:根据函数名定义的顺序,对list进行排序

Python内部的顺序定义

x < y 返回 -1

x = y 返回 0

x > y 返回 1

def cmp_ignore_case(s1, s2):

u1 = s1.upper()

u2 = s2.upper()

if u1 < u2:

return -1

if u1 > u2:

return 1

return 0

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)

['about', 'bob', 'Credit', 'Zoo']

装饰器

用一个代码例子来解释可能更容易

>>> def now():

... print '2013-12-25'

...

>>> f = now

>>> f()

2013-12-25

def log(func):

def wrapper(*args, **kw):

print 'call %s():' % func.__name__

return func(*args, **kw)

return wrapper

@log

def now():

print '2013-12-25'

>>> now()

call now():

2013-12-25

@log放在now函数定义前面相当于执行了

now = log(now)

偏函数

引入模块:functools

形式: int2 = functools.partial(int, base=2)

功能:定义一个新函数,新函数可以修改原函数的部分默认值

关于functools.partial

输入:func,*args,**kws

默认值其实是作为kws 输入的:即{base:2}

如果传入args 会将其作为func 函数的默认左输入

总结

对list进行合并用reduce

对list进行映射用map

对list进行过滤用filter

对list进行排序用sorted

简单函数的定义用lambda

修改已有函数用装饰器

修改已有函数的默认值用偏函数

后记

关于函数式编程,说到底,是为了让代码变的简洁强大,使用Python语言,其实没有必要在函数式编程上走的很远,只要用好了本文中的这些函数和技术,就可以让Python变得异常强大和精致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值