[每个人似乎都声称xrange
返回了一个生成器,但这实际上是它自己的事情:
>>> xrange(10)
xrange(10)
>>> xrange(10).__bases__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'xrange' object has no attribute '__bases__'
我不知道是xrange
如何让您检查会员资格。
>>> a = xrange(10)
>>> 4 in a
True
>>> 4 in a
True
如果这是真正的生成器,则第二次检查将失败,因为我们已经遍历了4。
>>> def mygen():
... num = 0
... while num < 100:
... yield num
... num += 1
...
>>>
>>> mygen()
<generator object mygen at 0x100618b40>
>>> list(mygen())
[0, ..., 99]
>>> x = mygen()
>>> 4 in x
True
>>> 4 in x
False
xrange
似乎有一些特别之处,它可以使其正确地成为成员身份,好像它覆盖了__contains__
。
事实证明,xrange
确实不是真实的<type 'generator'>
。
在cython level处,有一个生成器为范围逻辑提供动力,但还有一个range_contains_long
函数,它进行比较,绕过生成器的迭代。
因此,将xrange
称为generator
有点误导。