zoukankan      html  css  js  c++  java
  • 🍖迭代器

    一.什么是迭代器

    • 器 : 工具

    • 迭代 : 是一个重复的过程, 但不是单纯的重复, 每次重复都是基于上一次的结果而进行的

    • 迭代器 : 迭代取值的工具

    ⛅迭代
    l={'x':1,'y':2}
    n=0
    while n < len(l):
        print(l[n])
        n+=1
    

    二.为何要使用迭代器

    • 为了找到一种通用的迭代取值方案
    • 为了节省内存

    三.可迭代对象 (iterable)

    • 在python中,但凡内置有 __iter__ 方法的对象,都是可迭代的对象

    • 但凡调用了 __iter__方法, 就会将该类型转换成迭代器对象

    ⛅以下这些类型都内置"__iter__"方法
    str1='hello'
    list1=[1,2,3]
    tup1=(1,2,3)
    dic={'x':1}
    s1={'a','b','c'}
    f=open('a.txt','w',encoding='utf-8')
    

    四.迭代器对象 (iterator)

    • 内置有__next____iter__ 方法的对象, 就是迭代器对象
    • 可迭代对象执行__iter__得到的返回值就是迭代器对象
    dic={'x':1,'y':2,'z':3}
    iter_dic=dic.__iter__()       # 获取迭代器版本
    print(next(iter_dic))         # 每次取出一个值 x
    print(next(iter_dic))         # y
    print(next(iter_dic))         # z
    print(next(iter_dic))         #只有三个值,第四次报错
    
    s1={'a','b','c'}
    iter_s1=s1.__iter__()         # 获取迭代器版本
    print(next(iter_s1))          # 每次取出一个值 a
    print(next(iter_s1))          # b
    print(next(iter_s1))          # c
    print(next(iter_s1))          #只有三个值,第四次报错
    
    list1=[1,2,3]
    iter_list1=list1.__iter__()   # 获取迭代器版本
    print(next(iter_list1))       # 每次取出一个值 1
    print(next(iter_list1))       # 2
    print(next(iter_list1))       # 3
    print(next(iter_list1))       #只有三个值,第四次报错
    .......
    ....
    

    五.可迭代对象 迭代器对象

    1.可迭代对象

    str,list,tuple,dict,set,file
    
    • 获取可迭代对象的方式
    无需获取, Python内置的 (str,list,tuple,dict,set,file) 都是可迭代对象
    
    • 特点
    内置有"__iter__"方法的都叫可迭代的对象,执行该方法会拿到一个迭代器对象
    

    2.迭代器对象

    ps : 文件本身就是迭代器对象
    
    • 获取迭代器的方式
    执行可迭代对象"__iter__"方法, 拿到的返回值就是迭代器对象
    
    • 特点
    内置有"__next__"方法, 执行该方法会拿到迭代器对象中的一个值
    内置有"__iter__"方法, 执行该方法会拿到迭代器本身---->为了让 "for" 循环的设计更简单
    

    3.文件本身就是迭代器对象

     f=open('a.txt','w',encoding='utf-8') 
     print(f.__next__())  # 直接可以调用 "__next__" 方法
    

    六.迭代器的优缺点分析

    1.优点

    • 提供了一种不依赖于索引的通用迭代取值方案
    • 惰性计算, 节省内存 (需要值, next 一下)
    l=[1,2,3,4,4,5,5,6,6,6,6,6,6,6,6,6]
    iter_l=l.__iter__()
    print(iter_l)
    print(iter_l.__next__())         # 1
    
    l=open('a.txt','r',encoding='utf-8')
    iter_l=l.__iter__()
    while True:
        try:                          # 捕捉异常
            print(iter_l.__next__())  # 循环取值, 每次内存中只有一行
        except StopIteration:         # 遇到此异常(没值了)
            break                     # 结束循环
    

    2.缺点

    • 取值麻烦, 只能一个一个取, 只能往后取
    • 无法预测值的长度
    • 并且是一次性的
    x=[1,2,3]
    iter_x=x.__iter__()               # 获得迭代器对象
    while True:
        try:
            print(iter_x.__next__())  # 循环取值
        except StopIteration:
            break 
            
    print('第二次取值尝试======》')     # 这里无法第二次取值,迭代器的值已经被取完
    iter_x=x.__iter__()                # 需要重新获取迭代器
    while True:
        try:
            print(iter_x.__next__())
        except StopIteration:
            break
    

    七. For 循环原理分析

    • For 循环被称为迭代器循环,in后跟的必须是可迭代对象

    • For 循环会执行 in 后面可迭代对象的 __iter__ 方法, 拿到迭代器对象

    • 然后调用迭代器对象的 __next__ 方法,拿到一个返回值赋值给 line,执行一次循环体

    • 周而复始, 直到取值完毕, For 循环会检测异常自动结束循环

    l=open('a.txt','r',encoding='utf-8')
    for line in l:  #iter_l=l.__iter__()
        print(line)
    l.close()
    
    for item in {'x':1,'y':2}:
        print(item) 
    

    事实并非理所当然 世界总是欲盖弥彰

  • 相关阅读:
    scala学习笔记4:函数和闭包
    架构模式: 领域事件
    架构模式:API组合
    架构模式: Saga
    架构模式: 客户端 UI 构建
    架构模式: 服务器端页面碎片化元素构建
    架构模式: 记录部署和变更日志
    架构模式: 健康检查API
    架构模式: 异常追踪
    架构模式:分布式跟踪
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14103029.html
Copyright © 2011-2022 走看看