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


    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
     
  • 相关阅读:
    服务器响应状态码
    细说同域-同父域-跨域
    细说Ajax跨域
    为SQL缓存通知启用数据库
    使用PATINDEX()判断含有[A-Z]、[a-z]、[0-9]之外的字符
    记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
    谈谈如何在面试中发掘程序猿的核心竞争力
    “属性”与“特性”区别
    【转】安卓手机无法安装软件的原因总结
    【转】自学android半年,已从.net转型成android程序员
  • 原文地址:https://www.cnblogs.com/louhui/p/9381668.html
Copyright © 2020-2023  润新知