Python学习笔记——函数式编程
2015-12-22 16:04
696 查看
函数式
函数式:functional 一种编程范式函数式编程是一种抽象计算的编程模式
特点:
把计算视为函数而非指令
纯函数式编程:不需要变量,没有副作用,测试简单
支持高阶函数,代码简洁
python
不是纯函数式编程:允许有变量
支持高阶函数:函数可以作为变量传入
支持闭包:有来闭包就能返回函数
有限的支持匿名函数
闭包(Closure)是词法闭包(Lexical Closure)的简称,
内层函数引用了外层函数的变量(参数也算变量),然后返回内层函数
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变量)对于“外层”包含它的函数而言,是本地变量。
*返回函数不要引用任何循环变量,或者后续会发生变化的变量。
1. 希望一次返回3个函数,分别计算1x1,2x2,3x3:
def count(): fs = [] for i in range(1, 4): def f(j): def g(): return j*j return g r = f(i) fs.append(r) return fs f1, f2, f3 = count() print f1(), f2(), f3()
高阶函数
变量可以指向函数函数名其实就是窒息那该函数的变量
高阶函数:能接收函数作为参数
(Python为string对象提供了转换大小写的方法:upper() 和 lower().
还不止这些,Python还为我们提供了首字母大写,其余小写的capitalize()方法,
以及所有单词首字母大写,其余小写的title()方法.)
map(f,list)
它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。(对元祖进行来“解包”操作)
reduce(f,list)
python3使用要导入functools
函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
求和:
def f(x,y): return x+y reduce(f,[1,2,5,7,9])
3.filter(f,list)
收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
删除 None 或者空字符串:
def is_not_empty(s): return s and len(s.strip()) > 0 filter(is_not_empty, ['test', None, '', 'str', ' ', 'END']) #或匿名函数 print filter(lambda s: s and len(s.strip())>0, ['test', None, '', 'str', ' ', 'END'])
4.sorted(list,f)
传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。
忽略大小写:
def cmp_ignore_case(s1, s2): return cmp(s1.lower(), s2.lower()) print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
匿名函数
不显示地定义函数,直接传入匿名函数更为方便关键字lambda
匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果
装饰器 decorator
在函数运行时动态的增加功能,但不改动函数本身代码。可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能通过高阶函数返回新函数
def f1(x): return x*2 def new_fn(f): #装饰器 def fn(x): print 'call' + f.__name__ + '()' return f(x) return fn #调用装饰器 #1. 间接 # g1 = new_fn(f1) # print g1(5) #2. 彻底隐藏f1的原始定义函数 f1 = new_fn(f1) print f1(f1)
python内置@语法简化装饰器调用
@new_fn def f1(x): return x*2
相当于
def f1(x): return x*2 f1 = new_fn(f1)
简化代码,避免每个函数编写重复性代码
打印日志 @log
检测性能 @performance
数据库事物 @transaction
URL路由 @post(‘/register’)
*args 代表任意个普通参数,**kw代表任意个用=号指定默认值的参数
*args 是元组 、**kw是字典
无参数的 decorator
打印出函数调用的时间:import time def performance(f): def fn(*args, **kw): t1 = time.time() r = f(*args, **kw) t2 = time.time() print 'call %s() in %fs' % (f.__name__, (t2 - t1)) return r return fn @performance def factorial(n): return reduce(lambda x,y: x*y, range(1, n+1)) print factorial(10)
有参数的 decorator
允许传入’s’或’ms’:import time,functools def performance(unit): def perf_decorator(f): @functools.wraps(f) def wrapper(*args,**kw): t1 = time.time() r = f(*args,**kw) t2 = time.time() t = (t2 - t1)*1000 if unit == 'ms' else (t2 - t1) print 'call %s() in %f %s' % (f.__name__,t,unit) return r return wrapper return perf_decorator @performance('ms') def factorial(n): return reduce(lambda x,y:x*y,range(1,n+1)) print factorial(10)
Python内置的functools来复制原函数的属性
偏函数
functools.partial可创建偏函数,可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值,这样,新函数调用的难度就降低了。import functools sorted_ignore_case = functional.partial(sorted,cmp=lambda s1,s2: cmp(s1.lower(),s2.lower())) print sorted_ignore_case(['bob','about','Zoo','Credit'])
相关文章推荐
- python:字符串的连接
- Python的pass语句
- 零基础入门学习Python(17):对象(2)
- Python os模块常用部分功能总结
- numpy 札记
- python使用mysql数据库(转)
- Python中的修饰函数
- python 脚本cron不执行
- windows转化python为可执行程序py2exe使用方法
- python基础教程_list列表生成式
- 安装ElasticSearch搜索工具并配置Python驱动的方法
- 每天学点Python之Iterator
- 每天学点Python之dict
- Python CGI编写web程序-加法器
- Python爬虫笔记
- pythonchallenge(19-20)
- Python: 冒泡排序
- Python基础-数据类型
- Python学习笔记
- 排序算法—冒泡排序算法分析与实现(Python)