1、最简单的函数,准备添加额外功能
def myfunc():
print 'myfunc() called'
2、使用装饰函数在函数执行前和执行后分别添加额外功能
def deco(func):
print 'before myfunc() called'
func()
print 'after myfunc() called'
return func
def myfunc():
print 'myfunc() called'
myfunc = deco(myfunc)
3、使用语法糖@来装饰函数
@deco
def myfunc():
print 'myfunc() called'
myfunc()
4、使用内嵌包装函数来确定每次新函数都被调用
def deco(func):
def _deco():
print 'before myfunc() called'
func()
print 'after myfunc() called'
return _deco
@deco
def myfunc():
print "myfunc() called"
return 'ok'
5、神奇的星号
传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数时定义的参数)的时候,还可以使用两个特殊的语法:*、**
1)、调用函数时使用*/**
test(*args)
*的作用其实就是把序列args中的每个元素,当做位置参数传进去,比如上面这个代码,如果args等于(1,2,3),那么这个代码就等价于test(1,2,3)
test(**kwargs)
**的作用则是把字典kwargs编程关键字参数传递,比如上面这个代码,如果kwargs等于{'a':1, 'b':2, 'c':3},那这个代码就等价于test(a=1,b=2,c=3)
2)、定义函数参数时使用*/**
def test(*args):
pass
定义函数参数时*的含义又要有所不同,在这里*args表示把传进来的位置参数都装在元祖args里面,比如上面这个函数,调用test(1,2,3)的话,args的值就是(1,2,3)
def test(**kwargs):
pass
类似的,**就是针对关键字参数和字典的了,调用test(a=1,b=2,c=3)的话,kwargs的值就是{'a':1, 'b':2, 'c':3}了
普通的参数定义和传递方式和*们都可以和平共处,不过显然*必须放在所有位置参数的最后,而**则必须放在所有关键字参数的最后,否则就要产生歧义了。
6、lambda
lambda就是匿名函数的意思,用来定义没有名字的函数对象。
lambda arg1, arg2...:expression
lambda关键字后就是逗号分隔的形参列表,冒号后面是一个表达式,表达式求值的结果作为lambda的返回值
7、闭包(closure)
python支持函数的嵌套,也就是传说中的闭包:
def make_adder(n):
def add(n1):
return n+n1;
return add
所谓闭包,就是在嵌套函数中内部函数对象本身包含了外部函数对象名字空间。