老生常谈老生常谈Python之装饰器、迭代器和生成器之装饰器、迭代器和生成器
在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器、
迭代器和生成器理解进行解释。
为什么要使用装饰器为什么要使用装饰器
什么是装饰器?“装饰”从字面意思来谁就是对特定的建筑物内按照一定的思路和风格进行美化的一种行为,所谓“器”就是工
具,对于python来说装饰器就是能够在不修改原始的代码情况下给其添加新的功能,比如一款软件上线之后,我们需要在不修
改源代码和不修改被调用的方式的情况下还能为期添加新的功能,在python种就可以用装饰器来实现,同样在写代码的时候也
要考虑到后面的可扩展性,下面我们来看一步一步的看一下python的装饰器。
一个简单例子引入无参装饰器一个简单例子引入无参装饰器
先来看简单的几行代码,代码的运行结果是先睡2秒,再打印”hello boy!”:
import time
def foo():
"""打印"""
time.sleep(2)
print("Hello boy!")
foo()
我们现在我们需要为其添加一个程序计时功能,但是不能修改原始的代码:
import time
def timmer(func):
def wrapper():
"""计时功能"""
time_start=time.time()
func()
time_end=time.time()
print("Run time is %f "%(time_end-time_start))
return wrapper
def foo():
"""打印"""
time.sleep(2)
print("Hello boy!")
foo=timmer(foo)
foo()
#运行结果
Hello boy!
Run time is 2.000446
看!我们没有修改原来的代码就实现了这个功能,因为函数也是对象,所以能够将函数foo当做参数传递给了函数timmer。
在python中,有个更简洁的方式来取代foo=timmer(foo),使用@timmer这种方式,这个在python中被称为语法糖。
import time
def timmer(func):
def wrapper():
"""计时功能"""
time_start=time.time()
func()
time_end=time.time()
print("Run time is %f "%(time_end-time_start))
return wrapper
@timmer #等于 foo=timmer(foo)
def foo():
"""打印"""
time.sleep(2)
print("Hello boy!")
foo()
下面我们来一步一步的分析函数的执行过程:
1.导入time模块
import time
2.定义函数timmer,定义函数并不会执行函数内的代码