迭代器和生成器

迭代器和生成器

知识点补充:类和对象

  • int str list ----类
  • 由类创建的的东西叫做对象

迭代器

  • 定义:对某对象(str/list/tuple/dict/set)【序列】【可迭代对象】中的元素进行逐一获取

  • 在对字典进行迭代时,只对其键进行迭代

  • 从列表中循环每一个元素

    v1 = [11,22,33,44]
    v2 = iter(v1) #v1是迭代器
    #或者
    v2 = v1.__iter__()
    while True: #其实就是一个分类展示的步骤,因为生成的是一个整体的函数,相当于将其打散分类展示出
        try:
            val = v2.__next__()#每次可迭代一个
            print(val)
        except Exception as e: #如果有异常
            break
    
  • 如何判断一个对象是否为迭代器:1.内部是否有__next__方法 2.利用type( )函数

  • for循环内部就是迭代器

可迭代对象

  • 可迭代对象的标记:

    • 1.可以被for循环的 2. 内部有__iter__方法且返回一个迭代器

生成器

生成器函数

  • 一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象。每一次获取这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数执行结束

    # 生成器函数(内部是否包含yield)
    def func():
        print('f1')
        yield 1
        print('f2')
        yield 2
        print('f3')
        yield 100
        print('f4')
    # 函数内部代码不会执行,返回一个生成器对象
    v1 = func() #函数不执行
    #生成器是可以被for循环的,一旦开始循环那么函数内部代码就开始执行
    for item in v1:
        print(item)
    
  • 利用生成器生成1到10万

    def func():
        count = 1
        while True:
            yield count
            count += 1
            if count = 100000:
                return
    val = func()
    for i in val:
        print(i)
        #或者
        if i >= 100000:
            break
    #优点边做边用
    
  • 每次循环都会获得yield的返回值

    def func():
        return 2
        yield 1
    a = func()
    print(a)
    
  • 只要yield存在就是生成器

练习题

  • 分行读取文件的内容

    def func():
        cursor = 0
        while True:
            f = open('db','r',encoding = 'utf-8')
            f.seek(cursor)
            data_list = []
            for i in range(10):
                line = f.readline()
                if not line:
                    return
                data_list.append(line)
            cursor = f.tell()
            f.close()
    
            for rew in data_list:
                yield rew
    
    for item in func():
        print(item)
    

补充:

  • 生成器还一种特殊的迭代器,也是一种特殊的可迭代对象,迭代可运行类似返回值,一步一停
posted @ 2020-08-15 03:12  小杨的冥想课  阅读(80)  评论(0编辑  收藏  举报