一、闭包
内层函数对外层函数中非全局变量的引用,就会形成闭包。被引用的非全局变量称为自由变量,这个自由变量会与内层函数产生一个绑定关系。自由变量不会再内存中消失。
# 闭包只能存在于嵌套函数中
def make_average():
# 以下部分就是一个闭包
li_1 = []
def average(num):
li_1.append(num)
return sum(li_1)/len(li_1)
return average
avg = make_average()
print(avg(100)) # 100.0
print(avg(200)) # 150.0
二、装饰器
开放封闭原则:对代码的拓展开放,对源码的修改封闭
装饰器:完全遵循开放封闭原则。在不改变原函数的代码以及调用方式的前提下,为其增加额外的新功能的函数。
# 装饰器是一个函数
# 示例,给函数运行加一个运行时间显示
import time
def timmer(f):
def inner():
start_time = time.time() # 记录初始时间
# 如果被修饰函数没有返回值,只需写f(),且inner函数不需要返回值
r = f() # 运行函数
end_time = time.time() # 记录结束时间
print(end_time-start_time) # 返回函数运行时间
return r # 这里返回的被修饰函数的返回值
return inner
@timmer # 在需要装饰的函数前写‘@‘+装饰器
def func_1():
print(‘下一行显示函数运行时间‘)
time.sleep(1) # 让函数停止运行1秒,即运行时间加1秒
return 666
res = func_1()
print(res)
# 下一行显示函数运行时间
# 1.000281572341919
# 可以看出func_1的返回值没有出现
上述装饰过程可以由以下代码实现:
import time
def timmer(f):
def inner():
start_time = time.time() # 记录初始时间
r = f() # 运行函数
end_time = time.time() # 记录结束时间
print(end_time-start_time) # 返回函数运行时间
return r
return inner
def func_1():
print(‘下一行显示函数运行时间‘)
time.sleep(1) # 让函数停止运行1秒,即运行时间加1秒
return 666
func_1 = timmer(func_1) # 这一行命令作用跟装饰器效果一样
res = func_1()
print(res)
? 可以看出,第一种装饰器使用方法简洁明了,实际上这正是python对装饰器进行的一个优化。上述修饰器的情况还是很简单的情形,真正的修饰器还需要考虑被修饰函数传入参数等情况。
三、自定义模块
模块是什么?其实本质上模块就是.py文件,它是封装语句的最小单位。而自定义模块实质上就是自己定义.py文件,其中可以包含:变量定义,可执行语句,for循环,函数定义等,这些统称为模块的成员。
模块的运行方式:
__name__
属性的使用方式:在脚本方式运行时__name__=__main__
,在模块方式运行时,__name__=被导入模块名称
。
系统模块导入的路径:
如果在上述三个路径都找不到指定模块,程序就会报错。
原文:https://www.cnblogs.com/20-03-14/p/12580932.html