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

提到生成器,总不可避免地要把迭代器拉进去比照着讲,生成器就是一个在行为上和迭代器十分相似的对象,如果把迭代器比作 Android 零碎,那么生成器就是 iOS,二者性能上差不多,然而生成器更优雅。

什么是迭代器
顾名思义,迭代器就是用于迭代操作(for 循环)的对象,它像列表一样能够迭代获取其中的每一个元素,任何实现了 next 办法
(python2 是 next)的对象都能够称为迭代器。

它与列表的区别在于,构建迭代器的时候,不像列表把所有元素一次性加载到内存,而是以一种提早计算(lazy evaluation)形式返回元素,这正是它的长处。比方列表含有中一千万个整数,须要占超过400M的内存,而迭代器只须要几十个字节的空间。因为它并没有把所有元素装载到内存中,而是等到调用 next 办法时候才返回该元素(call by need 的形式),实质上 for 循环就是一直地调用迭代器的next办法。

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

class Fib:    def __init__(self, n):        self.prev = 0        self.cur = 1        self.n = n    def __iter__(self):        return self    def __next__(self):        if self.n > 0:            value = self.cur            self.cur = self.cur + self.prev            self.prev = value            self.n -= 1            return value        else:            raise StopIteration()f = Fib(10)print([i for i in f])#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

什么是生成器
晓得迭代器之后,就能够正式进入生成器的话题了。一般函数用 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, 1    while n > 0:        n -= 1        yield curr        prev, curr = curr, curr + prevprint([i for i in fib(10)])#[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

生成器表达式
生成器表达式与列表推导式长的十分像,然而它俩返回的对象不一样,前者返回生成器对象,后者返回列表对象。

>>> g = (x*2 for x in range(10))>>> type(g)<type 'generator'>>>> l = [x*2 for x in range(10)]>>> type(l)<type 'list'>

后面曾经介绍过生成器的劣势,迭代大数据时,显然生成器更适合。

以上就是本次分享的全部内容,当初想要学习编程的小伙伴欢送关注Python技术大本营,获取更多技能与教程。