平心在线:Python3 生成器剖析

admin/2020-07-17/ 分类:科技/阅读:

第6章 函数

  • 6.1 函数的界说和挪用
  • 6.2 参数通报
  • 6.3 函数返回值
  • 6.4 变量作用域
  • 6.5 匿名函数(lambda)
  • 6.6 递归函数
  • 6.7 迭代器
  • 6.8 天生器
  • 6.9 装饰器

6.8 天生器

看看廖雪峰大神的注释:

通过列表天生式,我们可以直接建立一个列表。然则,受到内存限制,列表容量肯定是有限的。
而且,建立一个包罗100万个元素的列表,不仅占用很大的存储空间,若是我们仅仅需要接见前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
以是,若是列表元素可以根据某种算法推算出来,那我们是否可以在循环的过程中不停推算出后续的元素呢?
这样就不必建立完整的list,从而节约大量的空间。

在Python中,这种一边循环一边盘算的机制,称为天生器(Generator)

天生器generator也是一种迭代器,然则你只能对其迭代一次。这是由于它们并没有把所有的值存在内存中,而是在运行时天生值

天生器generator工具是一种特殊的迭代器iterator函数,它会在执行过程中保留执行的上下文环境,并在下次循环中从yield语句后继续执行,天生器的标志就是yield关键字。

generator不需要抛出StopIteration异常(你可以看做yield已经在内部实现了StopIteration跳出循环),函数并没有将序列项一次天生,以是generator在实现上可以有无限个元素,而不需要无限的存储空间,这在内存优化方面很有用处。

使用isinstance(实体名,Generator)可判断是否为天生器。

# 验证下一个列表是否为可迭代工具Iterable、迭代器Iterator、天生器Generator from collections.abc import Iterator, Iterable, Generator province = ['Guangdong', 'HuNan', 'JiangSu', 'HeNan', 'HeBei'] print(isinstance(province, Iterator), isinstance(province, Iterable), isinstance(province, Generator)) output: False True False # 从效果来看,一个列表是可迭代工具但不是迭代器,也不是天生器 

你通过遍历来使用它们,要么用一个for循环,要么将它们通报给随便可以举行迭代的函数和结构。大多数时刻天生器是以函数来实现的。然而,它们并不返回一个值,而是yield(暂且译作“生出”)一个值。

天生器的建立设施有两种:

  • 通过函数建立,称作天生器函数generator function
  • 通过推导式建立,例如g=(x*2 for x in range(10)),称作天生器表达式generator expression

每次对天生器挪用 next() 时,它会从上次脱离位置恢复执行(它会记着上次执行语句时的所有数据值)。显示若何异常容易地建立天生器的示例如下:

def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] >>> for char in reverse('golf'): ... print(char) ... f l o g 

可以用天生器来完成的操作同样可以用前一节所形貌的基于类的迭代器来完成。但天生器的写法更为紧凑,由于它会自动建立 iter()next()方式。

天生器表达式generator expression

天生器不一定要用庞大的函数示意,python提供了简练的天生器表达式。

从形式上来看,天生器表达式和列表推导式很像,仅仅是将列表推导式中的[]替换为(),然则两者差异挺大,天生器表达式可以说组合了迭代功效和列表剖析功效。

天生器表达式可以认为是一种特殊的天生器函数,类似于lambda表达式和通俗函数。然则和天生器一样,天生器表达式也是返回天生器generator工具,一次只返回一个值

# 天生器表达式 g = (x*2 for x in range(4)) print(type(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) f = (i*i for i in range(10)) print(type(f)) print(next(f)) print(next(f)) print(next(f)) print(next(f)) output: <class 'generator'> 0 2 4 6 <class 'generator'> 0 1 4 9 
,

AllbetGmaing电脑版下载

欢迎进入AllbetGmaing电脑版下载(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

TAG:
阅读:
广告 330*360
广告 330*360
Sunbet_进入申博sunbet官网
微信二维码扫一扫
关注微信公众号
新闻自媒体 Copyright © 2002-2019 Sunbet 版权所有
二维码
意见反馈 二维码