函数式编程
函数作为形参传入函数
函数作为返回值
def cacl_sum(*args):
all_sum = 0
for i in args:
all_sum += i
return all_sum
cacl_sum(1,2,3,4,5)
闭包
def lazy_sum(*args): # args 是元组
def cacl_sum():
all_sum = 0
for i in args:
all_sum += i
return all_sum
return cacl_sum
f = lazy_sum(1,2,3,4,5) # f 实质是 lazy_sum 的返回值, f 实质上是一个函数名
print f() # 调用 cacl_sum 函数并运行
15
f1 = lazy_sum(1,2,3,4,5)
f2 = lazy_sum(1,2,3,4,5)
# 当调用闭包 lazy_sum 时, 每次调用都返回一个新的函数;
print f1 == f2
False
装饰器
1.装饰器,可以理解为函数;
2.装饰器实质上是用来装饰函数的;
3.装饰器就是在原来功能基础上加上一些其他功能,即在程序执行前或者执行后加上需要的操作;
4.装饰器的功能,比如:权限的验证,日志记录, 函数运行时间统计, 执行函数前预备处理, 执行函数后清理功能等;
def addInfo(fun):
def wrapped():
print "欢迎使用中国邮政储蓄银行ATM......"
fun()
return wrapped
# 装饰器的语法糖
@addInfo
def login():
print "login...."
login()
@addInfo
def kaihu():
print "kaihu......"
kaihu()
欢迎使用中国邮政储蓄银行ATM......
login....
欢迎使用中国邮政储蓄银行ATM......
kaihu......
理解装饰器的实质(建议在pycharm中debug调试,查看运行过程)
装饰器的语法糖
def addInfo(fun):
def wrapped():
print "........ATM......"
fun()
return wrapped
# # 装饰器的语法糖
# login = addInfo(login) #addInfo(login) 返回值是一个函数 , 等价于上面的语法糖;
@addInfo
def login():
print "login...."
login() #调用函数,需要 addInfo(login)(), login()
装饰器应用之函数计时器
import time
def Timmer(fun):
def wrapper(*args, **kwargs):
start_time = time.time()
fun(*args, **kwargs)
end_time = time.time()
print "%s function run %s" % (fun.__name__, end_time - start_time)
return wrapper
@Timmer
def login():
time.sleep(0.5)
print "login......."
@Timmer
def myadd(x,y):
print x+y
login()
myadd(1,2)
被装饰的函数有参数
案例参照上述代码
必选参数
默认参数
可变参数(注意: 尽量使用,通用性比较强)
关键字参数
装饰器带参数
def Info(pre="登录"):
def addInfo(fun):
def wrapped():
print "欢迎使用中国邮政储蓄银行ATM的%s系统......" %(pre)
fun()
return wrapped
return addInfo
# 装饰器的语法糖
@Info()
def login():
print "login...."
@Info("开户")
def kaihu():
print "kaihu......"
login()
kaihu()
装饰器案例之引入日志
添加装饰器@myLogger的函数都会记录日志
日志格式为 什么时间 start 什么函数 函数参数
文件操作学习后的升级: 把日志信息记录到文件/var/log/myfun.log中;
import time
def Logger(fun):
def warpper(*args, **kwargs):
fun(*args, **kwargs)
print "%s start %s(%s, %s)" %(
time.time(), fun.__name__, args, kwargs)
return warpper
@Logger
def login():
print "login....."
@Logger
def add(x,y):
print x+y
login()
add(1,2)
import time
def Logger(fun):
def warpper(*args, **kwargs):
fun(*args, **kwargs)
f = open("/var/log/myfun.log", 'a+')
f.write("%s start %s(%s, %s) %(time.time(),fun.__name__,args,kwargs))
f.close()
return warpper
@Logger
def login():
print "login....."
@Logger
def add(x,y):
print x+y
login()
add(1,2)