day 13 迭代器和模块
迭代器
迭代器是容器型数据类型
无法查看一个迭代器中的所有元素,也无法通过len获取元素个数
如果想要使用迭代器中元素,必须将元素从迭代器中取出,从上往下按顺序取出,取出的数据无法放回迭代器
创建迭代器
1)用iter将其他序列转换成迭代器
2)创建生成器
i1=iter('123')
print(i1)
i2=iter([1,2,3,4,5])
print(i2)
迭代器的查操作
被获取到的元素一定会从迭代器中消失
1)获取单个元素:next(迭代器)
当迭代器中的元素都被取出之后,再进行取出,报错
2)遍历
for i in 迭代器:
print(f'i:{i}')
3)迭代器转换成序列
i3=iter('hello')
result=list(i3)
print(result) # ['h', 'e', 'l', 'l', 'o']
生成器
生成器是容器型数据类型(具备创建多个数据的能力,而不是保存数据的能力)
打印生成器无法查看所有元素,不支持len操作查看元素个数
生成器获取数据的方式和迭代器一样:next(),遍历
创建生成器
生成器保存的是产生数据的算法
调用带有yield关键字的函数,就可以得到一个生成器
生成器创建数据的个数和数据的值与执行函数体中遇到的yield的次数和yield后面的值有关
def func2():
yield 100
yield 200
yield 300
gen2=func2() # 3个yield,生成器的数据分布是100,200,300
print(next(gen2)) # 100
print(next(gen2)) # 200
print(next(gen2)) # 300
def func3(subject):
for i in range(1,100):
yield f'{subject}{i:0>3}' # 出现99次yield yield后面的值为生成器的元素
gen3=func3('python')
for i in gen3:
print(f'i:{i}')
生成器产生数据的原理
调用函数创建生成器的时候不会立刻执行函数体,获取生成器中的元素才会执行函数体
每次再执行函数体的时候从开始位置开始,执行到yield就停止,并将yield后面的数据作为获取到的元素,获取下一次生成器的元素,从yield后面开始
模块
模块:python中的一个py文件就是一个模块
被使用的模块的模块名(py文件的文件名)必须符合变量名的要求
使用钱必须先导入,被导入的模块使用的内容只能是模块中的全局变量
导入模块的方法
import 模块名
-导入指定模块,通过模块名.变量名
的方式使用模块中的全局变量
from 模块名 import 变量1,变量2,...
–导入指定模块中的指定变量,导入后直接使用指定变量
from 模块名 import *
--导入指定模块中的所有变量,导入后直接使用变量
拓展:* 号在导入模块的时候,默认为所有模块
import 模块名 as 新模块名
–导入模块的时候对模块进行重命名操作,导入后使用新模块名.变量名
进行使用变量
from 模块名 import 变量1 as 新变量名1,变量2 as 新变量名2
–导入模块的时候对变量进行重命名操作,导入后之间使用新的变量名进行使用
重命名操作用as
导入模块的原理:
导入模块的时候,系统会全部执行导入模块中的全部内容
存在的问题:可以会在导入模块的时候,执行一些没有必要执行的操作
导入模块的时候选择性执行代码:
在被导入的模块中加入一个if语句
if __name__=='__main__'
,将不需要执行的其他内容放里面
包
包就是包含__init__.py
文件的文件夹,包可以看作一个文件夹,模块放在文件夹中,其中有一个模块叫做__init__.py
的模块
作用:管理py文件,对py文件按照特定的方式进行分类
使用包中的内容
import 包名
–必须是包的名字, 文件夹无意义.导入后使用包名.模块名
使用__init__.py
模块中的变量
import 包名.模块名
–直接导入包中的模块.使用包名.模块名.变量名
使用,可以进行重命名操作
from 包名 import 模块名1,模块名2,...
-直接导入包中的模块名,直接使用模块名.变量名
from 包名.模块名 import 变量1,变量2,...
直接导入包中的模块中的变量,直接使用变量名
包中还有包,包名用.
隔开
异常捕获
异常就是错误,如果出现异常,会中断程序的执行(让程序提前结束,非正常结束)
exit() -退出,正常结束
异常捕获-当程序出现异常的时候,不会崩溃,不会闪退,还可以接着往后执行
结构1-捕获所有异常
try:
代码段1(需要捕获异常的代码段)
except:
代码段2(捕获到异常之后需要执行的代码段)
结构2-捕获指定类型的异常,只有捕获的指定的异常类型才会执行立刻马上执行代码段2, 其他类型错误会正常报错
try:
代码段1
except 异常类型:
代码段2
结构3–同时捕获多种异常
try:
代码段1
except(异常类型1,异常类型2,…):
代码段2
结构4-捕获到异常后的操作不一样
try:
代码段1
except 异常类型1:
代码段11
except 异常类型2:
代码段22
try:
print('abc'[1])
print('abc'[4]) # 出现异常,后面的代码不执行,立刻跳转except代码
print('abc'[2])
except:
print('捕获异常')
print('程序结束')
'''
运行结果:
b
捕获异常
程序结束
'''
try:
age=int(input('请输入年龄:'))
if age>=18: # 判断条件写在try 里面, 输入正确才会执行判断
print('成年')
else:
print('未成年')
except:
print('年龄输入错误!')