python迭代器与异常处理
python迭代器与异常处理
昨日内容回顾
1. 三元表达式
值1 if 条件(函数) else 值2
条件成立使用前面的值1,不成立使用值2
ps:if分支的罕见写法
子代码只有一行时,可以并列书写
if name == 'eason':print('123')
else:print('321')
2.列表生成式(必会)
res = [i**2 for i in range(10) if i != 4]
变量名 = [条件满足后执行 for 值 in range(10) if 值 条件]
3.字典生成式
res = {i:i**2 for i in range(10) if i!=4}
变量名 = {k:满足条件的值 for 值 in range(10) if 条件}
4.集合生产式
res = {i for i in range(10) if i!=4}
变量名 = {条件满足添加值 for 值 in range(10) if 条件}
5.匿名函数
没有函数名的函数,使用方法简单,不使用def定义,而是使用lambda 定义函数
只会获得一个返回值使用
lambda()
匿名函数与内置函数的结合使用:
'''
max()
min()
sorted()
map():
reduce()
filter()
# 匿名函数作为参数
def func(x, y, func):
print(x, y)
print(func)
s = func(x, y)
print(s)
# 调用func
func(1, 2, lambda a, b: a + b)
常见重要的内置函数
1.map函数
映射:将数据集基于相同的情况转换
2.zip函数
拉链:将多个数据集按照位置对应整合
3.filter函数
过滤:依据条件筛选数据
4.reduce函数
归总:将元素根据条件进行归总成一个
忘记某个函数的使用方法时,灵活使用ctrl+?查看函数内部提示
常见内置函数补充
1.abs() 绝对值
2.all() 所有元素必须是True结果才为True
3.any() 所有元素必须是False结果才为False
4.bin() 二进制 oct() 八进制 hex() 十六进制
5.callable() 判断当前当前对象是否可以加括号调用
6.chr() 数字转换英语 ord() 英语转换数字
7.dir() 获取当前对象内部可以调用的属性(方法)
8.divmod() 先整除,后取余,适合做分页器
9.enumerate() 枚举,给元素加上编号start控制起始
10.eval()低配识别代码,exec()高配识别代码.
今日学习内容
常见内置函数补充
1.help() 查看内部注释信息
2.id() 返回内存地址
3.int() 转换整形
4.isinstance() 判断数据类型
print(isinstance('eason', str)) True
print(isinstance('eason', int)) False
5.pow() 幂指数
6.round() 四舍五入,第一个参数留需要被执行的数字,第二位数写需要保留的小数部分
7.sum() 求和
可迭代对象
迭代概念:每一次改变都根据上一次的结果,更新换代
游戏的更新就是版本的迭代,需要根据版本修改下次版本
迭代取值
a = 0 # 设置计数器
list = [1,2,3,4,5]
while a > len(list):
print(l1[a]) # 根据当前计数器值打印
a += 1 # 每次打印完,计数器加1
每次打印都会根据上一次的结果,完成下一步的操作
数据类型的内置方式中有__iter__方法的都可以称为可迭代对象
可迭代对象有字符,列表,字典,元组,集合,文件,特殊函数。
可迭代对象其实就是为了后续迭代取值做准备
提供了不依赖于索引取值的方式
迭代器对象
可迭代对象:
(字符,列表,字典,元组,集合,文件,特殊函数)进行__iter__方法后生成的结果,就是迭代器对象
特征:
内置方法有__iter__和__next__方法
文件本身就是迭代器对象
迭代器概念:
内部含有多个数据的数据集,你需要时按照要求取出来给你,主要为了节约资源
迭代器取值:
调用__next__方法即可,但是该方法调用完数据会报错
所以有了for。
迭代器补充说明:
常见简便写法
__iter__ iter()
__next__ next()
print(变量名.iter())
print(变量名.next())
可迭代对象调用一次__iter__方法编程迭代器对象,如果继续调用 结果还是迭代器对象本身
如果需要继续取值,需要在__iter__后使用__next__
for循环内部原理
for循环底层原理
for 变量名 in 可迭代对象:
循环体代码
1.会将in后面的数据调用__iter__()变成迭代器对象
为什么文件对象也可以for循环 因为本身就是迭代器对象 再次调用不变
2.针对产生的迭代器对象依次调用__next__()方法迭代取值
3.当值取完之后 会自动处理报错并退出循环
这就需要我们了解,怎么手动处理报错
异常处理
概念:
代码运行出错然后报错就是异常,异常会导致程序立刻停止。
异常报错信息组成:
错误的地址
Traceback (most recent call last):
File
"文件地址和报错的句子", line 行数, in <module>
name
报错的类型:报错的原因(解决方法)
NameError: name 'name' is not defined
异常的分类
1.语法异常,严重错误,必须立刻改正
2.逻辑异常,一般错误,尽快修改即可,代码获取到数据类型不相匹配等······
改bug十分消耗脑力,请勿打扰正在改bug的同学,否则会挨揍。
常见的异常类型
1.NameError 名字错误(变量名未定义)
2.IndexError 索引错误(超出索引值)
3.KeyError 键错误
4.ValueError 值错误
5.TypeError 类型错误(不满足某些特定类型的要求)
异常处理操作与措施
未对异常进行处理操作或应对措施,正常情况下,程序会直接停止运行。
应对措施关键词:try
语法结构:
try:
可能会出错的代码
except 错误的类型 as e: e会打印出错误的提升信息
可添加多行,多种错误类型,类似if else分支
万能异常:常见的报错都可以照单全收
try:
可能会出错的代码
except Exception as e:
统一的处理措施
异常处理使用准则:目标越少越好,用的越少越好
异常处理扩展
1.结合else使用
当try检测的代码没有发生异常 正常运行完毕之后执行else的子代码
try:
可能会出错的代码
except Exception as e:
统一的处理措施
else:
可能会出错的代码没有出错 最后走else子代码
2.结合finally使用
无论try检测的代码是否有异常 最后都会执行finally子代码
try:
name
except Exception as e:
print(e)
finally:
无论try检测的代码是否有异常 最后都会执行finally子代码
3.全部整合到一起使用
try:
name
except Exception as e:
print(e)
else:
print('没报错执行')
finally:
print('不管报错与否,正常执行')
4.断言(了解中的了解)
name = 'eason'
assert isinstance(name,str)
5.主动报错(需要掌握)
raise NameError('错误')
'''由于是主动报错 所以可以非常明确的知道错误的类型'''
for循环的本质
利用while循环取值完后,利用异常处理措施,完成完整的for循环的功能
# 1.先转换成迭代器对象
# res = info.__iter__()
res = iter(info)
# 2.迭代取值
while True:
# print(res.__next__())
try:
print(next(res))
except StopIteration as e:
# 结束while循环
break
迭代取值与索引取值的对比
索引取值
优势:可以反复获取相同元素,没有固定方向
劣势:只支持有序的容器,无序不行(字典等)
迭代取值
优势:容易数据类型都可以使用
劣势:取值顺序拥有是从左往右,并且无法重复获取数据,获取一个少一个
for循环还是比底层迭代取值更加好用
今日小结
聪明分两种,学得快和记得多。不将学的快的知识记住,往往是记得多的后来居上。

浙公网安备 33010602011771号