当前位置: 首页 > 后端技术 > Python

Python生成器详解

时间:2023-03-26 17:04:39 Python

Python生成器,首先,生成器是初级Python开发者最难理解的概念之一。虽然它们被认为是Python编程的高级技能,但它们可以用于各种项目。无论你在哪里看到发电机,你都必须了解它、使用它,甚至喜欢它。  说到生成器,难免要拉出迭代器进行比较。生成器是一个在行为上与迭代器非常相似的对象。如果把迭代器比作Android系统,那么生成器就是iOS,两者功能相似,只是生成器更优雅。  什么是迭代器  顾名思义,迭代器是用于迭代操作(for循环)的对象。它可以像列表一样迭代获取其中的每一个元素。任何实现了__next__方法(??python2是next)的对象都可以称为迭代器。  它和列表的区别在于,在构建迭代器的时候,不像列表一次把所有元素加载到内存中,它以惰性求值的方式返回元素,这正是它的优势所在。例如,如果一个列表包含1000万个整数,则需要占用超过400M的内存,而迭代器只需要几十个字节的空间。因为它并没有把所有的元素都加载到内存中,而是等到next方法调用后才返回元素(按需调用callbyneed的方法,本质上for循环就是不断调用迭代器的next方法)。以斐波那契数列为例实现迭代器:.n>0:value=self.curself.cur=self.cur+self.prevself.prev=valueself.n-=1返回值else:raiseStopIteration()兼容python2def__next__(self):returnself.next()f=Fib(10)print([iforiinf])[1,1,2,3,5,8,13,21,34,55]什么是生成器知道了迭代器之后,就可以正式进入生成器的话题就结束了。普通函数使用return返回一个值,这点和Java等其他语言一样。然而,Python中还有一个函数使用关键字yield来返回一个值。该函数称为生成器函数。当函数被调用时,返回一个生成器对象,本质上是一个迭代器,迭代器也是用在迭代操作中的,所以它和迭代器具有相同的特性。唯一的区别是实现方式不同。后者更简洁,也是最简单的生成器函数:deffunc(n):...yieldn*2...funcg=func(5)gfuncis调用时返回一个对象的生成器函数就是生成器g。这个生成器对象的行为和迭代器非常相似,可以用在for循环等场景中。注意yield对应的值不会在调用函数时立即返回,而是在调用next方法时返回(本质上for循环也是调用了next方法)g=func(5)next(g)10g=func(5)foriing:...print(i)...10那么为什么要使用生成器呢?很明显,使用生成器在威力上要比迭代器高好几个层次。它没有那么多冗余代码,性能同样高效。为什么不使用它?让我们看看用生成器实现斐波那契数列是多么容易。deffib(n):prev,curr=0,1whilen>0:n-=1yieldcurrprev,curr=curr,curr+prevprint([iforiinfib(10)])[1,1,2,3,5,8,13,21,34,55]Generatorexpressions在之前的文章《这样写代码更优雅》中介绍了列表推导(listcomprehension),生成器表达式和listcomprehension很长很相似,但是他们返回的对象不同,前者返回一个生成器对象,后者返回一个列表对象。g=(x*2forxinrange(10))type(g)l=[x*2forxinrange(10)]type(l)