可迭代对象与迭代器

迭代

迭代其实就是更新换代,也就是将每次执行的结果作为下次执行的初始值,也就是必须依赖于上次执行的结果


    # 单纯的循环并不是迭代
      i = 0
      while True:
          print(i)

    # 每次迭代都必须基于上次的执行结果
      i = 0
      while True:
          if i <= 10:
              print(i)
              i += 1
          else:
              print('活干完了,老小子!!!')
              break

迭代取值

这里用while循环模拟对字符串的迭代取值

      tuple1 = (1, 2, 3, 4, 5, 6)
      n = 0
      while n < len(tuple1):
          print(str1[n])
          n += 1

可迭代对象


'''
1. 可迭代对象的特征
    内置有__iter__方法的都是可迭代对象

2. 可迭代对象的数据类型
    字符串、列表、字典、元组、集合、文件
    其实可迭代对象就是支持迭代取值的类型,提供了不依赖与索引取值的取值方式
'''

迭代器对象

'''
    1. 可迭代对象调用__iter__方法之后的结果就是迭代器对象
    2. 迭代器对象同时含有 __iter__和__next__方法的数据
    3. 迭代器对象能够节省存储空间,不需要的时候不会迭代,需要的时候可以迭代出很多数据
    4. 用__next__方法进行取值(取值结束会报错)
    5. 有了迭代器对象以后才有针对字典和集合的迭代取值操作
补充:
    1. 双下加方法名一般都有两种写法,但是并不是所有都是
    2. 有些可迭代对象本身就是迭代器对象:文件
    3. 可迭代对象多次调用__iter__方法之后的结果还是迭代器对象(只有第一次调用有作用)
    4. 迭代取值:
    (1)可迭代对象
            str1 = 'oliver'
        可迭代对象的多次迭代取值相当于每次都产生一个新的对象再迭代
            print(str1.__iter__().__next__())  # o 每次先产生一个新的迭代器对象然后取值
            print(str1.__iter__().__next__())  # o 每次先产生一个新的迭代器对象然后取值
            print(str1.__iter__().__next__())  # o 每次先产生一个新的迭代器对象然后取值
            print(str1.__iter__().__next__())  # o 每次先产生一个新的迭代器对象然后取值
    (2)迭代器对象
        迭代器对象的多次迭代取值是对同一个对象进行多次迭代
            res = str1.__iter__()  # 已经变成迭代器对象了
            print(res.__iter__().__next__())  # o  之后再调用还是自身
            print(res.__iter__().__next__())  # l
            print(res.__iter__().__next__())  # i
            print(res.__iter__().__next__())  # v
'''

for循环原理


# for循环的while实现
      l1 = [11, 22, 33, 44, 55, 66, 77, 88]
      res = l1.__iter__()
      n = 0
      while n < len(l1):
          print(res.__next__())
          n += 1

# for循环的底层步骤
'''
      for i in 可迭代对象:
          循环体
      步骤:
          1. 先将可迭代对象调用__iter__()变成迭代器对象
              for循环取值多次调用同一对象的原因
          2. 针对可迭代对象调用__next__()迭代取值
              for循环每次取值都取下一位的原因
          3. 当迭代器对象内的值取完,报错结束循环
      '''

# for循的迭代器实现
      l1 = [11, 22, 33, 44, 55, 66, 77, 88]
      res = l1.__iter__()
      while True:
          print(res.__next__())

异常处理


'''
1. 异常的定义
    代码运行过程中出现错误就是代码异常,出现异常会导致代码直接终止
    
2. 异常信息的介绍
    (1) line n 所在的一行说明异常出现在第n行,并且line关键字前面的蓝色字体可以直接定位错误位置
    (2) ……Error是指异常类型
    (3) ……Error冒号后跟的是异常原因

3. 异常的分类
    (1)语法异常:低级错误不被允许,出现立刻改正
        基本的结构错误
    (2)逻辑异常:被允许,不过要尽量避免,出现尽快修改
        eg:字符串调取其他类型的内置方法

4. 异常的类型
    (1)变量名异常  NameError
    (2)索引异常  IndexError
    (3)键异常  KeyError
    (4)值异常  ValueError
     ………………………………………………………………
'''

异常处理语法结构

'''
1. 异常处理就是针对可能出现的错误,用一定的方法避免异常导致程序终止

    基本语法结构
    try:
        可能异常的代码
    except 异常类型A as a:  # a是出该类型错误的提示信息
        处理异常A的措施
    except 异常类型B as b:  
        处理异常B的措施
    except 异常类型C as c:
        处理异常C的措施
        

2. 万能语法结构
    try:
        可能异常的代码
    except Exception as e:  # Exception可以接受所有的异常类型
        处理所有异常的措施
    
    
3. 使用异常处理的准则
    1. 异常处理检测的代码越少越好
    2. 异常处理的使用次数越少越好


4. 异常处理(了解内容)
(1) try + else
    被try检测代码没有异常,正常执行完执行else的子代码
    
    try:
        可能异常的代码
    except Exception as e:  # Exception可以接受所有的异常类型
        处理所有异常的措施
    else:
        不出错之后执行的子代码
    
    
(2) try + finally
     无论被检测代码是否出错,最后都会执行finally的子代码
    try:
        可能异常的代码
    except Exception as e:  # Exception可以接受所有的异常类型
        处理所有异常的措施
    finally:
        无论被检测代码是否异常,最后都执行的子代码
    
(3) try + else + finally
    try:
        可能异常的代码
    except Exception as e:  # Exception可以接受所有的异常类型
        处理所有异常的措施
    else:
        不出错之后执行的子代码
    finally:
        无论被检测代码是否异常,最后都执行的子代码

(4) 断言
    name = 'jason'
    assert isinstance(name,str)

(5) 主动报错
    raise 报错类型(错误内容)
    raise NameError('不爽 就要作!!!')
'''

for循环底层结构

    str1 = 'oliver'
# 1. 先把可迭代对象变成迭代器对象
    res = str1.__iter__()
    res = iter(str1)
# 2. 迭代取值
    while True:
        try:  # 检测代码是否异常
            print(res.__next__())
        except Exception as wrong:
            break  # 接收到异常直接终止循环运行,执行结束

索引取值与迭代取值

'''
      1. 索引取值
          优点:可以反复取相同的元素,取值可以倒退,随意间隔
          缺点:只支持列表等有序数据类型,兼容性较低
      2. 迭代取值
          优点:支持所有的容器类型数据,兼容性好
          缺点:取值顺序和方向固定,无法重复取值
      3. 迭代器取值
          迭代器取值时迭代器里的数据取一个少一个,取完就空了
'''

迭代器结束

posted @ 2022-03-23 20:46  Oliver-Chance  阅读(321)  评论(0编辑  收藏  举报