Advertisement

Python中的生成器是什么?

阅读量:

我们今天将探讨Python中的生成器(Generator)。首先,请明确生成器是一种特殊功能。它类似于工厂模式,在运行过程中逐步生成元素。然而,在这种机制下产生的元素属于序列范畴而非单独的具体物品。例如,在Python中我们可以利用生成器创建整数序列、字母序列或字符串等不同类型的序列对象。

生成器具有显著的高效率,并非一次性生产全部数据流而是仅在必要时才启动新元素的产生过程这与家中洗衣机的工作原理相似当有新任务出现时洗衣机只会处理当前的衣物而不会立即处理所有衣物这样既能节省资源也能避免系统过载的情况发生

接下来让我们举几个例子看看如何建立一个简单的生成器

复制代码
    def my_generator():  
    for i in range(5):  
        yield i 
    
    
    python

该生成器的功能在于产生一个从0到4的整数序列。通过调用 my_generator().next() 来获取元素,请注意,在每次调用 next() 方法时该生成器都会返回一个新的元素。如果你希望一次性获取所有元素,则可以使用 list(my_generator()) 的方法来完成操作。

随后来探讨一下如何构建一个更具趣味性的生成器;例如,在这一部分中我们可以设计一个能够生成音乐和弦的生成器。

复制代码
    def chord_generator(Root, Maj, Dom, Min, Dom7):  
    for i in range(12):  
        if i % 12 == Root:  
            yield Maj  
        elif i % 12 in [Root - 7, Root + 7]:  
            yield Dom7  
        elif i % 12 in [Root - 5, Root + 5]:  
            yield Dom  
        elif i % 12 in [Root - 4, Root + 4]:  
            yield Min  
        else:  
            yield "Invalid"
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/5ewJguZNOizn26LApHSDaPhodxc3.png)

该生成器的主要功能是制造一个包含音符的序列。它基于指定根音与指定类型的和弦模式来构建一个完整的十二音阶。在示例中,默认情况下我们会用yield语句来逐一产生每个音及其对应的类型信息。请注意的是这个示例仅为教学目的而存在其主要目的是演示如何利用程序结构来产生有序的数据序列而非真实存在的音乐工具。

最终,让我们探索一个真实的生成器示例。例如,请考虑这样一个问题:我们需要创建一个能够生成斐波那契数列的生成器:

复制代码
    def fibonacci():  
    a, b = 0, 1  
    while True:  
        yield a  
        a, b = b, a + b
    
    
    python

该生成器的功能是按顺序产生斐波那契数列。该生成器通过不断运行的 while True 循环来持续产生斐波那契数值。每当调用 generator.next() 方法时,则会返回下一个存在于该序列中的数值。注意:该生成器设计为无尽循环模式,在程序执行过程中将不断产出新的数值直至系统崩溃为止。如果你需要获取前 n 个这样的数字,请使用 take(n) 方法来限定输出范围。

大家现在都熟悉了 Python 中的生成器是什么以及如何运用它们。相信通过这次学习你已经掌握了这一重要的编程技能。接下来你就可以更加得心应手地用 Python 来解决各种问题啦!

如果你对 Python 的装饰器感兴趣, 你可以向我推荐一些实用的Python 装饰工具吗?例如, 在Python 编程中使用 装饰器的主要作用是简化代码结构.

复制代码
    def timing_decorator(func):  
    def wrapper(*args, **kwargs):  
        start = time.time()  
        result = func(*args, **kwargs)  
        end = time.time()  
        print(f"{func.__name__} took {end - start} seconds to execute.")  
        return result  
    return wrapper  
      
    @timing_decorator  
    def my_func():  
    # do something that needs to be timed  
    pass
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/RW6QsFGapZfghn9bz8t7ALBeoIYV.png)

该装饰器可用于衡量函数的执行时间,并在程序运行结束时输出所需的时间数据。你也可以将该装饰器应用于你的自定义函数中,以便更全面地评估它们的表现。

如果你有关于Python类型提示的问题

复制代码
    def my_func(arg: int) -> str:  
    # do something with arg and return a string  
    pass
    
    
    python

在这个示例中, 我们通过......来明确指定了函数参数及返回值的数据类型. 这种做法有助于我们在编写代码的过程中更清晰地理解函数签名, 并在后续步骤中进行有效的数据类型的验证.

如果你有意向学习Python的多线程开发,我可以向您展示如何利用线程池来优化程序运行效率.举个例子来说,在之前的项目中使用了多个子进程来并行处理文件读写操作.

复制代码
    import concurrent.futures  
      
    def my_func(arg):  
    # do something with arg  
    pass  
      
    if __name__ == '__main__':  
    with concurrent.futures.ThreadPoolExecutor() as executor:  
        # submit multiple tasks to the executor  
        future1 = executor.submit(my_func, arg1)  
        future2 = executor.submit(my_func, arg2)  
        # wait for the completion of all tasks  
        for future in concurrent.futures.as_completed([future1, future2]):  
            result = future.result()  
            # do something with the result  
            pass
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/pDNmgvFeUdunGsRhPYZ021wWzt8b.png)

在这个例子中 我们通过调用 ThreadPoolExecutor 类创建了一个线程池 并将多个任务通过 submit 方法提交到该线程池中执行。随后我们利用 as_completed 方法等待所有任务全部完成 并在每个任务完成时处理其结果。这种方法有效地限制了被创建的线程数量 从而显著提升了程序运行效率。

全部评论 (0)

还没有任何评论哟~