python学习笔记之(五)
来源:互联网 发布:mzd定位软件下载 编辑:程序博客网 时间:2024/06/05 03:40
高阶函数
高阶函数(Higher-order function)可接受函数作为参数,也可以把函数作为返回值。
map/reduce:
map(): 接受两个参数, 一个是函数, 一个是数列。map将传入的函数一次作用在数列的每个元素上,将结果作为新的list返回。
>>> def f(x):return x*x>>> map(f, [1, 2, 3, 4])[1, 4, 9, 16]
>>> def add(x, y):return x+y>>> reduce(add, [1, 2, 3, 4])10
使用map/reduce可写出将str转换成int的函数:
>>> def str2int(s):def fn(x,y):return x*10+yreturn reduce(fn, map(int, s))>>> str2int('4321')4321>>>
sort:
内置排序算法,默认按照从下到大排。
可以定义一个倒排方法,传进sored方法中:
>>> def reversed_cmp(x, y):if x > y:return -1if x == y:return 0if x < y:return 1>>> sorted([36, 5, 46, 4, 23],reversed_cmp)[46, 36, 23, 5, 4]
使用sort 对字符串排序,由于内置函数按照ASCII排序,使得小写z在大写A前面,改进:
>>> def cmp_ignore_case(s1, s2):u1 = s1.lower()u2 = s2.lower()if u1 < u2:return -1if u1 > u2:return 1return 0>>> sorted(['ABC', 'resA', 'gdEW', 'SGRR'], cmp_ignore_case)['ABC', 'gdEW', 'resA', 'SGRR']
简单介绍匿名函数:
匿名函数lambda,冒号前面是传入的参数,冒号后面是仅有的一个表达式,返回值就是该表达式的结果。
>>> map(lambda x: x*x, [1, 2, 3, 4, 5, 6])[1, 4, 9, 16, 25, 36]
函数作为返回值:
以一个可变参数求和为例子:
>>> def lazy_sum(*args):def sum():ax=0for n in args:ax = ax + nreturn axreturn sum>>> f = lazy_sum(1, 2, 3, 4, 5)>>> f<function sum at 0x0000000002D282E8>>>> f()15
在函数lazy_sum中定义了函数sum,当调用lazy_sum时,返回的并不是求和结果,而是求和函数,这称为“闭包”,想要得到结果时,需调用f()
装饰器 decorator
要增强某函数功能,但又不想修改函数定义,在代码运行期间动态增加函数功能的方式就是decorator。
本质上,decorator是一个返回函数的高阶函数。
>>> def log(func):def wrapper(*args, **kw):print 'call %s():' %func.__name__return func(*args, **kw)return wrapper>>> @logdef now():print '2014-3-10'>>> now()call now():2014-3-10
其中,log是一个decorator函数,使用@log放在函数定义前,相当于后面调用now()时执行语句now = log(now)。
调用now()后,首先执行log(now)返回wrapper函数,然后执行wrapper,打印函数名,并且调用原始now()函数。
如果decorator本身需要传参数,那么就需要再定义一个返回decorator的高阶函数:
>>> def log(text):def decorator(func):def wrapper(*args, **kw):print '%s %s():' % (text, func.__name__)return func(*args, **kw)return wrapperreturn decorator>>> @log('execute')def now():print '2014-3-10'>>> now()execute now():2014-3-10
@log('execute')相当于now = log('execute')(now)
调用过程是:首先执行log('execute'),返回decorator函数,执行参数是now的decorator函数,返回wrapper函数,执行wrapper函数,打印内容并调用原始now()函数。
但现在的函数名为:
>>> now.__name__'wrapper'
需要加入import functools 以及在定义 wrapper 前加入 @functools.wraps(func)
例如:
>>> import functools>>> def log(func):@functools.wraps(func)def wrapper(*args, **kw):print 'call %s():' %func.__name__return func(*args, **kw)return wrapper
偏函数
偏函数是functools模块提供的一个功能,主要作用于函数调用时的参数上面。
之前有说过,为了方便使用,函数可以存在一个或多个默认参数。在python自带的的函数的默认参数是已经制定好的,偏函数的使用就可以局部改变函数的默认值。
如 Int() 可以将字符串变为整形,但该函数有一个默认参数base =10 意思是默认字符串为10进制
>>> int('1234', base = 8)668
如果有大量的需转为整形的2进制数,这样调用比较麻烦,这时可以改为:
>>> def int2(x, base = 2):return int(x, base)>>> int2('10000')16
使用偏函数可以简化为:
>>> import functools>>> int2 = functools.partial(int, base = 2)>>> int2('10000')16
- python学习笔记之(五)
- Python学习笔记(五)
- python学习笔记(五)
- python 学习笔记 (五)
- python学习笔记(五)
- Python学习笔记(五)
- Python学习笔记(五)
- Python学习笔记(五)
- python学习笔记(五)
- Python学习笔记(五)
- Python学习笔记(五)
- python学习笔记(五)
- Python学习笔记(五)
- Python学习笔记(五)
- python学习笔记(五)之内置容器List
- python学习笔记之(五)传递实参
- [python]python学习笔记(五)
- python学习笔记五(python多线程)
- [Android问答] px、dp和sp,这些单位有什么区别?
- LeetCode 053 Maximum Subarray
- Java类型检查
- 图像特征检测
- java.net.SocketException: sendto failed: EPIPE (Broken pipe)
- python学习笔记之(五)
- html5移动开发物理游戏的方法心得
- 完全卸载oracle11g步骤
- 没法加载协定为“tt.WeatherWebServiceSoap”的终结点配置部分,因为找到了该协定的多个终结点配置。请按名称指示首选的终结点配置部分
- ListView下拉刷新上拉加载更多实现
- Oracle11.2.0.3 ORA-3136 连接超时错误解决
- 存储过程
- java:屏蔽htpps访问时的ssl验证
- hdu2117 Just a Numble