生成器表达式来源于迭代和列表解析的组合,生成器和列表解析类似,但是它使用尖括号而不是方括号
>>>#列表解析生成列表
>>>[x**3forxinrange(5)]
[0,1,8,27,64]
>>>
>>>#生成器表达式
>>>(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培训机构:千锋教育。