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

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
日志记录
时间: 2024-08-10 00:01:06

模块入门:闭包,时间模块,装饰器的相关文章

python入门(六)装饰器的理解

装饰器用于拓展原有函数功能的一种函数比如: def helloWorld(fun) def out() print ("======start========") fun() print ("=====end======") return out @helloWorld def back () print ("let's go") back() 运行结果: ======start======== let's go =====end====== b

闭包函数、装饰器以及语法糖

闭包函数: 1.闭包函数必须在函数内部定义 2.闭包函数可以引用外层函数的名字 闭包函数是 函数嵌套.函数对象.名称空间与作用域 结合体. # 直接传参 def func(x): print(x) func(1000) # 通过闭包函数传参 def outer(number): # number = 100 # inner就是闭包函数 def inner(): print(number) return inner func = outer(1000) # ---> inner地址 ---> f

functools模块(partial,lru_cache装饰器)

partial方法 偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回.从partial生成的新函数,是对原函数的封装. import functools def add(x, y) -> int: return x + y newadd = functools.partial(add, y=5) print(newadd(7)) print(newadd(7, y=6)) print(newadd(y=10, x=6)) import inspe

Python入门之函数的装饰器

本章目录: 装饰器: 一.为什么要用装饰器 二.什么是装饰器 三.无参装饰器 四.装饰器语法糖 五.认证装饰器实现 六.叠加多个装饰器 七.带参装饰器 =========================================================== 一.开放封闭原则 引子--为什么要用装饰器 软件一旦上线后,对修改源代码是封闭的,对功能扩展是开放的. 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能 总结,原则如下: 1.不

闭包函数、装饰器

一.补充知识点 1.可调用的callable(可以加括号执行某个特定功能):函数名,类名 2.import this:查看Python之禅 二.闭包函数 1.定义 闭:定义在函数内部的函数 包:内部函数引用了外部函数作用域的名字 2.形式 def outter(x,y): def inner(): 代码1 代码2 return inner res = outter(1, 2) res() 3.作用 给函数体传参有两种方式,第一种是直接给函数体传参,第二种就是用闭包函数,它是利用外部函数给内部函数

2019-07-11 闭包函数和装饰器

一.闭包函数 定义:定义在内部的函数引用外部函数的名字(变量)叫做闭包函数 要打印的是inner函数的x,因为这个函数里面没有定义x的值,所以找上一层的局部变量x = 111.执行代码,outter函数被调用,返回值为inner,用变量res接收,所以res = inner,下面再用res(),就是inner(),调用inner函数,执行里面代码,打印结果为111 def outter(): x = 111 def inner(): print(x) return inner res = out

闭包函数与装饰器

闭包闭包函数:1.函数内部定义的函数,成为内部函数   2.该内部函数包含对外部作用域,而不是对全局作用域名字的引用 特点:自带作用域 延迟计算 closure<包含的作用域> 定义闭包函数的基本形式def 外部函数名(): 内部函数需要的变量 def 内部函数(): 引用外部变量 return 内部函数 def f1(): name='good' def f2(): print(name) return f2 包两层 def aaa(): name='egon' def wrapper():

python全栈开发从入门到放弃之装饰器函数

1.函数名可以当作函数的参数 1 import time 2 def timmer(func): 3 #函数名可以当做函数的参数 4 def inner(): 5 start = time.time() 6 func() 7 end = time.time() 8 print(end - start) 9 return inner 10 11 def hahaha(): 12 time.sleep(0.1) 13 print('aaaa') 14 15 hahaha() 16 17 输出结果 1

Python基础(7)闭包函数、装饰器

一.闭包函数 闭包函数:1.函数内部定义函数,成为内部函数, 2.改内部函数包含对外部作用域,而不是对全局作用域名字的引用 那么该内部函数成为闭包函数 #最简单的无参闭包函数 def func1() name='ares' def func2() print(name) #有参和返回值的闭包函数 def timmer(func): def wrapper(*args,**kwargs): start_time = time.time() res=func(*args,**kwargs) stop

python3 闭包函数,装饰器

闭包函数: 1.定义在函数内部的函数 2.包含对外部作用域而非全局作用域的引用特点: 1.自带作用域 2.延迟计算(取到内存地址,加括号执行) def 外部函数(func): def 内部函数(*args,**kwargs): pass return 内部函数 f=外部函数(func) print(f.__closure__) print(f.__closure__[0].cell_contents) 优点: 1 自带作用域 2 惰性延迟 1.开放封闭原则,对扩展是开房的,对修改是封闭的2.装饰