分享

最详细的python生成器分类与详解

 xiaoyimin 2019-06-22

python强大的引进-生成器。这就是我们今天要学习的这一章内容。

定义:

在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。换句更简单的话来理解:任何包含yield语句的函数称为为生成器。

好处:

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。

工作原理:

它是在for循环的过程中不断计算出下一个元素,并在适当的条件结束for循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

如何创建:

1. 只要把一个列表生成式的【】换成()就可以。

2. 上图的例子是用yield来说明一下怎么创建生成器。

打开百度App,看更多图片

其实与创建函数类似: 区别是,创建函数是return返回值。创建生长期是yield产生多个值,每次产生一个,函数就会冻结,等在那里等待被再次激活。等激活后从停止的那点开始执行。

生成器种类:

A. 循环生成器。与列表推导式类似。只不过一个是返回列表一个是返回生成器(不会立刻循环)。请看下面例子来说明区别。

>>> L = [x * x for x in range(10)]

>>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> g = (x * x for x in range(10))

>>> g

at 0x104feab40>

>>> for n in g:

print n

B. 递归生成器。

C. 通用生成器:

生成器的组成 1. 生成器函数: def定义,包含yield部分。

2. 生成器迭代器:这个函数的返回部分。

生成器方法

send

类似于next,在比不过需要一个发送的参数。

def repeater(value):

while True:

new=(yield value)

if new is not None:value=new

>>> r=repeater(42)

>>> r.next()

42

>>> r.send('hello world')

'hello world'

throw方法:

使用异常类型调用,还有可选的值以及回溯对象,用于生成器内引发一个异常。(在yield表达式中)

close方法:

调用时不要参数,用于停止生成器。

模拟生成器

当旧版本不能使用时生成器时,需要普通函数模拟生成器。

方式:1. result=[]防御函数体开始处。

2. yield some_expression 用result.append(some_expression)代替。

3.函数末尾添加return result

注:前面的递归生成器flatten就可以用普通函数重写模拟生成器。

案例总结

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多