python生成器表达式

发布时间:2022-04-25 09:42:39 人气:22 作者:多测师

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

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

  >>> [ x ** 3 for x in range(5)]

  [0, 1, 8, 27, 64]

  >>>

  >>> # 生成器表达式

  >>> (x ** 3 for x in range(5))

  at 0x000000000315F678>

  >>> # 两者之间转换

  >>> list(x ** 3 for x in range(5))

  [0, 1, 8, 27, 64]

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

  迭代器(迭代就是循环)

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

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

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

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

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

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

python生成器表达式

  >>> from collections import Iterable

  >>> isinstance([], Iterable)

  True

  >>> isinstance({}, Iterable)

  True

  >>> isinstance('abc', Iterable)

  True

  >>> isinstance((x for x in range(10)), Iterable)

  True

  >>> isinstance(100, Iterable)

  False

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

  所以这里讲一下迭代器

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

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

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

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

  >>> from collections import Iterator

  >>> isinstance((x for x in range(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相关知识,请关注多测师。https://www.e70w.com/xwzx/


上一篇:python生成器函数
下一篇:python 时间模块
返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线