6:匿名函数:
Python中 对于匿名函数提供了有限的支持
>>>map(lambda x:x*x,[1,2,3,4,5,6,7,8,9])
[1,4,9,16,25,36,49,64,81]
可以看出 lambda其实就相当于:
>>>def f(x):
return x*x
关键字lambda表示匿名函数 冒号前面的表示
函数参数
注意 Python中匿名函数有一个限制 那就是只能有一个表达式 返回值就是表达式的结果
7:装饰器
。
>>>def now():
print '2013-12-25'
>>>f=now
>>>f()
2013-12-25
>>>now.__name__
'now'
>>>f._name_
'now'
_name_ 函数的属性 可以得到函数的名称
如果我们希望now()函数在调用的前后自动打印日志 但是有不改动now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为 装饰器(decorator).本质上装饰器就是返回函数的高阶函数
>>>def log(func):
def wrapper(*args,**kw):
print 'call %s():' %func.__name__
return func(*args,**kw)
return wrapper
以上就是一个装饰器 接受了一个函数作为参数 并返回一个函数
>>>@log
>>>def now():
print '2013-12-25'
>>>now()
call now():
2013-12-25
把@log 放到now()函数的定义处 相当于执行了语句 now =log(now) 执行流程是: 首先 now=log(now) 于是 now 指向返回的wrapper 接受到了参数 打印call 然后now 有指向了返回的func也就是原函数。这样就实现了整个装饰器的功能。
>>>def log(text):
def decorator(func):
def wrapper(*args,**kw):
print '%s %s():' %(text,func.__name__)
return func(*args,**kw)
return wrapper
return decorator
>>>@log('execute')
def now():
print 'hello'
>>>now()
execute now():
hello
@log('execute') 相当于now =log('execute')(now) 分析流程同上
>>>now.__name__
wrapper
上述两种装饰器 还差最后一步,因为 经过装饰之后的函数 ___name__已经从now变为了wrapper。因为返回的那个wrapper()函数的名字就是wrapper.完整的如下:
>>>import functools
>>>def log(func):
@functools.wraps(func)
def wrapper(*args,**kw):
print 'call %s()' %func.__name__
return func(*args,**kw)
return wrapper
或者如下
>>>import functools
>>>def log(text)
def decorator(func):
@functools.wraps(func)
def wrapper(*args,**kw):
print '%s %s():' %(text,func.__name__)
return func(*args,**kw)
return wrapper
return decorator
...
>>>inport functools
>>>def log(func):
@functools.wraps(func)
def wrapper(*args,**kw):
print 'begin'
result= func(*args,**kw)
print 'end'
return wrapper
>>>@log
>>>def now():
print 'hello'
>>>now()
begin
hello
end
............ do not understant
8: 偏函数:(相当于把一个函数的默认的参数改变成另一个默认值 形成一个新的函数)
>>>def int2(x,base=2):
return int(x,base)
>>>int2('1000000')
64
偏函数的作用就相当于上述定义的哪一个函数
>>>import functools
>>>int2=functools.partial(int,base=2)
>>>int2('1000000')
64
functools.partial 的作用就是把一个函数的某些参数固定住 返回一个新的函数