课程小总结
装饰器比较麻烦,可能是写少了,总觉得绕来绕去的。
函数的嵌套
函数可以定义在全局、也可以定义另外一个函数中(函数的嵌套)
函数嵌套在多人开发的时候,可以避免全局命名冲突,特别当一个函数功能特别大,拆分成几个小函数也是比较好的。
- 优先在自己的作用域找,自己没有就去上级作用域。
- 在作用域中寻找值时,要确保此次此刻值是什么。
- 分析函数的执行,并确定函数作用域链。(函数嵌套)
闭包 - closure
闭包,简而言之就是将数据封装在一个包(区域)中,使用时再去里面取。(本质上 闭包是基于函数嵌套搞出来一个中特殊嵌套)
- 封装数据防止污染全局。
- 封装数据封到一个包里,使用时在取
装饰器 - decorator
-
实现原理:基于@语法和函数闭包,将原函数封装在闭包中,然后将函数赋值为一个新的函数(内层函数),执行函数时再在内层函数中执行闭包中的原函数。
-
实现效果:可以在不改变原函数内部代码 和 调用方式的前提下,实现在函数执行和执行扩展功能。
-
适用场景:多个函数系统统一在 执行前后自定义一些功能。
-
装饰器示例
import functools def auth(func): @functools.wraps(func) def inner(*args, **kwargs): """巴巴里吧""" res = func(*args, **kwargs) # 执行原函数 return res
作业
作业1
请为以下函数编写一个装饰器,添加上装饰器后可以实现: 检查文件所在路径(文件件)是否存在,如果不存在自动创建文件夹(保证写入文件不报错)。
import os
import functools
def judge_path(func):
@functools.wraps(func)
def inner(path): # 这里相当于重命名了要处理的函数
folder_path = os.path.dirname(path)
if not os.path.exists(folder_path): # 如果给的路径不存在
os.makedirs(folder_path)
res = func(path) # 执行文件的打开和写入关闭
return res
return inner
@judge_path # 这个@效果等于让下面的def变身为→judge_path(write_user_info)
def write_user_info(path):
file_obj = open(path, mode='w', encoding='utf-8')
file_obj.write("hello")
file_obj.close()
write_user_info('files/text/kkk.txt')
作业2
请为以下所有函数编写一个装饰器,添加上装饰器后可以实现:将被装饰的函数执行5次,讲每次执行函数的结果按照顺序放到列表中,最终返回列表。
import functools
import random
def re_5_times(func):
@functools.wraps(func)
def inner (*args,**kwargs):
list = []
for i in range(0,5):
res = func(*args, **kwargs)
list.append(res)
return list
return inner
@re_5_times
def func():
return random.randint(1,4)
result = func() # 内部自动执行5次,并将每次执行的结果追加到列表最终返回给result
print(result)
扩展
ThreadPoolExecutor资料
- How To Use ThreadPoolExecutor in Python 3 这个蛮好的,举例就是网页抓取
- Python ThreadPoolExecutor Tutorial 这个更基础一点,虽然也不能说等于白看……
- Linux并发与同步 多线程和并发原理
- Python标准库08 多线程与同步 (threading包) 只能说相关,没细看。
decorator装饰器参考
- python-custom-decorators-explained-by-example
- Python Decorators Tutorial 视频,评论置顶还有pandas的系列视频
- Python Tutorial: Decorators - Dynamically Alter The Functionality Of Your Functions 这个视频也不错,就是居然讲了30分钟,这个博主也有好多python教程视频
- Python Decorators 网站不错的