python - 可迭代/迭代器对象、for循环原理、异常捕获

x33g5p2x  于2021-11-20 转载在 Python  
字(2.1k)|赞(0)|评价(0)|浏览(215)


可迭代对象/迭代器对象看完不迷糊回家不迷路!看完这篇for循环异常捕获也能get了!!!

可迭代对象与迭代器对象

  • 迭代:迭代的意思就是更新换代,每次的更新都必须依赖上一次的结果
  • 迭代其实给我们提供了一种不依赖索引取值的方式
  • 可迭代对象:
    内置有 _ _ iter _ _方法的都称为可迭代对象

有字符串、列表、元组、字典、集合、文件对象

  • 迭代器对象:
    内置有 _ _iter _ _ 方法,又含有 _ _next _ _方法称为迭代器对象
  • 文件本身即是可迭代对象,也是迭代器对象
  • 可迭代对象调用_ _iter _ _方法就会变成迭代器对象
  • 迭代器对象在执行_ _next _ _方法就相当于遍历了一次对象,遍历完再执行会出错
    实例如下:
# 列表举例
l = [1,2,3,4]
# 转换成迭代器对象
res = l.__iter__()
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
'''等于遍历了4次列表'''
# 如果再遍历一次就会出错
print(res.__next__())
#出错:StopIteration

# 区分开
l = [1,2,3,4]
# 这样用于取得就是第一个元素
print(l.__iter__().__next__())
print(l.__iter__().__next__())
print(l.__iter__().__next__())
print(l.__iter__().__next__())
print(l.__iter__().__next__())
print(l.__iter__().__next__())

for循环本质

  • 相当于迭代器执行了若干次双下next方法,但是有退出,不会报错
  • for循环结束python解释器会自动捕获错误,并退出
# 演示for循环的底层原理
'''从可以遍历>>>>>遍历结束不报错'''
l1 = [1,2,3,4,5,6,7,8,9,11,22,33,44,55]
# 要求:循环打印出列表中每个元素 但是不能使用for循环  __next__()
# 转换成迭代器对象
res = l1.__iter__()
# 没有自动捕获该错误并处理版本
#  while True:
#      print(res.__next__())

# 升级,可以正常退出
n = 0
while n<len(l1):
    print(res.__next__())
    n+=1

# 可以捕获异常,并处理
while True:
    try:
        print(res.__next__())
    except Exception:
        print('for循环结束')
        break

由上面可知,异常处理的重要性,推出下面的异常处理初始!

异常处理

调试Python程序时,经常会报出一些异常,异常的原因一方面可能是写程序时由于疏忽或者考虑不全造成了错误,这时就需要根据异常Traceback到出错点,进行分析改正;另一方面,有些异常是不可避免的,但我们可以对异常进行捕获处理,防止程序终止。

异常的组成:

  1. traceback
    翻到最下面从下往上的第一个蓝色字体鼠标左键点击即可跳转到错误的代码所在的行
  2. XXXError
    错误的类型
  3. 错误类型冒号后面的内容
    错误的详细原因(很重要 仔细看完之后可能就会找到解决的方法)

异常错误的分类:

  • 语法错误

  • 不被允许的 出现了应该立刻修改!!!
    实例如下:

if 1>2
for i in rage(10)
'''类似这种没有加冒号,缺胳膊断腿的操作属于语法错误'''
SyntaxError: invalid syntax
  • 逻辑错误

  • 可以被允许的 出现了之后尽快修改即可

  • 修改逻辑错误的过程其实就是在从头到尾理清思路的过程
    逻辑错误包括了名字错误,值错误等······

详细错误类型点这了解👉[错误类型说明书](内置例外 - Python 3.10.0 文档)

  • 结构:

  • try:

​ 有可能出错的代码体

except 错误类型 as e:

​ 出错后的应急机制

except 错误类型 as e:

​ 出错后的应急机制

注:可以嵌套多层,e是错误详细信息

  • 语法错误不能写入异常,老天爷来了也救不了语法错误!
    实例如下:
try:
    int('abc')
except NameError as e:
    print('变量名name不存在',e)
except ValueError as e:
    print('不是纯数字',e)
    
#结果
不是纯数字 invalid literal for int() with base 10: 'abc'
  • 万能异常模板

  • try:

​ 可能出错的代码

except Exception:

​ 捕获错误后输出的内容
实例如下:

# 现在在看for循环捕获异常的代码
l1 = [1,2,3,4,5,6,7,8,9,11,22,33,44,55]
res = l1.__iter__()
while True:
    try:
        print(res.__next__())
    except Exception:
        print('for循环结束,自动结束,不然会报错')
        break

异常捕获句式和万能异常
1.有可能会出现错误的代码才需要被监测
2.被监测的代码一定要越少越好
3.异常捕获使用频率越低越好

!!!!!祝各位在找bug的路上越走越远!!!!!

相关文章