> 文章列表 > Python入门到精通12天(迭代器与生成器)

Python入门到精通12天(迭代器与生成器)

Python入门到精通12天(迭代器与生成器)

迭代器与生成器

  • 迭代器
  • 生成器

迭代器

迭代器是可迭代的对象,即可以进行遍历的对象。列表、字符串、元组、字典和集合这些都是可迭代的对象,都可以进行遍历。

迭代器是一种访问序列元素的方式,它可以通过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, 1while True:# 使用yeild关键字,对a进行生成# 遇到yield关键字,循环暂停执行一次# 通过next()方法进行取出时,循环继续执行# 再次遇到yield,循环再次停止执行yield aa, b = b, a + bmy_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, 1while True:yield aa, b = b, a + bif a == 2:# 遇到return语句,程序终止执行# 返回的结果用于异常说明return 1my_fib = fibonacci()
print(next(my_fib))  # 0
print(next(my_fib))  # 1
print(next(my_fib))  # 1
print(next(my_fib))  # 这条语句执行不了,程序遇见了return自动结束

执行结果如下:

Python入门到精通12天(迭代器与生成器)

当然我们可以使用close()手动关闭生成器函数,此时如果我们再次进行调用生成器的时候会直接返回StopIteration异常。代码如下:

def fibonacci():a, b = 0, 1while True:yield aa, b = b, a + bmy_fib = fibonacci()
print(next(my_fib))
print(next(my_fib))# 将迭代器进行关闭
my_fib.close()# 再次取值会返回StopIteration错误
print(next(my_fib))  # StopIteration

以上就是迭代器和生成器的简单介绍,它在我们处理大量数据的时候非常有用,不用将数据全部跑一遍,而是在需要什么数据就拿取数据出来,从而提高速度。

包装材料