迭代器和生成器

迭代器和生成器

知识点补充:类和对象

  • 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)
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)
    

补充:

  • 生成器还一种特殊的迭代器,也是一种特殊的可迭代对象
原文地址:https://www.cnblogs.com/yangzilaing/p/13507350.html