生成器与序列对象

Moi*_*Tux 11 python

我知道之间的区别rangexrange.
但我很惊讶地发现这xrange不是一个generator而是一个sequence object.

那么有什么不同,如何创建一个sequence object和什么时候使用它generator

mgi*_*son 14

xrange是一个序列对象的原因是因为它支持序列方法接口.例如,您可以将其编入索引(这是使用vanilla生成器无法做到的事情):

print xrange(30)[5]  # No Error
Run Code Online (Sandbox Code Playgroud)

换一种说法,

  • 如果某个序列支持该链接中定义的所有方法,则它是一个序列.
  • 如果它是一个生成器,它可能只支持几种方法(.next或者.__next__是最重要的)1.
  • 还有一个中间的土地,它是"可迭代的" - "iterables"有一个典型的2定义的__iter__方法,它返回"生成器"(具有明确定义.next.__next__3方法的东西)
  • 为了完整,你经常会看到人们说"迭代器"与生成器非常相似(实现__iter__它返回对象本身并具有良好定义next和/或__next__方法).

可以在文档词汇表中找到更正式的定义

1台发电机也支持__iter__并简单地自行返回.所以,所有的生成器都是迭代器(和迭代器!),但并非所有的迭代器(迭代器)都是生成器.如注释中所指出的,
2__len__ + __getitem__足以创建一个iterable.
3__next__是python3.x的方法名称