python 函数式编程
来源:互联网 发布:数据库实训总结 编辑:程序博客网 时间:2024/05/18 03:32
函数式编程是可以对同一个输入返回相同输出的函数,内部代码不包含对输出结果有影响的状态。
函数变量
有很多拥有函数编程的语言有可以将函数作为变量,然后传入函数使用。
python 中如果使用一个函数变量?
def add(x,y): return x +yv1 = addprint v1(999,1)#1000
代码v1 = add
可以说是多余的,因为add 函数其实就是个变量。
高阶函数
高阶函数可以把函数变量当作形参,传入函数里面,然后进行操作
def add(x,y): return x +ydef printadd(add): print addprintadd(add(999,1))#1000
闭包
python 函数里面可以定义一个函数,而且还可以还函数,这个函数也可以使用外部函数的变量,这种情况叫做闭包。
def make_adder(addend): def adder(augend): return augend + addend return adderp = make_adder(23)q = make_adder(44)print p(100)#123print q(100)#124
这两个函数因为闭包配置参数的不同,所以对输出的结果不同。
匿名函数
在python 中,匿名函数是一个lambda 表达式,这个表达式可以传入参数,并且有返回值。
import mathf = lambda x:math.sqrt(x) % 1 == 0print f(9) #True
代码lambda x:math.sqrt(x) % 1 == 0
就是一个函数,只是没有函数名,所以称作为匿名函数,这个函数支持一个参数传入,然后计算这个数的平方根是否是整数。
装饰器(decorator)
装饰器是一个函数,但是使用的时候不和平常的函数那样使用。装饰器是使用到方法上。
简单的装饰器
def log(f): print 'call function %s' % (f.__name__) return f@logdef hello(): print 'hello 'hello()#call function hello#hello
当调用hello 的时候,其实调用的log 函数,而编译器则会把这个函数当作参数出入log 函数。
log 函数会把使用的函数返回
带参数的装饰器和带参数的函数
def log(level): def ff(f): def fff(*args,**fm): print 'debug function: %s \t param : %s' % (f.__name__,args) return f(*args,**fm) return fff return ff@log('debug')def hello(str): print 'hello,' + strhello('tom')#debug function: hello param : ('tom',)#hello,tom
装饰器的问题
def log(level): def ff(f): def fff(*args,**fm): print 'debug function: %s \t param : %s' % (f.__name__,args) return f(*args,**fm) return fff return ff@log('debug')def hello(str): print 'hello,' + strprint hello.__name__#fff
当打印hello 函数的名称时,打印结果却是fff,这是怎么回事?
原因是hello 函数的装饰器使用了闭包。所以更改了hello 函数name 的属性。
如何解决这个问题?
import functoolsdef log(level): def ff(f): @functools.araps(f) def fff(*args,**fm): print 'debug function: %s \t param : %s' % (f.__name__,args) return f(*args,**fm) return fff return ff@log('debug')def hello(str): print 'hello,' + strprint hello.__name__#hello
当给装饰器里面调用 hello 的函数,加上个@functools.wraps(f)
装饰器,则可以解决。
像简单的装饰器的代码里面就不会出现这种问题。
0 0
- python函数式编程
- Python 函数式编程
- python 函数式编程
- python函数式编程
- Python:函数式编程
- Python函数式编程
- python 函数式编程
- python函数式编程
- python函数式编程
- python-函数式编程
- python 函数式编程
- python函数式编程
- python函数式编程
- Python--函数式编程
- Python: 函数式编程
- Python函数式编程
- python 函数式编程
- Python函数式编程
- js判断当前环境是否为苹果手机
- 【bzoj3203】[Sdoi2013]保护出题人 凸包+三分法
- Apple Pay接入详细教程
- 深度学习傻瓜教程(1)
- css:position 与 z-index 问题(1)
- python 函数式编程
- UITextField加密输入属性
- java微信开发-token验证
- Nim Game---292
- weibo爬虫计划,以及普适爬虫框架的搭建
- java 中类加载过程
- 原IOS CGContextSetLineWidth无法设置1像素线宽?
- java.lang.OutOfMemoryError: PermGen space
- viewpager+fragment