zoukankan      html  css  js  c++  java
  • Python—day13 迭代器、迭代器对象、for循环对象、生成器、枚举对象

    一、迭代器

    1、迭代器概念:
    器:包含了多个值的容器
    迭代:循环反馈(一次从容器在取出一个值)
    迭代器:从装有多个值的容器在一次取出一个值
    
    ls=[3,5,7,1,9]
    遍历:被遍历的对象必须是有序容器
    i=0
    while i<len(ls):
        print(ls[i])
        i+=1
    输出结果 3       5       7      1      9   属于无序输出
    
    输出的是有序的
    
     st={1,2,3,4,5}
    dic={'a':1,'b':2}
    2、可迭代对象概念:
    对象:python中的一个对象(装有地址的变量)
    可迭代对象:该对象有_iter_()方法,调用该方法返回迭代器对象
    有哪些:str | list | tuple | dict | set | range() | file | 迭代器对象 | enumerate() | 生成器
    
    
    [].__iter__()
    ().__iter__()
    {}.__iter__()
    {1,}.__iter__()
    可迭代对象调用_iter_()方法得到迭代器对象
    

      

    二、迭代器对象


    1、迭代器对象
    迭代器对象就可以做到不依赖索引取值(一次从容器中取出一个值)
    迭代器对象都有_next_()方法,且通过该方法获取容器中的值,获取规则,从前往后一次一个
    有哪些:file | enumerate() | 生成器

    重点:
    1.从迭代器对象中取元素,取一个少一个,如果要从头开始去,需要重新获得拥有所有元素的迭代器对象
    2.迭代器对象也有__iter__()方法,调用后得到的是自己本身(当前含义几个元素,得到的就只有几个元素的迭代器对象)

     可迭代对象
    st1={3,5,7,1,9}
    迭代器对象
    iter_obj=st1.__iter__()
    print(iter_obj)  #  输出结果为集合内存地址 <set_iterator object at 0x00000222E39FC1B0>
    
    print([1,2,3].__iter__())  #  输出结果为列表内存地址 <list_iterator object at 0x0000021FC2EB7780>
    重要的点
     迭代器对象取一个值就少一个值
    print(iter_obj.__next__())  # 输出  1
    print(iter_obj.__next__())   # 输出  3
    print(iter_obj.__next__())   # 输出  5
    print(iter_obj.__next__())   # 输出  7
    print(iter_obj.__next__())   # 输出  9
    
    print(iter_obj.__next__())   # 抛出异常StopIteration,可以通过 try  对异常进行捕获并处理
    
    iter_obj=st1.__iter__() #上一个迭代器对象迭代取值完毕后,就取空了,如果再次取值
    案例:
    for
    v in 'abc'.__iter__(): print(v) # 输出:a b c for v in 'abc'.__iter__(): print(v) # 输出:a b c print('================================') for k,v in{'a':1,'b':2}.items(): print(k) # 输出结果为a b print(k,v) # 输出结果为 a 1 # b 2 print(v) # 输出结果为1 2 print('================================') r_obj=range(10) for v in r_obj: print(v) # 输出0 1 2 3 4 5 6 7 8 9 print('================================') with open('abc.txt','r',encoding='utf-8') as f: print(f.__next__()) print(f.__next__()) print(f.__next__())
    迭代器对象不能求长度(内部值(元素)的个数)
    
    while True:
        try:
            ele=iter_obj.__next__()
            print(ele)
        except  SyntaxError:  #  捕获异常并处理
            print('取完了')
            break 

    三、for循环迭代器

     for循环迭代器:
    1、自动获取被迭代对象的迭代器对象
    2、在内部一次一次调用_next_()方法取值
    3、自动完成异常处理

    iter_obj=st1.__iter__()
    for ele in iter_obj:
        print(ele)#  输出1 3 5 7 9
    
    for ele in st1:
        print(ele) # 1、自动完成for ele  in st1._iter_:  2、自动完成异常处理
    
    总结:
    可迭代对象:有_iter_()方法的对象,调用该方法返回迭代器对象
     迭代器对象:有_next_()方法的对象,也就是用该方法一次从迭代器对象中获取一个值,取出一个少一个
    
    
    
    obj=[1,2,3].__iter__()
    for v in obj:
        print(v)
        if v==2:
            break   # 输出结果为1 2
    print(obj.__iter__().__iter__().__iter__().__iter__())

    # 输出结果为True

    可迭代对象:.__iter__()得到的是该对象的迭代器对象
    迭代器对象:.__iter__().__iter__()得到的就是迭代器对象本身

    四、生成器

    生成器:就是一个迭代器对象
    包含yield关键字的函数就是生成器
    该函数名()得到的是生成器对象,且不会执行函数体

    def my_generator():
        yield 1
        yield 2
        yield 3
    g_obj = my_generator()
    # my_generator()并不会执行函数体,得到的返回值就是生成器对象
    # 生成器对象就是迭代器对象
    r1 = g_obj.__next__() # 1
    
    for v in g_obj:
        print(v)  # 2 | 3
    def fn():
         print('我是生成器')
        yield 'GOD'
    generator_obj=fn()
    print(generator_obj)
     print(type(generator_obj))
    # 输出结果  <generator object fn at 0x000001670AEFEF68>
               ·<class 'generator'>
    
    generator_obj.__iter__()  # 可迭代对象
     generator_obj.__next__() # 迭代器对象
    def g_fn():
        print(111111111)
        yield '结果1'
        print(222222222)
        yield '结果2'
        print(333333333)
        yield '结果3'
        print(444444444)
        yield '结果4'
    g_obj=g_fn()
    
    在函数内部执行一次,在遇见下一个yield时停止,且可以拿到yield的返回值
    r1=g_obj.__next__()
    print(r1)   #输出结果     111111111          结果1
    
     从上一次停止的位置接着往下走,在遇见下一个yield时停止,且可以拿到yield的返回值
    r2=g_obj.__next__()
    print(r2)
    #输出结果   222222222      结果2
    
    print('=====================================')
    生成器可以被for循环迭代
    
    for v in g_obj:
        print(v)  # 输出g_fn下的全部值
    生成器的应用案例
     当访问的数据资源过大,可以将数据用生成器处理,一次只获取所有内容的一条资源
    
    def my_range(min,max=0,step=1):  # min 和  max中必须要有一个默认值
        if max==0:
            min,max=max,min
        tag=min
        while True:
            if tag>=max:
                break
            yield  tag
            tag+=step
    # range_obj=my_range()
    # print(range_obj.__next__())
    # print(range_obj.__next__())
    range_obj=my_range(5,10,2)
    for i in range_obj:
        print(i)  #输出 5 7 9
    
    
    print('=====================================')
    def my_range(min,max=0,step=1):
        if max==0:
            min,max=max,min
        tag=min
        while True:
            if tag>=max:
                break
            yield  tag
            tag+=step
    
    range_obj=my_range(-10,1,2)
    for i in range_obj:
        print(i)  # 反着遍历  输出结果 -10 -8 -6 -4 -2 0

    五、枚举对象

    ls = [1, 3, 5, 7, 9]
    通过for迭代器 循环遍历 可迭代对象,需要知道迭代的索引
    count = 0
    for v in ls:
        print(count, v)
        count += 1
    
    for i, v in enumerate(ls):
        print(i, v)
    
    for i, v in enumerate('abc'): # 生成迭代器对象:[(0, 'a'),(1, 'b'), (2, 'c')]
        print(i, v)
  • 相关阅读:
    ASP扫盲学习班第六课 添加新保存的数据
    三级联动菜单免刷新加载
    ASP按定制格式导出word文件的完美解决思路
    通用客户资源管理系统(客户资料保护库)
    SmR 通用信息采集系统(新闻小偷)
    ASP扫盲学习班第三课 程序界面的设计
    我的新作品(单身贵族网全站)
    《将博客搬至CSDN》
    我的新作品
    asp函数大全
  • 原文地址:https://www.cnblogs.com/zhouqinmei/p/10651083.html
Copyright © 2011-2022 走看看