【Python那些事儿】range()和xrange()

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/duxu24/article/details/52847237

无论是range()还是xrange()都是Python里的内置函数。这个两个内置函数最常用在for循环中。range()和xrange() 在Python 2里是两种不同的实现。


这里写图片描述

但是在Python 3里,range()这种实现被移除了;保留了xrange()的实现,且将xrange()重新命名成range()。

首先,我们来看Python 2里range()。它是一个内置函数,这个函数用于创建整数等差数列,因此它常被用于for循环。
从官方帮助文档,我们可以看出下面的特性:

  • 内置函数(built-in);
  • 接受3个参数分别是start, stop和step(其中start和step是可选的,stop是必需的);
  • 如果没有指定start,默认从0开始(Python都是从0开始的);
  • 如果没有指定step,默认step是1。(step不能是0,如果指定step为0,“ValueError: range() step argument must not be zero”将会被抛出)。

接下来看看xrange()。 xrange()虽然也是内置函数,但是它被定义成了Python里一种类型(type),这种类型就叫xrange。我们从Python 2的interactive shell里很容易看到这点。


这里写图片描述

从文档里可以看出,xrange和range的参数和用法是相同的。只是xrange()返回的不再是一个数列,而是一个xrange对象。这个对象可以按需生成参数指定范围内的数字(即元素)。由于xrange对象是按需生成单个的元素,而不像range那样,首先创建整个list。所以,在相同的范围内,xrange占用的内存空间将更小,xrange也会更快。实际上,xrange由于是在循环内被调用时才会生成元素,因此无论循环多少次,只有当前一个元素占用了内存空间,且每次循环占用的都是相同的单个元素空间。我们可以粗略的认为,相同n个元素的话,range占用的空间是xrange的n倍。因此,在循环很大情况下,xrange的高效率和快速将表现的很明显。

总结一下:

  • range()返回整个list;
  • xrange()返回的是一个xrange object,且这个对象是个iterable;
  • 两者都用与for循环;
  • xrange()占用更少的内存空间,因为循环时xrange()只生成当前的元素,不像range()一开始就成生成完整的list。
    这就是在Python 2里range和xrange的相同点和区别。

请理解下面这句话:
“The advantage of the range type over a regular list or tuple is that a range object will always take the same (small) amount of memory, no matter the size of the range it represents (as it only stores the start, stop and step values, calculating individual items and subranges as needed).”

展开阅读全文

没有更多推荐了,返回首页