Python生成器与迭代器

文章目录

    • 生成器与迭代器
      • 生成器
        • 利用生成器表达式创建生成器
        • 利用yield创建生成器
      • 迭代器
        • 可迭代对象

生成器与迭代器

我们已经学习了Python的对象,其实在Python中的所有东西都可以认为是对象,因此,我们就可以用生成器(generator)和迭代器(iterator)做到

生成器

利用生成器表达式创建生成器

一个最简单的创建生成器的方法与我们之前学的推导式其实差不多,与之不同的是,利用推导式时,他会将所有符合条件的列表元素全部加载到内存中,一旦数据量十分大,例如百万量级,内存就会吃不消了

我们可以利用生成器表达式来创造一个生成器,实际上就是把推导式的方括号变成圆括号,例如

a = [x**2 for x in range(10) if x % 2 == 0]
print(a)
print(type(a))

b = (x**2 for x  in range if x % 2 == 0)
print(b)
print(type(b))
print(list(b))

Python生成器与迭代器_第1张图片

利用类型转换可以将生成器转换为列表进行输出,除此之外,我们还可以利用全局内置函数next(),他会从生成器的第一个元素开始,每次返回当前元素的值,并且自动指向下一个元素,直到输出最后一个元素,会抛出StopIteration的异常

当然,生成器内部也有内置函数__next__(),因此我们可以通过b.__next__()达到和next(b)一个效果

实际上使用的时候并没有这么复杂,直接使用for循环遍历即可,Python内部会自动确保不越界,因此也不会报错

例如

b = (x**2 for x in range(10) if x % 2 == 0)
for num in b:
    print(num)

利用yield创建生成器

我们刚刚讲了类似于用列表推导式来构建生成器的方法,但是当构造的规则比较复杂的时候,就难以利用了

这里的yield,实际上是一种声明,他只能用于函数内部,表示这个函数是一个生成器,用法就是在给变量之前加一个标识,表示这是一个生成器对象,之后每次对这个变量时,就相当于给生成器插入值,这个函数的返回值就是生成器本身

这里示例一下,生成一个斐波那契数列

def func(t):
    n, a, b = 0, 0, 1
    while n < t:
        yield b
        a, b = b, a + b
        n += 1

res = func(10)
for num in res:
    print(num)

迭代器

迭代是访问集合元素的一种方式,迭代器就是用于迭代操作的多谢,他可以像列表一样迭代获取其中的每一个元素

可迭代对象

我们之前大略讲过,列表、元组、字典、集合、字符串,这些容器(container)就是可迭代对象,我们逐个访问,获取其中元素的过程就是迭代

例如

x = [1, 2, 3, 4]
it1 = iter(x)
print(next(it1))
print(next(it1))
print(next(it1))
print(next(it1))

这里我们只设置了一个迭代器it1,实际上我们也可以设置多个迭代器分别指向列表x,他们也是相互独立的,互不干扰

在这里我们可以用异常捕获来进行循环输出

例如

x = list[1, 2, 3, 4]
it1 = iter(x)
while True:
    try:
        print(next(it))
    except StopIteration:
        break

这里的 try 和 except 是用于捕获异常的结构,使用也比较简单,当没有发生异常的时候会执行try内的语句,except之后也可以不写异常的名称,写了就是发生特定异常才执行,不写就是发生任何异常都会执行之后的语句

Python的基础内容就到这里了,从下一篇开始我们会开始Python进阶的内容,感谢各位的支持,如果你发现文章中有任何不严谨或者需要补充的部分,欢迎在评论区指出

你可能感兴趣的:(Python,python,开发语言,迭代器,生成器)