一、迭代器和生成器
1、迭代器
(1)认识迭代器(iter)
迭代器是容器,可以同时保存多个数据
迭代器无法直接创建,只能将其他的序列转换成迭代器【iter()】
(2)迭代器的特点
a.打印迭代器无法查看元素,也不支持len操作
b.如果要使用迭代器中的元素,必须将元素从迭代器中取走,而且取一个就少一个 每次之恩那个获取最前面的元素
(3)查 → 获取元素
注意:不管以什么方式获取到了迭代器中的元素,对应的元素都会从迭代器中消失
a.获取单个元素:next(迭代器)
b.遍历:for 变量 in 迭代器:
2、生成器
(1)什么是生成器
生成器是容器,是一种可以创建多个数据的容器
生成器真正保存的不是数据,而是创建数据的方法
打印生成器无法看到元素;也无法通过len统计个数
生成器只会在需要数据的时候去创建数据,而且数据生成一个就少一个
(2)创建生成器
调用带有yield关键字的函数就可以得到一个生成器
生成器获取数据的方式和迭代器一致
如果函数体中带有关键字yield,调用函数的时候不会执行函数体,也不会获取函数 返回值
(3)怎么控制生成器产生数据的个数和值
生成器能创建多少个数据就看执行创建生成器的函数体的时候会遇到几次yield,每 次遇到yield的时候yield后面的值就是可以创建出来的数据
def func1():
for x in range(5):
yield x ** 2
a1 = func1()
print(list(a1))
二、模块
python中一个py文件就是一个模块
1、如果在一个模块中使用另外一个模块的内容
(1)被使用的模块名必须符合变量名的要求
(2)被使用的模块中的内容必须要导入后才能使用
2、如何导入模块
(1)import 模块名 → 导入指定模块,导入后可以通过‘模块名.xxx.’的方式使用这个模块中 的所有内容
(2)import模块名 import 内容1,内容2,内容3,... → 导入指定模块,导入后可以直接使用模块 中指定的内容
(3)import模块名 import * → 导入指定模块,导入后可以直接使用模块中所有的内容
(4)import模块名 as 新模块名 → 导入的模块的时候对模块的重新命名(导入指定模块, 导入后可以通过‘新模块名.xxx’的方式使用这个模块中的 所有内容)
3、导入模块原理
不管以任何方式导入模块,导入模块的时候都会自动执行这个模块中所有的代码
放在if语句里面的代码在被别的模块导入的时候不会执行
if __name__ == '__main__':
pass
三、包
1、什么是包
包的本质是文件夹
包含__init__.py文件的文件夹就是包(用来保存py文件的的文件夹叫包)
2、怎么使用包或者文件夹中的模块的内容(怎么导入包)
(1)import 包名 → 导入指定包,导入后可以通过‘包名.xxx’的方式使用包中__init__.py文件
(2)import 包名.模块名
(3)from 包名 import 模块名1,模块名2,…
from 包名 import 内容1,内容2,…
(4)from 包名.模块名 import 内容1,内容2,…
四、异常捕获
执行程序的时候如果出现异常(报错),程序会直接终止执行
1、捕获异常
捕获异常就是让程序出现异常的时候,程序不报错还可以继续执行
2、什么时候异常捕获:
程序员写代码的时候知道某个位置可能会因为使用方法不对导致程序报错,但是又希望如果是操作不当出现异常的时候程序又可以继续执行
3、怎么获取异常
语法1:
(1)语法:
try:
代码段1(需要捕获异常的代码)
except:
代码段2(捕获到异常以后需要执行的代码)
(2)执行过程:
先执行代码段1,如果没有出现异常,不会执行代码段2,直接执行后续其他代 码;如果出现异常,马上执行代码段2(代码段1后面还没来得及执行的部分不执行) 再执行后续其他代码
语法2:→ 捕获指定类型的异常
try:
代码段1(需要捕获异常的代码)
except 异常类型:
代码段2(捕获到异常以后需要执行的代码)
语法3:→ 同时捕获多种异常
try:
代码段1(需要捕获异常的代码)
except (异常类型1,异常类型2,异常类型3,…):
代码段2(捕获到异常以后需要执行的代码)
语法4 → 同时捕获多种异常,针对不同的一场做相同的处理
try:
代码段1(需要捕获异常的代码)
except 异常类型1:
代码段2(捕获到异常以后需要执行的代码)
except 异常类型2:
代码段3(捕获到异常以后需要执行的代码)
except 异常类型3:
代码段4(捕获到异常以后需要执行的代码)
4、关键字finally
异常捕获的时候可以在上面每一个语法结构的最后添加finally
try:
代码段1(需要捕获异常的代码)
except:
代码段2(捕获到异常以后需要执行的代码)
finally:
代码段
finally的存在不会影响原来代码结构的执行,finally后面的代码不管前面发生了什么都会执行