模块入门:闭包,时间模块,装饰器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块入门:闭包,时间模块,装饰器相关的知识,希望对你有一定的参考价值。

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
日志记录

 

 

以上是关于模块入门:闭包,时间模块,装饰器的主要内容,如果未能解决你的问题,请参考以下文章

python装饰器模块

函数进阶---作用域闭包装饰器

day4-装饰器和模块导入

第8章 装饰器模块和包

Python_day4 装饰器,模块倒入,包的导入

python 函数-作用域-匿名函数-闭包-装饰器