小猿圈002 发表于 2019-7-3 18:08:10

小猿圈讲解Python生成器

对于不了解Python的小伙伴来说Python生成器是一个陌生的词汇,今天小猿圈Python讲师就介绍下Python生成器是什么?下面我先看看Python生成器的基本概念。首先生成器是Python初级开发者最难理解的概念之一,虽被认为是Python编程中的高级技能,但在各种项目中可以随处见到生成器的身影。https://upload-images.jianshu.io/upload_images/15397392-4b1d8d5081f9f68e.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240


提到生成器,总不可避免地要把迭代器拉出来对比着讲,生成器就是一个在行为上和迭代器非常类似的对象,如果把迭代器比作Android系统,那么生成器就是iOS,二者功能上差不多,但是生成器更优雅。什么是迭代器顾名思义,迭代器就是用于迭代操作(for循环)的对象,它像列表一样可以迭代获取其中的每一个元素,任何实现了__next__方法(python2是next)的对象都可以称为迭代器。它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种延迟计算(lazyevaluation)方式返回元素,这正是它的优点。比如列表含有中一千万个整数,需要占超过400M的内存,而迭代器只需要几十个字节的空间。因为它并没有把所有元素装载到内存中,而是等到调用next方法时候才返回该元素(按需调用callbyneed的方式,本质上for循环就是不断地调用迭代器的next方法)。以斐波那契数列为例来实现一个迭代器:class Fib:def __init__(self, n):self.prev = 0self.cur = 1self.n = ndef __iter__(self):return selfdef __next__(self):if self.n > 0:value = self.curself.cur = self.cur + self.prevself.prev = valueself.n -= 1return valueelse:raise StopIteration()# 兼容python2def __next__(self):return self.next()f = Fib(10)print()#什么是生成器知道迭代器之后,就可以正式进入生成器的话题了。普通函数用return返回一个值,和Java等其他语言是一样的,然而在Python中还有一种函数,用关键字yield来返回值,这种函数叫生成器函数,函数被调用时会返回一个生成器对象,生成器本质上还是一个迭代器,也是用在迭代操作中,因此它有和迭代器一样的特性,唯一的区别在于实现方式上不一样,后者更加简洁最简单的生成器函数:>>> def func(n):... yield n*2...>>> func<function func at 0x00000000029F6EB8>>>> g = func(5)>>> g<generator object func at 0x0000000002908630>>>>func就是一个生成器函数,调用该函数时返回对象就是生成器g,这个生成器对象的行为和迭代器是非常相似的,可以用在for循环等场景中。注意yield对应的值在函数被调用时不会立刻返回,而是调用next方法时(本质上for循环也是调用next方法)才返回>>> g = func(5)>>> next(g)10>>> g = func(5)>>> for i in g:... print(i)...10那为什么要用生成器呢?显然,用生成器在逼格上要比迭代器高几个等级,它没有那么多冗长代码了,而且性能上一样的高效,为什么不用呢?来看看用生成器实现斐波那契数列有多简单。def fib(n):prev, curr = 0, 1while n > 0:n -= 1yield currprev, curr = curr, curr + prevprint()#生成器表达式在前面一期「这样写代码更优雅」的文章里面曾经介绍过列表推导式(listcomprehension),生成器表达式与列表推导式长的非常像,但是它俩返回的对象不一样,前者返回生成器对象,后者返回列表对象。>>> g = (x*2 for x in range(10))>>> type(g)<type 'generator'>>>> l = >>> type(l)<type 'list'>以上就是小猿圈讲师对于Python生成器的介绍,如果你对Python感兴趣的话可以到小猿圈去观看更多视频资料,小猿圈Python讲师提示大家学习Python基础要重新开始学习Python交流群:874680195,边学习边练习,这样学习起来会更有效果,希望本篇文章对于正在学习的你有所帮助。
页: [1]
查看完整版本: 小猿圈讲解Python生成器