python 函数式编程
2016-03-14 17:42
411 查看
函数式编程是可以对同一个输入返回相同输出的函数,内部代码不包含对输出结果有影响的状态。
python 中如果使用一个函数变量?
代码
这两个函数因为闭包配置参数的不同,所以对输出的结果不同。
代码
简单的装饰器
当调用hello 的时候,其实调用的log 函数,而编译器则会把这个函数当作参数出入log 函数。
log 函数会把使用的函数返回
带参数的装饰器和带参数的函数
当打印hello 函数的名称时,打印结果却是fff,这是怎么回事?
原因是hello 函数的装饰器使用了闭包。所以更改了hello 函数name 的属性。
如何解决这个问题?
当给装饰器里面调用 hello 的函数,加上个
像简单的装饰器的代码里面就不会出现这种问题。
函数变量
有很多拥有函数编程的语言有可以将函数作为变量,然后传入函数使用。python 中如果使用一个函数变量?
def add(x,y): return x +y v1 = add print v1(999,1)#1000
代码
v1 = add可以说是多余的,因为add 函数其实就是个变量。
高阶函数
高阶函数可以把函数变量当作形参,传入函数里面,然后进行操作def add(x,y): return x +y def printadd(add): print add printadd(add(999,1))#1000
闭包
python 函数里面可以定义一个函数,而且还可以还函数,这个函数也可以使用外部函数的变量,这种情况叫做闭包。def make_adder(addend): def adder(augend): return augend + addend return adder p = make_adder(23) q = make_adder(44) print p(100)#123 print q(100)#124
这两个函数因为闭包配置参数的不同,所以对输出的结果不同。
匿名函数
在python 中,匿名函数是一个lambda 表达式,这个表达式可以传入参数,并且有返回值。import math f = lambda x:math.sqrt(x) % 1 == 0 print f(9) #True
代码
lambda x:math.sqrt(x) % 1 == 0就是一个函数,只是没有函数名,所以称作为匿名函数,这个函数支持一个参数传入,然后计算这个数的平方根是否是整数。
装饰器(decorator)
装饰器是一个函数,但是使用的时候不和平常的函数那样使用。装饰器是使用到方法上。简单的装饰器
def log(f): print 'call function %s' % (f.__name__) return f @log def 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,' + str hello('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,' + str print hello.__name__ #fff
当打印hello 函数的名称时,打印结果却是fff,这是怎么回事?
原因是hello 函数的装饰器使用了闭包。所以更改了hello 函数name 的属性。
如何解决这个问题?
import functools def 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') d 4000 ef hello(str): print 'hello,' + str print hello.__name__ #hello
当给装饰器里面调用 hello 的函数,加上个
@functools.wraps(f)装饰器,则可以解决。
像简单的装饰器的代码里面就不会出现这种问题。
相关文章推荐
- C#函数式编程中的缓存技术详解
- C#函数式编程中的部分应用详解
- 浅谈javascript函数式编程
- 使用 JavaScript 进行函数式编程 (一) 翻译
- C#函数式编程中的标准高阶函数详解
- 深入探讨javascript函数式编程
- Java函数式编程(五):闭包
- javascript 函数式编程
- 用函数式编程技术编写优美的 JavaScript_ibm
- C#函数式编程中的递归调用之尾递归详解
- Javascript函数式编程语言
- C#函数式编程中的惰性求值详解
- javascript函数式编程程序员的工具集
- Javascript函数式编程简单介绍
- 《JavaScript函数式编程》读后感
- Java函数式编程(十二):监控文件修改
- Java函数式编程(七):MapReduce
- Java函数式编程(四):在集合中查找元素
- Java函数式编程(十):收集器
- Java函数式编程(八):字符串及方法引用