Advertisement

Python中生成器是什么?

阅读量:

何为生成器

生成器的维基百科条目链接到该维基百科条目。

在计算机科学领域中,在于其特殊性的迭代体——称为"generator"——均完美地实现了迭代体接口,在此情形下每一个这样的"generator"都可被视为标准的迭代体实例。然而,在于其特殊性的另一种程序设计结构——称为"iterator"——则专门用于从数据集系统性获取元素;相比之下,则采用了一种动态产生的方式——通过'yield'关键字实现逐个获取的方式——从而能够实现资源的有效利用与管理。在这种模式下,并不需要预先为每一个可能需要的数据点预留存储空间;而是能够在处理每一个新数据时仅占用单个数据单元的空间资源即可完成整个流程的操作。

一个非常典型的例子就是斐波那契数列:斐波那契数列中的每一个数值都是无限多的,在一个数据结构中无法存储完整;然而,在需要下一个元素时可以通过临时计算来满足需求。

例如内置函数range()也会返回一种类似于生成器的对象在请求数据时才进行计算以满足需求。要让range()函数返回一个列表必须明确使用list(range(100))来完成转换

Python中的生成器本质上是一个函数;然而其运行机制类似于迭代器。此外,在Python中还支持生成器表达式这种结构。

初探生成器

下面是一个非常简单的生成器示例:

复制代码
 >>> def my_generator(chars):

    
 ...     for i in chars:
    
 ...         yield i 
    
  
    
 >>> for i in my_generator("abcdef"):
    
 ...     print(i, end=" ")
    
  
    
 aa bb cc dd ee ff
    
  
    
 我是一名python开发工程师,整理了一套python的学习资料,从基础的python脚本到web开发、爬虫、
    
 数据分析、数据可视化、机器学习、面试真题等。想要的可以进群:688244617免费领取

在这里,默认情况下使用的my_generator是一个基于生成器框架的特殊类型(即通过yield关键字实现的function),并且已经被明确标记为了generator类型的对象。然而,在for循环环境中时,该生成器扮演了一个典型的可迭代角色。事实上该生成器本身就具备了可迭代性。

复制代码
 >>> E = my_generator("abcde")

    
 >>> hasattr(E, "__iter__")
    
 True
    
 >>> hasattr(E, "__next__")
    
 True
    
  
    
 >>> E is iter(E)
    
 True

基于生成器自动实现了__iter__$和next$这两个接口,并且其迭代操作返回自身这一特性,在设计上确保了它成为一个单迭代体。

此外,在生成器函数中通过for循环遍历chars变量的过程中,并未对其中被遍历的元素进行任何额外的操作;相反地,则采用yield机制将该元素传递给调用者的行为与return语句的功能相似

然而,在某些情况下(如函数返回值处理),返回值与返回操作之间存在明显区别。当一个迭代器通过yield机制生成一个数据项时,并能够保存当前迭代的状态以便后续继续执行,在后续迭代中能够持续提供下一个数据项直到所有可迭代的数据项都被逐一提供出来(可能永远无法完成)。而return语句则完全终止函数的执行流程

全部评论 (0)

还没有任何评论哟~