跳至主要內容

15. 生成器与迭代器

小白debug大约 3 分钟

15. 生成器与迭代器

今天我们要聊聊一个有趣的话题**:生成器**和 迭代器

在我们开始之前,先放轻松,这个话题其实挺有意思的,我会用最简单的方式向你解释。

什么是迭代器?

首先,让我们来解释一下什么是迭代器。在 Python 中,迭代器是一种特殊的对象,它允许你逐个访问一个可迭代对象中的元素,而不需要提前把所有元素都生成出来。

来看一个简单的例子:

names = ['Alice', 'Bob', 'Charlie']
iterator = iter(names)

print(next(iterator))  # 输出 'Alice'
print(next(iterator))  # 输出 'Bob'
print(next(iterator))  # 输出 'Charlie'

在这个例子中,我们先创建了一个列表 names,然后用 iter() 函数把它转换成了一个迭代器 iterator。接着,我们用 next() 函数逐个访问了列表中的元素。

生成器是什么?

生成器是一种特殊的函数,它使用了 yield 关键字来返回值,而不是使用 return。这使得生成器能够在每次调用时生成一个值,而不需要一次性生成所有值,从而节省了内存空间。

让我们来看一个生成器的例子:

def countdown(n):
    while n > 0:
        yield n
        n -= 1

在这个例子中,我们定义了一个生成器函数 countdown,它使用了 yield 关键字来返回值。每次调用 next() 函数时,生成器会生成一个新的值。

实战例子:生成斐波那契数列

让我们通过一个例子来加深理解。

假设你想生成一个斐波那契数列,这是一种数学上非常有意思的数列,后一个数字是前两个数字之和。

def fibonacci(n):
    a, b = 0, 1
    count = 0
    while count < n:
        yield a
        a, b = b, a + b
        count += 1

在这个例子中,我们定义了一个生成器函数 fibonacci,它接收一个参数 n,表示你想要生成几个斐波那契数。

然后,我们用一个 for 循环来生成数列,而不是一次性把所有数字都生成出来。

fib = fibonacci(10)
for num in fib:
    print(num)

更多实例

让我们再看一个例子,假设你想生成一个从 1 到 100 的所有偶数:

def even_numbers(n):
    for i in range(n):
        if i % 2 == 0:
            yield i

同样地,这个生成器函数 even_numbers 允许你在需要的时候生成偶数,而不是一次性生成所有的偶数。

evens = even_numbers(100)
for even in evens:
    print(even)

生成器与不同数据类型

生成器不仅仅可以用于列表,还可以用于其他数据类型。比如,你可以通过生成器逐个生成字典中的键值对:

def dictionary_items(dictionary):
    for key in dictionary:
        yield key, dictionary[key]

然后,你可以使用这个生成器来获取字典中的键值对:

my_dict = {'a': 1, 'b': 2, 'c': 3}
items = dictionary_items(my_dict)
for key, value in items:
    print(f'Key: {key}, Value: {value}')

同样地,你可以尝试使用生成器来生成集合中的元素。

总结

通过这篇文章,我们学习了生成器和迭代器的基本概念。迭代器是一种特殊的对象,允许你逐个访问一个可迭代对象中的元素。生成器是一种特殊的函数,它使用了 yield 关键字来返回值,能够节省内存空间。

希望你现在对生成器和迭代器有了更清晰的理解。继续加油,你已经迈出了成为 Python 大师的一大步!

学到了什么:

  • 了解了什么是迭代器和生成器
  • 学会了如何使用生成器生成斐波那契数列以及其他实例
  • 理解了生成器的优点,可以节省内存
  • 掌握了生成器在不同数据类型中的应用
训练营看视频