Python xrange如何让您测试会员资格?

Python xrange如何让您测试会员资格?,python,python-2.7,python-2.x,python-2.6,xrange,Python,Python 2.7,Python 2.x,Python 2.6,Xrange,每个人似乎都声称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返回了一台发电机,但这确实是它自己的事情:

>>> 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__'
如果这是一个真正的生成器,那么第二次检查将失败,因为我们已经遍历了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似乎有一些特殊之处,它可以让它正确地成为成员,好像它覆盖了_包含_。

事实证明,xrange确实不是真的

此时,有一个为量程逻辑供电的生成器,但也有一个range_contains_long函数进行比较,绕过生成器的迭代


因此,将xrange称为生成器有点误导。

事实上,xrange只是另一种类型,就像生成器一样,它是一个iterable,因为它定义了一个_uiter__;方法。生成器不是一个特定的类,它只是一组定义的行为。这并不意味着对象不能有超出生成器要求的其他行为。将xrange称为生成器绝对没有误导性。我想这取决于生成器的定义,但我认为生成器不允许您进行此成员资格检查。这个问题的根源是,在最长的一段时间里,我避免使用xrange进行成员资格检查,因为我错误地认为它会像生成器类型一样失败。
>>> 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