遇到问题
1、函数带括号与不带括号的区别
加括号是运行函数(调用的是函数的return结果),不加括号是函数索引(调用的是函数本身)
2、函数中*args和**kwargs所代表的意义
Python函数中*args和**kwargs是用来传递变长参数的用法。单星号形式(*args)用来传递非命名键可变参数列表,即tuple。双星号形式(**kwargs)用来传递键值可变参数列表,即dict。注意顺序,不可逆。否则会出现“SyntaxError: non-keyword arg after keyword arg”错误。
3、函数装饰器@符号的应用
用@decorator来替代 myfunction = decorator(myfunction),此方式是添加了一些语法糖。
然后介绍装饰器:
什么是装饰器?它有什么作用?它的原理是什么?我可以用它做什么?这样做有什么好处?
装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数。
作用就是当需要增加函数功能时,不用在原有的基础上更改,而是给它穿上外套,让它变成我们需要的样子。
原理就是,利用函数也是对象,在函数的参数传递过程中,函数也可以作为一个参数传递进函数内部。
可以用来给原来的函数加以某些限制条件。
它让代码更加简介:通过将边界检测从函数本身分离,使用装饰器包装他们,并应用到所有需要的函数中。
另外关于廖大的装饰器问题
再思考一下能否写出一个@log的decorator,使它既支持:
@log
def f():
pass
又支持:
@log(‘execute’)
def f():
pass
年轻的两种写法
import functools
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args,**kwargs):
print(text + 'start')
result = func(*args,**kwargs)
print(text + 'end')
return result
return wrapper
if isinstance(text,str):
return decorator
else:
a = text;
text = ""
return decorator(a)
@log
def a():
print("one")
a()
@log("excute")
def b():
print("two")
b()
和
**import functools
def log(text):
if callable(text):
@functools.wraps(text)
def wrapper(*args,**kwargs):
print('start')
result = text(*args,**kwargs)
print('end')
return result
return wrapper
else:
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
print(text + ' start')
result = func(*args, **kwargs)
print(text + ' end')
return result
return wrapper
return decorator
@log
def a():
print("one")
a()
@log("excute")
def b():
print("two")
b()**
成熟的写法
这里写代码片
更详细的装饰器介绍
http://python.jobbole.com/85056/
和http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html