python中生成器的使用方法

  介绍

这篇文章给大家分享的是有关python中生成器的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

生成器是python初级开发者最难理解的概念之一,虽被认为是python编程中的高级技能,但在各种项目中可以随处见到生成器的身影,你得不得去理解它,使用它,甚至爱上它。

提到生成器,总不可避免地要把迭代器拉出来对比着讲,生成器就是一个在行为上和迭代器非常类似的对象,如果把迭代器比作Android系统,那么生成器就是iOS,二者功能上差不多,但是生成器更优雅。

什么是迭代器

顾名思义,迭代器就是用于迭代操作(循环)的对象,它像列表一样可以迭代获取其中的每一个元素,任何实现了__next__方法(python2是未来)的对象都可以称为迭代器。

它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算(懒惰的评价)方式返回元素,这正是它的优点,比如列表含有中一千万个整数,需要占超过400米的内存,而迭代器只需要几十个字节的空间,因为它并没有把所有元素装载到内存中,而是等到调用一方法时候才返回该元素(按需调用调用所需要的方式,本质上的循环就是不断地调用迭代器的下方法)。

以斐波那契数列为例来实现一个迭代器:

class 心房纤颤:   ,,,def  __init__(自我,,n):   ,,,,,,,self.prev =0   ,,,,,,,self.cur =1   ,,,,,,,self.n =n      ,,,def  __iter__(自我):   ,,,,,,,return 自我      ,,,def  __next__(自我):   ,,,,,,,if  self.n 祝辞,0:   ,,,,,,,,,,,value =self.cur   ,,,,,,,,,,,self.cur =, self.cur  + self.prev   ,,,,,,,,,,,self.prev =价值   ,,,,,,,,,,,self.n  -=1   ,,,,,,,,,,,return 价值   ,,,,,,,其他的:   ,,,,,,,,,,,raise 抛出StopIteration ()   ,,,#,兼容python2   ,,,def  __next__(自我):   ,,,,,,,return  self.next ()   f =, Fib (10)   打印([小姐:for 小姐:拷贝f))   #[1,,1,,2,,3,5,8日,13日,21日,34岁,55]

<强>什么是生成器

知道迭代器之后,就可以正式进入生成器的话题了。普通函数用返回返回一个值,和Java等其他语言是一样的,然而在Python中还有一种函数,用关键字收益率来返回值,这种函数叫生成器函数,函数被调用时会返回一个生成器对象,生成器本质上还是一个迭代器,也是用在迭代操作中,因此它有和迭代器一样的特性,唯一的区别在于实现方式上不一样,后者更加简洁

最简单的生成器函数:

在祝辞祝辞,def  func (n):   ,,,,,,油品收率n * 2   …   在祝辞祝辞func   & lt; function  func  at  0 x00000000029f6eb8>   在祝辞祝辞,g =, func (5)   在祝辞祝辞,g   & lt; generator  object  func  at  0 x0000000002908630>   祝辞祝辞祝辞

函数就是一个生成器函数,调用该函数时返回对象就是生成器g,这个生成器对象的行为和迭代器是非常相似的,可以用在为循环等场景中。注意收益率对应的值在函数被调用时不会立刻返回,而是调用下一方法时(本质上的循环也是调用下一方法)才返回

在祝辞祝辞,g =, func (5)   在祝辞祝辞,下一个(g)   10      在祝辞祝辞,g =, func (5)   在祝辞祝辞,for 小姐:旅客:拷贝   …,,,,,印刷(我)   …   10

那为什么要用生成器呢?显然,用生成器在逼格上要比迭代器高几个等级,它没有那么多冗长代码了,而且性能上一样的高效,为什么不用呢?来看看用生成器实现斐波那契数列有多简单。

def  fib (n):   ,,,上一页,,curr =0,, 1   ,,,while  n 祝辞,0:   ,,,,,,,n  -=1   ,,,,,,,油品收率咕咕叫   ,,,,,,,上一页,,curr =,咕咕叫,curr  +,上一页      打印([小姐:for 小姐:拷贝fib (10)))   #[1,,1,,2,,3,5,8日,13日,21日,34岁,55]

<强>生成器表达式

在前面一期“这样写代码更优雅”的文章里面曾经介绍过列表推导式(列表理解),生成器表达式与列表推导式长的非常像,但是它俩返回的对象不一样,前者返回生成器对象,后者返回列表对象。

在祝辞祝辞,g =, (x * 2, for  x 拷贝范围(10))   在祝辞祝辞,类型(g)   & lt; type  & # 39;发电机# 39;比;   在祝辞祝辞,l =, [x * 2, for  x 拷贝范围(10))   在祝辞祝辞,类型(左)   & lt; type  & # 39;列表# 39;在

python中生成器的使用方法