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
    
  • 相关阅读:
    java
    java
    java
    js
    java
    异常之异常处理
    面向对象之元类
    面向对象之内置方法
    面向对象之反射
    面向对象之类方法与静态方法
  • 原文地址:https://www.cnblogs.com/jiangjunwang/p/13387789.html
Copyright © 2011-2022 走看看