1.什么是闭包?
闭包就是能够读取其他函数内部变量的函数,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数”。
闭包包含自由(未绑定到特定对象)变量,这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包”一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)
闭包的特征?
1.嵌套函数
2.内层函数引用外层函数的变量(自由变量:nonlocal)
3.外层函数返回的是内层函数
定义闭包,完成的功能为:传入一个数求和并输出
例如:
传入10 ->输出10
传入15 ->输出25
传入20 ->输出45
def outer_summary():
sum = 0
def summary(num):
nonlocal sum
sum = sum + num
print(sum)
return summary
summary = outer_summary()
summary(10)
summary(15)
summary(20)
10
25
45
2.定义一个装饰器:打印函数运行花费的时间
你在执行之前获取一个时间
执行函数
在执行函数之后获取一个时间
去求时间差
import time
def outing(func):
def inner(*args, **kwargs):
time_da = time.time()
print(time_da)
func(*args, **kwargs)
time_da1 = time.time()
print(time_da1)
print("{}函数运行时间为:{:.9f}秒".format(func.__name__, time_da1 - time_da))
return inner
@outing
def time_c(*args, **kwargs):
time.sleep(2)
print('运行结束')
time_c()
1657971612.9682002
运行结束
1657971614.9791825
time_c函数运行时间为:2.010982275秒
3.定义一个类:
要求:包含一个对象属性,且用_(单下划线)命名的
定义一个类方法(装饰器)
定义一个静态方法(装饰器)
定义委托属性(三个类装饰器): 可以访问_命名的属性的值
可以修改_命名的属性的值
可以删除_命名的属性
执行:
实例一个对象
调用类方法(类和对象两种方式)
调用静态方法(类和对象两种方式)
对象.委托属性
对象.委托属性 = value
del 对象.委托属性
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
self._data = 5
def get_info(self):
return self.name + str(self.age)
def get_data(self):
return self._data
def set_data(self, value):
self._data = value
def del_data(self):
del self._data
data = property(get_data, set_data, del_data, "data is managed attribute of _data")
@staticmethod
def print_info():
print("INFO")
def test_func(self):
print(self.name)
# print_info()
@classmethod
def class_method(cls):
print(cls)
per = Person('zhangsan', 18)
Person.print_info()
per.test_func()
Person.class_method()
per.class_method()
print(per.data)
per.data = 666
print(per.data)
del per.data
INFO
zhangsan
<class '__main__.Person'>
<class '__main__.Person'>
5
666