生成器
生成器就是一边循环一边执行可以减小内存压力
生成器的两种方法
第一种 将列表生成式进行修改 中括号改成小括号就好了
第二种 就是循环函数中添加 yield
生成器获取 方式 next() __next()
yield 有send () 给一个数据 本身yield 代码块没有返回值
迭代器
可迭代对象 iterable
集合数据类型 生成器
迭代器 iterator
可以用next获取的数据
如何判断
from collections import Iterable,Iterator
通过isinstance进行判读
iter 可以将可迭代对象转成 迭代器
闭包
就是函数里面嵌套函数形成闭包 闭包的范围是内部函数和变量
内部变量如何在内部函数修改 通过nonlocal 定义 用法和global差不多
装饰器
作用就是在原有功能模块代码基础上不修改原有代码 进行扩展
原理就是闭包调用一个函数 返回一个新的函数 这个函数的引用 和原函数的引用名一样
用法
@ 扩展的函数
有很多类型可以放参数等等多次装饰
import 模块的导入 sys.path 可以查看 模块导入的搜索路径是个列表可以进行列表操作
重新加载模块 通过 from imp import reload reload(模块名)
进行重新加载
作用域 命令空间
变量都有各自的作用域 变量的搜索 按照LEGB
locals 本地变量
enclosing function 闭包呢的变量
globals 模块中的全局变量
builtins 內建属性或方法
== is == 值相同 is 是内存地址相同
深拷贝 浅拷贝 利用copy模块
copy.copy 浅拷贝 不可变类型复制引用 可变类型 只会复制顶层数据
copy.deepcopy 深拷贝 不可变类型 查看 内部是否有可变类型如果有就申请内存拷贝一份 如果没有复制引用 可变类型 将所有层都复制一份
私有化 _x 作用 模块导入时 不会被 导入 _x 类中私有的不会别继承 xx 魔法方法 x 为了区分关键字
property 作用 简化 对类中的属性进行修改
用法 变量=property(get(),set())
或 通过修饰器 @ property @变量.setter
元类 用来创建类 type方法type(class_name, (father) ,属性和方法{})
通过metaclass 属性来创建类 也可以自定义
垃圾回收
四个需要注意的点
小整数池 [-5,256] 内存常驻 系统默认生成
大整数池 都会重新创建
inter机制 共享机制 字符串没有空格 多次复制 用的是同一个
单个字母 内存常驻
垃圾回收 过程 引用计数为主 分代收集为辅
分代收集 是为了解决 循环引用问题 有0代 1代 2代
gc模块
disable 关闭 垃圾回收
collect 手动进行一次垃圾回收
gc.get_threshold 获取引用计数的阀值
gc.get_count 获取当前的引用计数
內键属性 str init del class new 等等
內键函数
range
map
filter
reduce
sorted
集合set
并集
交集
差集
对称差集