百科狗-知识改变命运!

python生成器表达式

乐乐2年前 (2023-11-21)阅读数 39#技术干货
文章标签迭代

生成器表达式来源于迭代和列表解析的组合,生成器和列表解析类似,但是它使用尖括号而不是方括号

>>>#列表解析生成列表

>>>[x**3forxinrange(5)]

[0,1,8,27,64]

>>>

>>>#生成器表达式

python生成器表达式

>>>(x**3forxinrange(5))

at0x000000000315F678>

>>>#两者之间转换

>>>list(x**3forxinrange(5))

[0,1,8,27,64]

一个迭代既可以被写成生成器函数,也可以被协程生成器表达式,均支持自动和手动迭代。而且这些生成器只支持一个active迭代,也就是说生成器的迭代器就是生成器本身。

迭代器(迭代就是循环)

迭代器包含有next方法的实现,在正确的范围内返回期待的数据以及超出范围后能够抛出StopIteration的错误停止迭代。

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list,tuple,dict,set,str等

一类是generator,包括生成器和带yield的generatorfunction

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

可以使用isinstance()判断一个对象是否为可Iterable对象

>>>fromcollectionsimportIterable

>>>isinstance([],Iterable)

True

>>>isinstance({},Iterable)

True

>>>isinstance('abc',Iterable)

True

>>>isinstance((xforxinrange(10)),Iterable)

True

>>>isinstance(100,Iterable)

False

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

所以这里讲一下迭代器

一个实现了iter方法的对象是可迭代的,一个实现next方法并且是可迭代的对象是迭代器。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

所以一个实现了iter方法和next方法的对象就是迭代器。

可以使用isinstance()判断一个对象是否是Iterator对象:

>>>fromcollectionsimportIterator

>>>isinstance((xforxinrange(10)),Iterator)

True

>>>isinstance([],Iterator)

False

>>>isinstance({},Iterator)

False

>>>isinstance('abc',Iterator)

False

生成器都是Iterator对象,但list、dict、str虽然是Iterable(可迭代对象),却不是Iterator(迭代器)。

把list、dict、str等Iterable变成Iterator可以使用iter()函数:

>>>isinstance(iter([]),Iterator)

True

>>>isinstance(iter('abc'),Iterator)

True

你可能会问,为什么list、dict、str等数据类型不是Iterator?

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

以上内容为大家介绍了python生成器表达式,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:开发教育。

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)
{if $zbp->Config('yd1125')->foot}