zoukankan      html  css  js  c++  java
  • 迭代器和可迭代对象

    一、可迭代对象

    定义:可以进行循环更新的一个实实在在的值,内部含有__iter__方法的对象,叫可迭代对象,如,str list dict set range

    • 优点:
      1. 存储的数据能直观显示,比较直观
      2. 拥有方法比较多
    • 缺点:
      1. 占用内存
      2. 不能直接通过for循环,不能直接取值,(能取值是应为内部做了转换)
    s1 = 'sadf'
    print('__iter__' in dir(s1))  # 判断s1变量是否为可迭代对象
    
    print('__iter__' in dir(range)) # 判断ranage是否为可迭代对象
    
    
    # dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
    

    可迭代对象:操作方法比较多,比较直观,存储数据相对少的数据集(几百万个对象8G内存),当你侧重于对数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择

    二、迭代器

    定义:内部含有__iter__方法并且含有__next__方法的对象就是迭代器

    • 优点:
      1. 节省内存,在内存当中只占一行内存
      2. 惰性机制,next一下,取一个值,绝对不多取
    • 缺点:
      1. 速度慢,时间换空间
      2. 不走回头路
    # 判断文件句柄是否为一个迭代器
    with open('bb.txt',encoding='utf-8',mode='r') as  f:
        print(('__iter__' in  dir(f) and '__next__' in  dir(f)))
    
    #判断变量s1是否为迭代器
    s1 = 'sadf'
    print(('__iter__' in  dir(s1) and '__next__' in  dir(s1)))
    
    l1 = [1, 3, 4, 4, 5]
    
    obj = iter(l1) # 转换列表为迭代器
    
    print(next(obj)) # 一起取一个值,超出会报错
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    print(next(obj))
    
    
    l1 = [ i for i in range(1,10)]
    obj = iter(l1)
    
    for i in range(3): 
        print(next(obj))
    
    for i in range(4):
        print(next(obj))
        
    # 不走回头路,会记住上一次取值的位置,下一次接着取值(只要程序不停止)因此这里打印1-7
    

    迭代器:是一个非常节约内存,可以记录存储位置,可以直接通过循环next方法取值,但是不直观,操作方法比较单一,因此当你数据量比较大的时候或者以节约内存为首选,将数据设置成可迭代器是不错的选择

    利用while循环模拟for循环对可迭代对象进行取值的机制

    l1 = [ i for i in range(1,10)]
    obj = iter(l1)
    
    while 1:
        try:
            print(next(obj))
        except StopIteration: # 如果出现StopIteration错误停止程序
            break
    
  • 相关阅读:
    iSCSI又称为IPSAN
    文档类型定义DTD
    HDU 2971 Tower
    HDU 1588 Gauss Fibonacci
    URAL 1005 Stone Pile
    URAL 1003 Parity
    URAL 1002 Phone Numbers
    URAL 1007 Code Words
    HDU 3306 Another kind of Fibonacci
    FZU 1683 纪念SlingShot
  • 原文地址:https://www.cnblogs.com/jiangjunwang/p/13387789.html
Copyright © 2011-2022 走看看