在python中有三种方式来获取生成器
1.通过生成器函数
2.通过各种推导式来实现生成器
3.通过数据的转换也可以获取生成器
生成器表达式和列表推导式的区别:
1.列表推导式比较耗内存.一次性加载;生成器表达式几乎不占内存,使用的时候才分配和使用内存.
2.得到的值不一样,列表推导式得到的是一个列表,生成器表达式获取的是一个生成器.
字典推导式:
推导出来的是字典
集合推导式:
集合推导式可以帮我们直接生成一个集合,集合的特点:无序,不重复,所以集合推导式自带去重功能
总结
推导式有:列表推导式,字典推导式,集合推导式, 没有元祖推导式!!!!!!!
生成器表达方式:(结果for 变量名 in 可迭代对象 if 条件筛选)
神撑起表达式可以直接获取到生成器对象,生成器对象可以直接进行for循环.生成器具有惰性机制
函数名使用及第一类对象
函数名是一个变量,但它是一个特殊的变量.于括号配合可以执行函数的变量
1.函数名的内存地址
2.函数名可以赋值给其他变量
3.函数名可以当做容器类的元素
4.函数名可以当做函数的参数
5函数名可以作为函数的返回值
闭包:
闭包就是内层函数对外层函数(非全局)的 变量的引用,就叫做闭包!
使用 函数名.__closure__返回非None就是闭包,返回None就不是闭包
闭包的作用就是让一二变量能够常驻内存,供后面的程序使用
迭代器:
遵守可迭代协议,具有 __inte__方法的
创建一个迭代器 ==可迭代对象.__inte__()
使用迭代器 == 迭代器.__next__()
节省内存;惰性机制;一次性的,就是不能返回只能向下执行
装饰器本质上就是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象.
装饰器的应用场景:插入日志;性能测试;事务处理;缓存等等.
开放封闭原则:
对扩展开放,因为我们不可能在设计之初就已经想好了左右的功能并且未来不做任何更新和修改,所以我们必须允许代码扩展,添加新功能.
对修改封闭,因为我们写的一个函数,很有可能已经可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户.
装饰器完美的遵循了这个开放封闭原则.
形参的第三种:动态参数
动态参数分为两种:
1.动态接受位置参数;
注意:形参的顺序: 位置参数, 动态参数, 默认参数
动态接受参数的时候要注意:动态参数必须在位置参数后面
关键参数必须要放在位置参数后边
最终顺序:
位置参数>*args(动态位置参数)>默认参数>**kwargs(动态默认参数)
这四种参数可以任意的使用
命名空间分类:
1.内置命名空间-->存放python解释器为我们提供的名字,list,tuple,str,int这些都是内置命名空间
2.全局命名空间-->我们直接在py文件中,函数外声明的变量都属于全局命名空间
3.局部命名空间-->在函数中声明的变量会放在局部命名空间
加载顺序:
1 内置空间
2 全局空间
3 局部空间(函数被执行的时候)
取值顺序:
1 局部空间
2 全局空间
3 内置空间
作用域:
作用域就是作用范围,按照生效范围来看分为:全局作用域和 局部作用域
1.全局作用域:包含内置空间和全局空间,在整个文件的任何位置都可以使用(遵循 从上到下逐步执行)
2.局部作用域:局部空间
函数的嵌套:
1. 只要遇见了()就是函数的调用,如果没有()就不是函数的调用
2. 函数的执行顺序
gloabal , nonlocal
gloabal 表示 不在使用局部作用域中的内容了,二改用全局作用域中的变量
nonlocal 表示在局部作用域中,调用外层命名空间中的变量
import logging
logger = logging.getLogger('开发日志') #获取一个新的日志
formatter = logging.Formatter('%(asctime)s - %(name)s - [%(lineno)d] - %(message)s')
#定义了一个模板
ch = logging.StreamHandler() # 流 屏幕流,生成了一个屏幕流
fh = logging.FileHandler('tt.log','a',encoding='utf-8') #文件流 ,生成一个文件流
boss = logging.FileHandler('boss.log','a',encoding='utf-8') #文件流 ,生成一个老板看的日志
boss_formatter = logging.FileHandler('%(asctime)s - %(message)s')
ch.setFormatter(formatter)
#把咱们定义的模板绑定给咱们的创建的存储日志流
fh.setFormatter(formatter)
boss.setFormatter(boss_formatter)
#给自己又写了一个新的模板,然后绑定
logger.addHandler(fh)
#将文件流加入咱们的日志绑定
logger.addHandler(ch)
#将屏幕流加入咱们的日志绑定
logger.addHandler(boss)
logging.debug('你妹')
logging.info('你')
logging.warning('你大爷')
logging.error('你爸爸')
logging.critical('你爸爸的大爷')
推荐的方法:
不要看视频,看总结笔记,回忆,再自己写一遍,
抄代码,电脑上5遍,纸上再写5遍,要从临时记忆转到永久记忆,这样在以后有灵感的时候不会因为一激动就写不出逻辑严谨的代码了