欢迎访问宙启技术站
智能推送

分步学习Python生成器函数

发布时间:2023-05-24 15:37:32

Python中的生成器是一种可以自动迭代序列的函数。生成器函数可以通过迭代器协议进行遍历,将函数生成的值逐个迭代输出。

生成器函数的语法如下:

def generator_function():
    yield value

这里的yield关键字可将函数作为生成器函数运行,并依次生成一系列值。这些值可以在函数执行中通过yield语句传递给调用函数。

生成器函数可以在需要迭代值时手动调用,也可以与Python中的迭代器对象一起使用。下面是一些生成器函数的例子。

### 生成器示例1:斐波那契数列

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

在这个例子中,生成器函数fionacci创建了一个迭代序列,该序列包含了斐波那契数列的前n项。在每次运行yield语句时,函数返回当前斐波那契数列中的下一个数。

### 使用生成器函数

为了使用生成器函数,可以使用Python中的 next() 函数或者使用for循环进行迭代。

例如:

fib = fibonacci()
next(fib)  # 返回0
next(fib)  # 返回1
next(fib)  # 返回1
next(fib)  # 返回2

# 使用for循环迭代
for i in fibonacci():
    if i > 100:
        break
    print(i)

在这个例子中,我们可以看到,使用next函数逐步拉取生成器函数的值,使用for循环进行全迭代。

### 生成器示例2:随机数生成器

import random
def random_number():
    while True:
        yield random.random()

此示例显示了如何使用生成器创建随机数序列。当调用random_number函数时,它将返回一个包含无限个随机数的生成器。该函数每次调用yield时都返回下一个随机数。

### 生成器示例3:字典逐一迭代器

class DictIter:
    def __init__(self, d: dict):
        self.d = d
        self.index = 0
        self.keys = list(d.keys())

    def __next__(self):
        if self.index < len(self.keys):
            i = self.index
            self.index += 1
            return self.keys[i], self.d[self.keys[i]]
        else:
            raise StopIteration

def dict_iterator(d: dict):
    return DictIter(d)

对于生成器示例3,我们定义了Class DictIter来实现一个字典逐一迭代器。该迭代器实现了 Python的 Iterator 协议,因此可以与Python内置的 next()函数 或 for循环结合使用。

Python中已经有dict的迭代器实现方式,items()方法可以返回以键值对的方式为元素的迭代器,而keys()和values()方法分别可以返回以键或值为元素的迭代器。

例如:

d = {"a": 1, "b": 2, "c": 3}
for k, v in d.items():
    print(f"{k}: {v}")

使用dict_iterator函数:

d = {"a": 1, "b": 2, "c": 3}
for k, v in dict_iterator(d):
    print(f"{k}: {v}")

### 生成器注意事项:

1. 每个生成器函数在 次调用时都会创建一个协程对象

2. yield关键字在函数执行时发挥了重要作用

3. 生成器不会在一个函数调用结束时撤销,Python垃圾回收机制会在对象生命周期结束时自动清理

4. 生成器可以在需要迭代值时手动调用,也可以与Python中的迭代器协议一起使用。

总的来说,生成器函数是一种非常强大而又方便的特性,可以大大简化实现复杂迭代器功能的代码。加上Python内置的一些迭代器方法,形成了完善的迭代器/生成器机制。这对于Python程序员来说是一个非常重要的优势。