Python函数式编程——学习笔记
2016-04-21 22:02
387 查看
函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
1、 函数本身也向可以赋值给变量,变量就具有了函数的功能,即:变量可以指函数。
函数名也可以被赋值为一个数,如abs = 10
这时abs就不是求绝对值的函数了,要想恢复为函数,要用del abs
2、内置函数都是定义在__bulitin__模块中的,调用时实际是
3、函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数(函数的参数是一个函数名)
高阶函数的定义:
4、map/reduce函数
map(函数,Iterable):在可迭代数据组上对每一个元素执行函数操作,返回一个
reduce(函数,list):函数必须接收两个参数,所以sum不行,sum([2,5]) = 7,sum只接收一个参数,
5、函数可以嵌套,需要用的时候再定义函数,是允许的,里面的函数也可以放出来。如
6、filter(函数,Iterable):与map类型,函数也是作用在每一个元素上,函数只能返回布尔类型的值,为false时丢弃该元素,为true时保留。
7、翻转
8、排序函数sort()
自定义排序:
反向排序,不必改动key函数,可以传入第三个参数
9、高阶函数:map/reduce、filter、sorted
指函数的参数也是一个函数
10、
11、装饰器 decorator
:在不修改函数的情况下,增强函数的功能,以函数名作为参数,装饰器是一个嵌套了函数的函数,返回值是内部嵌套的那个函数。
函数对象有一个
把
12、偏函数
当函数的参数个数太多,需要简化时,使用
1、 函数本身也向可以赋值给变量,变量就具有了函数的功能,即:变量可以指函数。
>>> f = abs >>> f <built-in function abs> >>> f = abs >>> f(-10) 10
函数名也可以被赋值为一个数,如abs = 10
这时abs就不是求绝对值的函数了,要想恢复为函数,要用del abs
2、内置函数都是定义在__bulitin__模块中的,调用时实际是
__builtin__.abs(-10)
3、函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数(函数的参数是一个函数名)
高阶函数的定义:
def add(x, y, f): return f(x) + f(y)
4、map/reduce函数
map(函数,Iterable):在可迭代数据组上对每一个元素执行函数操作,返回一个
Iterator,通过
list()函数打印结果。Python内置函数,不需要import
reduce(函数,list):函数必须接收两个参数,所以sum不行,sum([2,5]) = 7,sum只接收一个参数,
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)。需要import,引入方式:
from functools import reduce
5、函数可以嵌套,需要用的时候再定义函数,是允许的,里面的函数也可以放出来。如
#str转float from functools import reduce def str2float(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] l = s.split('.') l1 = reduce(fn,map(char2num,l[0])) l2 = reduce(fn,map(char2num,l[1]))/(10.0**len(l[1])) return l1+l2 print(str2float('123.456'))
6、filter(函数,Iterable):与map类型,函数也是作用在每一个元素上,函数只能返回布尔类型的值,为false时丢弃该元素,为true时保留。
7、翻转
(1)iterable.[::-1] (2)''.join(deque().extendleft(iterable))
8、排序函数sort()
自定义排序:
反向排序,不必改动key函数,可以传入第三个参数
reverse=True
9、高阶函数:map/reduce、filter、sorted
指函数的参数也是一个函数
10、
11、装饰器 decorator
:在不修改函数的情况下,增强函数的功能,以函数名作为参数,装饰器是一个嵌套了函数的函数,返回值是内部嵌套的那个函数。
函数对象有一个
__name__属性,可以拿到函数的名字
now.__name__ @logdef now(): print('2015-3-25')
把
@log放到
now()函数的定义处,相当于执行了语句:
now = log(now)
12、偏函数
当函数的参数个数太多,需要简化时,使用
functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
>>> int('64', base=2) #用base可以规定转化的进制。 1000000 相当于: kw = { 'base': 2 } int('10010', **kw) # **kw关键字参数 >>> import functools >>> int2 = functools.partial(int, base=2) >>> int2('1000000') 64 >>> int2('1010101') 85
声明:学习廖雪峰的Python教程——函数式编程章节后的学习笔记,感谢Micheal Liao.
相关文章推荐
- Python多线程互斥锁
- Python高级特性——学习笔记
- cmd命令行交互执行python引入模块时提示ImportError: No module named xxx
- Python函数——学习笔记
- python语言的解释性执行问题(备份一下,以供以后学习参考)
- Python框架之Tornado(四)源码之褪去模板外衣
- 菜鸟入门_Python_机器学习(4)_PCA和MDA降维和聚类
- Python框架之Tornado(四)源码之褪去模板外衣的前戏
- Python框架之Tornado(四)源码之褪去模板外衣的前戏
- Python语言快速入门
- Python框架之Tornado(二)请求阶段
- 菜鸟入门_Python_机器学习(3)_回归
- 安装Python及后续
- Python框架之Tornado(一)
- Python框架之Tornado(一)
- Python之Web框架
- Python 装饰器(进阶篇)
- Python 装饰器(进阶篇)
- python的一些细节(1)
- differences in python 2 and python 3