迭代器与生成器
- 迭代器
- 生成器
迭代器
迭代器是可迭代的对象,即可以进行遍历的对象。列表、字符串、元组、字典和集合这些都是可迭代的对象,都可以进行遍历。
迭代器是一种访问序列元素的方式,它可以通过next()函数逐个返回序列中的元素。并且所有的迭代器都包含了iter()
和next()
方法,简单来说就是包含了这两种方法的对象都可以被称为迭代器。
迭代器的一个重要特点是,它可以处理任意大小的数据序列,因为它只需要在需要的时候计算下一个计算下一个值,而不必提前将所有的值计算出来。
在之前我们已经学过了for循环,在迭代器中也可以进行使用,for循环实际上是创建了一个迭代器对象,并为每个循环执行next()方法.
这里用列表进行举例说明,代码如下:
# 定义一个列表
list1 = [1, 2, 3, 4]
# 利用iter函数将列表变成迭代器
# 此时就可以用next函数进行取出了
my_iter = iter(list1)
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
print(next(my_iter))
# 当使用next函数将迭代器中的所有值都取出来之后在进行取出
# 程序就会报错
# print(next(my_iter)) # StopIteration
# 为了防止出现超出它的范围可以使用for循环进行取出
for _ in range(len(list1)):
print(next(my_iter))
# 同时我们操作迭代器的时候也可以用for循环进行遍历
for i in list1:
print(i)
生成器
生成器是一种特殊的迭代器,他可以通过yield关键字逐个返回值。生成器的函数在调用时不会立即执行,而是返回一个生成器对象。每次调用生成器对象的next()方法时,函数会从上一次yield的位置继续执行,直到遇到下一个yield。yield可以暂停一个函数并返回此时的执行结果,该函数将保存执行环境并在下一次恢复。例举一个斐波那契数列,代码如下:
def fibonacci():
a, b = 0, 1
while True:
# 使用yeild关键字,对a进行生成
# 遇到yield关键字,循环暂停执行一次
# 通过next()方法进行取出时,循环继续执行
# 再次遇到yield,循环再次停止执行
yield a
a, b = b, a + b
my_fib = fibonacci()
print(next(my_fib)) # 0
print(next(my_fib)) # 1
print(next(my_fib)) # 1
print(next(my_fib)) # 2
# 此时我们一直取出数据都不会报错
# 因为这是个死循环,有取不完的数据
# 只要你有next()循环便给一个数据
生成器中,如果没有return
语句,则执行到函数完毕时将返回StopIteration
异常。如果遇到了return语句,则直接抛出StopIteration异常,终止迭代。如果在return后面加上返回的值,则这个值将作为异常的说明。代码如下:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
if a == 2:
# 遇到return语句,程序终止执行
# 返回的结果用于异常说明
return 1
my_fib = fibonacci()
print(next(my_fib)) # 0
print(next(my_fib)) # 1
print(next(my_fib)) # 1
print(next(my_fib)) # 这条语句执行不了,程序遇见了return自动结束
执行结果如下:
当然我们可以使用close()手动关闭生成器函数,此时如果我们再次进行调用生成器的时候会直接返回StopIteration异常。代码如下:
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
my_fib = fibonacci()
print(next(my_fib))
print(next(my_fib))
# 将迭代器进行关闭
my_fib.close()
# 再次取值会返回StopIteration错误
print(next(my_fib)) # StopIteration
以上就是迭代器和生成器的简单介绍,它在我们处理大量数据的时候非常有用,不用将数据全部跑一遍,而是在需要什么数据就拿取数据出来,从而提高速度。