生成器与迭代器
我们已经学习了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))
利用类型转换可以将生成器转换为列表进行输出,除此之外,我们还可以利用全局内置函数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进阶的内容,感谢各位的支持,如果你发现文章中有任何不严谨或者需要补充的部分,欢迎在评论区指出