装饰器加载顺序:自下而上
装饰器执行顺序:自上而下
yield 表达式:x=yield 然后用send() 将send中的值传递给yield 前的x
三元表达式:res=值1 if 表达式 else 值 2
列表生成式:[表达式 for iterm in list if 判断表达式]
字典生成式:{k:v for k,v in 元组 if 判断表达式}
集合生成式:{key for key in keys}
生成器:(i for i in range(10) if i>0)
sum(len(line) for line in f) 求文件字符数
递归的本质就是循环,但不应该无限调用下午,必须在某种条件下停止递归
一段代码循环运行的方式:用while true,函数递归
回溯:一层一层调下去
递推:结束递归调用,然后一层一层 返回去
算法:高效解决问题的方法
二分法:进行有序列表中的查找
找到列表中间的值
lamda 参数:表达式
map(函数,可迭代对象),函数可以是匿名函数,得到一个生成器
filter(函数,可迭代对象),返回为真的值
模块:一系列功能的集合体,分为三类:内置的模块,第三方的模块,自定义的模块
from .. import *
导入的模块默认有__all__变量
import xxx as x
导入模块的变量和方法的地址,注意看的是定义阶段,不管运行阶段
循环导入:指a导入b,b又通过其他导入a
尽量避免循环导入
不要导入为全局变量,导入成局部变量
import 导入查找的优先级问题:内存>>>>>>sys.path中>>>>>>
sys.modules,包含了所有的模块字典
sys.path 当模块在现在执行文件的下层或平级文件夹里面时,可以用sys.path.append()
模块建议结构:先定义全局变量,再定义类,再定义方法
":" 后跟提示信息, 可以用__annotations__查看
包: 包就是一个包含有__init__.py文件的文件夹
包是模块的一种形式,被当做模块使用
包是用来被导入的,不是为了运行的
导包时运行的是其下的__init__.py
环境变量都是以执行文件为准的,所有被导入的模块或者后续的其他文件引用的sys.path都是
参照执行文件的sys.path
包绝对导入需要注意的内容:
1.关于包相关的导入语句也分为import和from...import...两种,但是无论哪种,无论在什么
位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,
否则非法。可以带有一连串的点,如import顶级包.子包.子模块,但都必须遵循这个原则。
但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类
(它们都可以用点的方式调用自己的属性)。
2、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
3、import导入文件时,产生名称空间中的名字来源于文件,import包,产生的名称空间的
名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
相对导入: .代表当前文件所在的目录,..代表上一级目录,依此类推,.不能超出包的范围
包内导入推荐使用相对导入
__file__ 显示当前文件或文件夹的绝对路径
用os.path.dirname(文件/文件夹),获取该文件和文件夹的父文件夹,给一个变量后,
可以固定住该变量供其他变量使用