Python xrange和生成器之间的区别?

2024-09-26 17:56:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我偶然发现了各种xrange和Python生成器的博文和研究材料,但很长时间以来,我从未看到有人将这两种东西进行比较

XyRead在Python 3+中是不被接受的,但是我们可以将Python 2 XRead升级为版本吗?

两者都使用迭代器对象,都使用next()调用。但我学到的发电机的优点是,我们可以让它暂停“产量”,这对xrange来说是不可能的

请帮助我理解两者的概念,以及在何种意义上它们是不同的? 还有为什么xrange不得不弃用


Tags: 对象版本概念发电机next优点意义材料
2条回答

rangegenerator对象都是iterable对象的示例

range由停止值定义,允许使用可选的起始值和可选的步长。结果是整数的iterable。Arange还支持其他iTerable不一定支持的操作(如包含)

一个generator由一个生成器表达式或一个生成器函数定义,这两个表达式中的任何一个都会导致任意值的iterable

range对象的iterable方面可以由generator模拟:

def myrange(stop, start=None, step=None):
    if start is not None:
        from_ = stop
        to_ = start
    else:
        from_ = 0
        to_ = stop

    if step is None:
        step = 1 if from_ < to_ else -1

    while from_ < to_:
         yield from_
         from_ += step

然后

>>> list(myrange(1, 10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1, 10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

由于Python2在将近一年前就已经寿终正寝,所以没有太多的理由进入range。可以说,在Python中,2range是一个返回整数列表的函数,而xrange是一个值表示整数列表的类型。Python3去掉了函数,并重新使用了类型的名称

Both uses a iterator objects, both uses next() call. But the advantage of generator I learnt, we could make it pause with "yield", which is no such such thing for xrange.

xrange在迭代之间会暂停。比较这两行Python 2代码:

>>> a = range(150000000)   # takes about 3 seconds and 5 GB on my machine
>>> b = xrange(150000000)   # instant on my machine

range实际上是在内存中构建整个列表。您可以通过在输入时看到系统RAM使用率上升来验证这一点

xrange实际上是在迭代之间暂停/让步。如果我们在for循环中迭代b,它只会在第一次迭代中生成第一个元素(0),然后在第二次迭代中生成第二个元素(1),依此类推

以下是一种将xrange实现为生成器的方法:

def my_range(stop):
    start = 0
    while start < stop:
        yield start
        start += 1
>>> c = my_range(150000000)

这里有两个注释:

相关问题 更多 >

    热门问题