- 闭包
- 装饰器
- 迭代器
- 生成器
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
- 本层函数对外层函数的局部变量的使用,此时内层函数被称为闭包函数
- nonlocal关键字
- 用来在函数或者其他作用域中使用改变外层(非全局)变量
- global关键字
- 使局部变量改变全局变量
- 闭包作用
- 让一个变量常驻于内存
- 可以在外部使用改变局部变量
- 可以避免全局变量被修改
def func(fn):
def inner():
print('fn进来了')
fn()
print('fn出去了')
return 'f'
return inner
装饰器
- 装饰器本质就是闭包,对外部参数的引用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lK5xpRj-1658748162133)(https://note.youdao.com/yws/public/resource/92933d878935240680c00793fc3e404c/xmlnote/WEBRESOURCE4b04ad7a77e3f4839c3aec781b1bf638/282)] - 作用:再不改变原有函数调用下,给函数增加新功能
- 被装饰函数的参数问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NP341R8L-1658748162137)(https://note.youdao.com/yws/public/resource/92933d878935240680c00793fc3e404c/xmlnote/WEBRESOURCE1fafef16078d32612e502eb0b1abc167/285)]- 被装饰函数有参数的话,返回函数和目标函数都要加参数
- 一个函数可被多个装饰器装饰
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3dh5RNJJ-1658748162138)(https://note.youdao.com/yws/public/resource/92933d878935240680c00793fc3e404c/xmlnote/WEBRESOURCE41423cb93092312e319ca6c692d96b55/287)] - 通用装饰器写法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TEtFJe7l-1658748162139)(https://note.youdao.com/yws/public/resource/92933d878935240680c00793fc3e404c/xmlnote/WEBRESOURCEac8b6f5b8fc2f347c7b46322e30ed341/289)]
- 迭代器基本概念
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gRM935UT-1658748162140)(https://note.youdao.com/yws/public/resource/92933d878935240680c00793fc3e404c/xmlnote/WEBRESOURCE1dd2549d9128032bff9071f76a709740/291)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q6RPwWI8-1658748162141)(https://note.youdao.com/yws/public/resource/92933d878935240680c00793fc3e404c/xmlnote/WEBRESOURCEbfae8b8c0f2e3623989f0515cfa38dd5/301)]- 迭代器的特点
- 只能向前不能反复
- 特别节省内存
- 惰性机制
- 迭代器的特点
-
本质就是迭代器
-
生成器函数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mXyxMsbS-1658748162142)(https://note.youdao.com/yws/public/resource/92933d878935240680c00793fc3e404c/xmlnote/WEBRESOURCE3289374207963d5bc0b5623b6c3f15b9/294)]def order(): lst=[] for i in range(100): lst.append(f"衣服{i}") if len(lst)==3: yield lst lst=[] gen=order() print(gen.__next__()) print(gen.__next__()) # ['衣服0', '衣服1', '衣服2'] # ['衣服3', '衣服4', '衣服5'] -
推导式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FpCJPGuC-1658748162143)(https://note.youdao.com/yws/public/resource/92933d878935240680c00793fc3e404c/xmlnote/WEBRESOURCEd97b599387567b38f0dbf2de6807fc24/297)] -
生成器表达式
- 优点:用好了特别节省内存
- 生成器表达式是一次性的
- 语法:
- (数据 for循环 if)



