zoukankan      html  css  js  c++  java
  • 五. python进阶(迭代器)

    一. 迭代器

    我们已经知道,可以直接作用于for循环的数据类型有以下几种:
    一类是集合数据类型,如list、tuple、dict、set、str等;
    一类是generator,包括生成器和带yield的generator function。
    这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
    可以使用isinstance()判断一个对象是否是Iterable对象:
    dir()查看方法
    而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
    可以使用isinstance()判断一个对象是否是Iterator对象:
    # 表示生成了两个迭代器      而生成器函数可以作用于一个迭代器
    ll=[1,2,3,4,5,6]
    for i in ll:
        if i==3:
            break
        print(i)
    
    print("###################################333")
    for i in ll:
          print(i)
    # a=[1,2,3]
    # for i in a:
    #     print(i)
    # 为什么这些可以循环
    #     list
    #     dict
    #     str
    #     set
    #     tuple
    #     f=open
    #     range
    #     enumerate
    print(dir([]))    #  告诉我列表里面有什么方法
    
    print(dir())  #  告诉我元组里面有什么方法
    
    print(dir({})) #告诉我字典里面有什么方法
    
    print(dir('')) #告诉我字符串里面有什么方法
    
    print(dir(range(10)))  #告诉我range里面有什么方法
    
    # 双下方法
    print([1].__add__([2]))  # 同等print([1]+[2])
    print([1]+[2])
    # 说明一个问题能被for循环的数据类型 就一定拥有__iter__方法   iterator
    print('__iter__' in dir(int))    # False  不是迭代器
    print('__iter__' in dir(bool))  # False  不是迭代器
    print('__iter__' in dir(set))   # True
    print('__iter__' in dir(list))  # True
    print('__iter__'in dir(dict))    # True   迭代器
    print('__iter__'in dir(tuple))  # True    迭代器
    print('__iter__'in dir(str))  # True       迭代器
    #
    # 区分可迭代l对象和迭代器
    # 可迭代对象是含有iter()方法的对象。iter()方法返回一个迭代器。
    # String, tuple, list,dict都是可迭代对象,因为它们都实现了iter()方法;
    # 但是他们都不是迭代器,因为它们都没有实现iter()方法。
    
    # 执行了__iter__方法之后的返回值是一个迭代器
    # 只有含有__iter__方法的都是可以迭代的     就是可迭代协议
    # 迭代协议内部含有__next__和__iter__方法就是迭代器

    1. 迭代模块

    from collections import Iterable
    from  collections import  Iterator
    
    print(isinstance([],Iterator))  #   判断是不 是迭代器
    
    print(isinstance([],Iterable))   #  判断是不是迭代的对象
    
    print(dir([]))
    
    
    #  判断是不是可以迭代,用Iterable
    isinstance({}, Iterable)  #  --> True
    isinstance((), Iterable)  #  --> True
    isinstance(100, Iterable)  #  --> Fals
    
    #  判断是不是迭代器,用Iterator
    isinstance({}, Iterator)   #  --> False
    isinstance((), Iterator)   #  --> False
    isinstance( (x for x in range(10)), Iterator)   #  --> True
    
    
    # 迭代器和可迭代协议
    # 可以被for循环都是可以迭代的
    # 只要是迭代器 一定可以迭代
    # 可迭代的__iter__方法就可以得到一个迭代器
    # 迭代器中的__next__方法可以一个一个的获取值
    # 迭代器的好处
     # 从容器类型中一个一个的取值 会把所有的值取到
     # 节省内存
    # print(list(range(1000000000)))  # 没有真正的生成数据 在内存中 只是通过range 给了个数字  意思就是处理一个数据就生成一个数据
    # 通过迭代器模拟for循环
    l=[1,2,3,4]
    aa=l.__iter__()
    while True:
        print(aa.__next__()
    # Python迭代器(Iterator)
    
    
    
    """
    我们已经知道,可以直接作用于for循环的数据类型有以下几种:
    
    一类是集合数据类型,如list、tuple、dict、set、str等;
    
    一类是generator,包括生成器和带yield的generator function。
    
    这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
    
    可以使用isinstance()判断一个对象是否是Iterable对象:
    
    isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
    
    迭代是Python最强大的功能之一,是访问集合元素的一种方式。
    
    迭代器是一个可以记住遍历的位置的对象。
    
    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
    
    迭代器有两个基本的方法:iter() 和 next()。
    
    字符串,列表或元组对象都可用于创建迭代器:
    """
    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
    print(it)
    print (next(it))   # 输出迭代器的下一个元素
    # 1
    print("11**********************************************************")
    
    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
    for x in it:
        print (x, end=" ")
    
    # 1 2 3 4
    print("22**********************************************************")
    
    # 迭代器对象可以使用常规for语句进行遍历:
    list=[1,2,3,4]
    it = iter(list)    # 创建迭代器对象
    for x in it:
        print (x, end=" ")
    
    # 1 2 3 4
    print("33**********************************************************")
    
    a=[1,2,3]
    b=a.__iter__()   # 使用对象内置的__iter__()方法生成迭代器
    print(b)         #<list_iterator object at 0x0000014E5A08A2E8>
    print(b.__next__())
    # 1
    print(b.__next__())
    # 2
    print(b.__next__())
    # 3
    
    print("44**********************************************************")
    # f=open("aa.txt","r+")
    # qq=f.__iter__()
    # print(qq.__next__())
    # 跌带器   案例
    a=["爷爷","爸爸","儿子","孙子"]
    
    b=a.__iter__()  # 创建迭代器对象
    
    print(b.__next__())
    # 爷爷
    print(b.__next__())
    # 爸爸
    print(b.__next__())
    # 儿子
    
    
    # 其实next()就是在调用创建的这个迭代
    
    c=["爷爷1","爸爸","儿子","孙子"]
    
    b=c.__iter__()  # 创建迭代器对象
    e=next(b)
    print(e)
    
    # 爷爷1
    # 特点:
    #     只能向前   几乎不站内存
    #     for 循环
    #     惰性机制
    
    
    # print(dir(list))  #  __iter__  iterable
    # print(dir(str))  #  __iter__
    # print(dir(int))  # 没有 __iter__
    # 所有的带__iter__可以使用for循环 可迭代对象
    # 可迭代对象可以使用 __iter__()来获取迭代器
    # 迭代器里面有 __next__()方法
    # s="abc"
    # c=s.__iter__()    # 迭代器 有 __iter__ () __next__()
    #                    # 只能向前   几乎不站内存
    # print(c)    # <str_iterator object at 0x00000169A4E38400>
    # print(c.__next__())   #  a
    # print(c.__next__())   #  b
    # print(c.__next__())   #  c
    # print(c.__next__())  # StopIteration 停止迭代
    
    
    # 迭代器去模拟for 循环
    ll=[1,2,3,4,5,6]
    # for i in ll:  # for 循环底层就是用的迭代器
    #     print(i)
    print("********************************************************************")
    aa=ll.__iter__()    #  获取迭代器
    print(aa)
    while True:
          try:
              print(aa.__next__())     #  获取元素
          except StopIteration:       # 处理错误
              break
    from  collections import Iterable   #  可迭代对象   包含 __iter__()函数
    from  collections import  Iterator   # 迭代器    __iter__()       __next__()
    # 迭代器  一定可以迭代
    print(isinstance([],Iterator))  #  False
    print(isinstance([],Iterable))   #True
    print(isinstance({},Iterator))  #  False
    print(isinstance({},Iterable))   #True
     
  • 相关阅读:
    获取键盘代码
    从一道js笔试题到==运算符的简析
    【物联网智能网关01】通过AD采集获取温湿度
    【物联网智能网关04】WinForm for .NET MF 功能一览
    .NET Micro Framework V4.2 RTM正式发布
    【物联网智能网关02】获取摄像头数据+显示
    .NET Micro Framework开发板用户简明手册(v3.0)
    2011 ARM技术研讨会杂记
    再谈.NET Micro Framework移植
    【.Net MF网络开发板研究06】以太网转串口
  • 原文地址:https://www.cnblogs.com/Sup-to/p/10850688.html
Copyright © 2011-2022 走看看