模块入门:闭包,时间模块,装饰器
1.闭包: 闭包(closure)是计算机编程领域的专业名词,指可以包含自由(未绑定到特定对象)变量的代码块,子函数可以使用父函数中的局部变量。
1 g = 70 2 def outer(x): 3 x = 10 4 def inner(): #条件一inner就是内部函数, 5 c = 10 6 print(c) 7 print(g) #条件2外部环境的一个变量#局部变量全局无法调用 8 return inner# 内部函数inner就是一个闭包 9 outer() 10 #关于闭包:闭包 = 内部函数+定义函数时的变量
2.时间模块(time)
前面在一些程序中我们实现了日志记录这一功能,我们也可以记录某一功能实现需要的时间,因此这引出时间模块这一说
首先举个简单的例子来说:
一个简单的计时器
1 import time #时间模块 2 start = time.time() 3 time.sleep(2) 4 end = time.time() 5 print(end - start)
结果:
2.0003368854522705
2.1
1 import time 2 def foo(): 3 print("foo.....") 4 time.sleep(2) 5 def bar(): 6 print("bar......") 7 time.sleep(1) 8 def show_time(f): 9 start = time.time() 10 f() 11 end = time.time() 12 print("spend %s" %(end - start)) 13 show_time(bar) 14 show_time(foo)
结果为:
bar...... spend 1.0016872882843018 foo..... spend 2.0003185272216797
这就是简单的时间模块在函数中区调用它,计算出所需要的时间
2.2
1 import time 2 print(help(time)) 3 print(time.time())# 1473330166.665491:时间戳 ****** 4 time.sleep(1) #****** 5 print(time.clock())# 计算CPU执行时间
1 import time 2 print(time.gmtime())#结构化时间#time.struct_time(tm_year=2016, tm_mon=9, tm_mday=20, tm_hour=10, tm_min=43, tm_sec=46, tm_wday=1, tm_yday=264, tm_isdst=0) 3 print(time.localtime())#time.struct_time(tm_year=2016, tm_mon=9, tm_mday=20, tm_hour=18, tm_min=43, tm_sec=46, tm_wday=1, tm_yday=264, tm_isdst=0)
1 print(help(time.strftime)) 2 struct_time=time.localtime() 3 print(time.strftime('%Y--%m--%d %H:%M:%S',struct_time)) #字符串时间:*******
#strftime,是一种计算机函数,strftime() 函数根据区域设置格式化本地时间/日期,函数的功能将时间格式化,或者说格式化一个时间字符串
结果是:2016--09--20 18:46:57
1 a=time.strptime('2016-09--08 18:48:35','%Y-%m--%d %H:%M:%S') 2 print(a.tm_year) 3 print(a.tm_mday) 4 print(a.tm_wday)
结果是:
2016
8
3
2.3 ctimectime功能是把日期和时间转换为字符串,
1 print(time.ctime()) 2 print(time.ctime(3600))
结果是:
Tue Sep 20 18:57:37 2016
Thu Jan 1 09:00:00 1970 #从这个时间开始算起
1 print(help(time.mktime)) 2 print(time.mktime(time.localtime()))
结果是:
1474369250.0
1 import datetime 2 3 print(datetime.datetime.now())
结果:2016-09-20 19:03:33.852781
3.装饰器
3.1首先还是上面的计时器的一个小例子
1 import time 2 def show_time(f): 3 def inner(): 4 start = time.time() 5 f() 6 end = time.time() 7 print("spend %s" % (end - start)) 8 return inner 9 @show_time #foo = show_time(foo)此时注意一下这个地方感觉foo好像被show_time装饰了,其实可以简单的说这就是装饰器,
其实这里的@show_time和后面的foo = show_time(foo)是等价的,只不过@看起来更有装饰器的感觉,
10 def foo(): 11 print("foo.....") 12 time.sleep(2) 13 foo() 14 @show_time 15 def bar(): 16 print("bar......") 17 time.sleep(1) 18 bar()
3.2
1 import time 2 def logger(flag=""): 3 def show_time(f): 4 def inner(*x,**y): 5 start = time.time() 6 f(*x,**y) 7 end = time.time() 8 print("spend %s" %(end - start)) 9 if flag == "true": 10 print("日志记录") 11 return inner 12 return show_time 13 @logger("true") #@show_time 14 def add(*a,**b): 15 sums = 0 16 for i in a: 17 sums += i 18 print(sums) 19 time.sleep(2) 20 add(1,2,3,4,5,6,7,8) 21 @logger("true") 22 def bar(): 23 print("bar") 24 time.sleep(1) 25 bar()
结果是:
36 spend 2.0003716945648193 日志记录 bar spend 1.0006699562072754 日志记录