10.15 迭代器,生成器到常用模块的小结
闭包函数
把函数和变量一起打包拿出去了
装饰器
不改变函数体代码,并且不改变函数调用方式,他本质就是一个函数
装饰器也可以完善装饰器
三层装饰器
迭代器
迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象
可迭代对象
具有__iter__
方法的对象(python中一切皆对象)
迭代器对象
具有__iter__
和__next__
方法的对象
三元表达式
列表推导式
字典生成式
生成器
自定义的迭代器,有yield关键字的函数只要调用,这个调用后的函数就是生成器
yield
接收函数的返回值,但是会继续执行函数代码
return
接收函数返回值,但是会终止函数
递归
本质上就是函数调用函数本身,必须得有结束条件,并且在递归的过程中,问题的规模必须不断缩小
匿名函数
匿名函数使用一次就失效了,一般不单独使用,与max最大值/min最小值/sorted排序/map映射/filter过滤连用
内置函数
面向过程编程
类似于工厂的流水线,机械式的一步一步完成一个项目,把完成步骤具体细分,这样步骤与步骤之间互不干涉
优点:条理清晰
缺点:扩展性差,只要一个步骤错,项目就崩溃
模块的四种形式
为什么要有模块
让代码变得更加简洁,清晰,模块化
一个模块里有多个函数,相当于一个大功能细分成多个小功能
- 自定义模块
- 第三方模块
- 内置模块
- 包
import和from...import
import time
1.打开time文件
2.使用python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间
3.test.py中会有一个time的变量指向time模块的名称空间,如果导入方式为`import time as t`,则就是t变量指向time模块的名称空间
from time import sleep
1.打开time文件
2.使用python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间
3.test.py中会有一个sleep变量指向time模块名称空间中的sleep,如果导入方式为`from time import sleep,localtime`,则是由一个sleep变量和一个localtime变量指向time模块的名称空间中的sleep和localtime.
循环导入问题
为什么会有循环导入问题
- m1文件需要导入m2文件的y
- m2文件需要导入m1文件的x
- 代码自上而下运行,m1需要m2的y,然后会去m2的名称空间找到y,但是找y前,需要运行m2的代码,m2的代码第一句是去m1找x,然后又回去运行m1的代码,m1的第一行代码又是去m2找y
- 就是说m1只能运行第一行,m2也只能运行第一行,所以出现了循环导入问题
解决方案一
把导入文件的代码放到最后面
但是这样需要对所有变量都这样做,才能解决问题,所以治标不治本
解决方案二
把导入文件写入函数中
名字的执行顺序:内置(python解释器启动的时候)→全局(文件执行的时候)→局部(函数调用的时候)
借助执行顺序,可以避免循环导入问题
模块的搜索路径
内存→内置模块→环境变量
python文件的两种途径
- 文件模块,被当做模块给导入,有多个
- 运行文件,被当做执行文件执行,只能有一个
.
搜索路径以执行文件为准
## m1.py
def f1():
print('f1')
f1()
## test.py
import m1
m1.f1() #会运行两次
__name__
## m1.py
def f1():
print('f1')
if __name__ == '__main__': # __name__在m1.py文件被当做模块导入时是模块名,做为执行文件时是'__main__`
f1()
## test.py
import m1
m1.f1() #会运行两次
编译python文件(了解)
为了提高加载模块的速度(提高的是加载速度,不是运行速度)
包
模块太大,合理分配模块的函数
所以得用文件夹管理,文件夹命名为m1,导入m1就是导入m1中的__init__
软件开发目录规范
为了提高 程序的可读性和可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要,简而言之就是把软件代码分文件目录.
time模块
打印三种不同形式的时间,时间戳/格式化时间/结构化时间
datetime模块
时间的加减
random模块
随机数
os模块
与操作系统交互,多用于文件操作
sys模块
与python解释器交互,多用于环境变量的配置
json模块
序列化
把数据从内存读入硬盘(以json格式)
反序列化
把数据从硬盘读入内存(以json格式)
平台性质
可以跨平台可以序列化dict/list/int/float/bool/None数据类型
pickle模块
序列化
把数据从内存读入硬盘(以pickle格式,二进制形式)
反序列化
把数据从硬盘读入内存(以pickle格式,二进制形式)
平台性质
无法跨平台,但是可以序列化python的任意数据类型
hashlib模块
加密
hmac模块
加盐加密
logging模块
日志模块
步骤
创建logger对象
创建handler对象
创建formatter对象
把formatter绑定到handler对象上
把handler对象绑定到logger对象上
设置级别
测试
numpy模块
多维数组的运算
pandas模块
处理表格/json文件等,数据库
matplotlib模块
数据可视化
re模块
正则表达式,从文本中匹配特定的内容
typing模块
导入python的数据类型
collections模块
是python内建的一个集合模块,提供了许多有用的集合类
pathlib模块(了解)
是python的内置库
shutil模块(了解)
文件的压缩与解压缩,文件的拷贝
xml模块(了解)
类似于json模块,做不同程序间的数据交互
subprocess模块(了解)
运行子程序,即运行linux命令