• 迭代器、可迭代对象与生成器


    Iterator 与 gerater的作用是优化内存,当处理大文件,大数据的时候可以使用。

      1. 对大列表进行优化

      2. 大文件的优化

    一、基本概念

    迭代器:  一种数据类型,用来处理大数据

    可迭代对象:一个对象,能每次返回数据组中的一个成员,for循环中每次返回一个数据或者用来作为iter内置函数的参数,返回迭代器对象

    生成器:  生成器是通过yield 或 生成器表达式,用一种比较方便的方式生成了迭代器。

    二、代码视线部分

    2.1  yield 

     yield函数就是一个生成器:

    yield的作用:

      1. 相当于return返回一个值

      2. 记住该位置,下次进来从这个位置开始。

    两种使用方式:

    1. 使用next 和 send 需结合异常处理(当超出最大值的时候,会报错)

    2. 使用for循环,for内部自动帮我们处理异常

    def ge():
        yield 8
        yield 88
        yield 888
    
    g = ge()
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))  # 报错,超出

    使用for处理

    def gen_num2():
        for i in range(8):  # range是一个惰性机制。
            yield i
    
    for i in gen_num2():
        print(i)

    2.2 迭代器,可迭代对象,生成器的类型判断

    from collections import Iterator, Iterable, Generator
    
    # 列表的类型判断
    li = [1, 2, 3, 4]
    print(isinstance(li, Iterable))  # True
    print(isinstance(li, Iterator))  # False
    print(isinstance(li, Generator)) # False
    
    # 字典的类型判读
    dic = {'name':'hui', 'age':18}
    print(isinstance(dic, Iterable))  # True
    print(isinstance(dic, Iterator))  # False
    print(isinstance(dic, Generator)) # False
    
    # range的类型判断
    # range是一个可迭代对象,不是迭代器。但是他跟迭代器有类似的地方,又一个惰性机制,所有也很节约内存
    r = range(10)
    print(type(r))
    print(isinstance(r, Iterable))  # True
    print(isinstance(r, Iterator))  # False
    print(isinstance(r, Generator))  # False
    
    # 文件对象 是一个迭代器
    with open('1.txt', 'wb') as f:
        pass
    print(isinstance(f, Iterable))   # True
    print(isinstance(f, Iterator))   # True
    print(isinstance(f, Generator))  # False
    
    # yield对象
    def ge():
        for i in range(9):
            yield(i)
    g = ge()
    print(isinstance(g, Iterable))   # True
    print(isinstance(g, Iterator))   # True
    print(isinstance(g, Generator))  # False

    2.3 可迭代对象转换为迭代器,优化内存

      使用iter内置函数

    from collections import Generator, Iterable, Iterator
    
    x = [x for x in range(10)]
    y = iter(x)     # 列表转换为迭代器
    print(next(y))
    print(next(y))
    print(next(y))
    print(next(y))
    print(isinstance(y, Iterable)) 
    print(isinstance(y, Iterator))  # 是迭代器对象,
    print(isinstance(y, Generator))
    
    dic = {'name':'hui', 'age':18}
    print(isinstance(dic, Iterable))
    print(isinstance(dic, Iterator))
    print(isinstance(dic, Generator))
    
    d = iter(dic)  # 字典转换为迭代器
    print(type(d))
    print(isinstance(d, Iterable))
    print(isinstance(d, Iterator))   
    print(isinstance(d, Generator)) 

    2.4 生成器表达式

    # 列表表达式
    y = [x for x in range(10)]
    
    # 生成器表达式
    z = (x for x in range(10))
    print(type(z), z)

    2.5 大文件 与 函数优化

    1. 函数优化

    # 斐波那契
    # 0,1,1,2,3
    def fb(n):
        a, b = 0, 1
        while a < n:
            print(a)
            a,b = b, a+b
    
    def fb_list(n):
        a, b = 0, 1
        fblist = []
        while a < n:
            fblist.append(a)  # 当数据量非常大的时候,就会造成内存爆炸
            a, b = b, a+b
        return fblist
    
    print(fb_list(1000))
    
    def fb_ge(n):
        a, b = 0, 1
        fblist = []
        while a < n:
            yield a         # 使用生成器每次来取,优化内存
            a, b = b, a+b
    
    for i in fb_ge(1000):
        print(i, end=' ')

    2. 大文件优化

      打开文件的对象,本身就是一个迭代器。

    with open('1.txt', 'wb') as f:
        pass
    print(isinstance(f, Iterable))   # True
    print(isinstance(f, Iterator))   # True
    print(isinstance(f, Generator))  # False
     
  • 相关阅读:
    ubuntu安装ruby的几种方法总结
    使用一年ESB感受
    web工程迁移---在一个jboss5或jboss6中运行多个实例
    web工程迁移---weblogic8迁移到jboss5遇到的异常
    web工程迁移---jboss5迁移到jboss6
    Git使用(3)
    Git使用(2)
    Git使用(1)
    Spring4 mvc+maven 框架搭建(3)
    Spring4 mvc+maven 框架搭建(2)
  • 原文地址:https://www.cnblogs.com/louhui/p/9381668.html
Copyright © 2020-2023  润新知