生成器与序列对象

时间:2014-06-30 22:01:22

标签: python

我知道rangexrange之间的区别 但我很惊讶xrange不是generator而是sequence object

有什么区别,如何创建sequence object以及何时使用generator

2 个答案:

答案 0 :(得分:13)

xrange是序列对象的原因是因为它支持sequence methods interface。例如,您可以将其编入索引(这是您可以使用香草生成器执行的操作):

print xrange(30)[5]  # No Error

换句话说,

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

可以在documentation glossary

中找到更正式的定义

1 生成器也支持__iter__并简单地返回自己。所以,所有生成器都是迭代器(和迭代器!),但并非所有迭代器(迭代器)都是生成器。
2 __len__ + __getitem__足以创建一个可在评论中指出的迭代。
3 __next__是python3.x的方法名称

答案 1 :(得分:3)

sequence object是一种特殊的C提供类型。用户代码可以写generator

这是Python 2的东西 - 在Python 3中:

>>> print(type(range(1)))
<class 'range'>
>>> print(type(xrange(1)))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'xrange' is not defined

Python2:

Python 2.7.5+ (default, Feb 27 2014, 19:37:08) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print type(xrange(1))
<type 'xrange'>