在Python里面,有两个非常简便的方法去构造列表,或者去用于构造整数循环,这两个方法就是xrange和range,也许你已经猜到了。
下面我们就来说说两者的不同之处。
开始之前,我们先来讨论一下xrange和range的区别。
在大多数情况下,xrange和range的功能是完全相同的,他们都提供可迭代的整数列表。唯一的区别是range返回的是list对象,而xrange返回的是xrange对象。
这是什么意思呢?这是个好问题!这意味着xrange在运行时并不像range那样生成静态的列表,它通过调用类似yield的特殊技术来创建你需要的值,这种技术与generators对象一起使用。如果你想了解更多关于generators和yield关键字,请阅读这篇文章:Python generators and the yield keyword
好了,那上面提的是什么意思呢?意思就是在当你需要生成一个巨大的列表时,比如说十亿,用xrange将是一个好的方法。尤其是当你需要在内存比较小的系统上面跑代码的时候,比如手机上面,range将会耗费大量的内存去创建这个整数数组。那也许会导致MemoryError或者程序崩溃。
虽然上面那样说了,但是当你需要多次去使用一个列表的时候,也许使用range会更好,这是因为xrange在每次去索引的时候都需要去迭代的生成一系列整数对象,因为range是静态生成的,所以只需要创建一次。
好了,干货来了。
怎样去使用Python中的range和xrange
那我们到底该怎样去使用range和xrange呢?下面给出一些例子:
>>> for i in xrange(10):
... print(i)
...
0
1
2
3
4
5
6
7
8
9
好的,例子虽然简单但是已经足够了,上面xrange的用法同样适用于xrange,但是我个人觉得xrange更好,也许是由于性感的“x”在前面吧。
解释一下吧,xrange和range总共可以接受三个参数,但是其中的两个是可选的,这些参数分别是:”start”,”stop”和”step”,“start”表示的是你的列表的开始,“stop”指的是你的列表的结束数,“step”指的是你的列表元素每次的增量。
用Python的xrange和range来生成奇数
我只需要奇数,那儿是一些方法可以实现:
>>> for i in xrange(1, 10, 2):
... print(i)
...
1
3
5
7
9
我指定python的第一个元素是1,最后一个元素是10,并且每个元素的增量是2,真的很简单。
用Python的xrange和range生成负数
想想,我们该怎样生成负数的列表呢?
下面是一个简单的例子:
>>> for i in xrange(-1, -10, -1):
... print(i)
...
-1
-2
-3
-4
-5
-6
-7
-8
-9
我们通过改变“start”,“stop”,“step”来生成负数,请注意的是想生成负数列表,那么你必须这么做,像xrange(-10)这样的方法将不能达到目的,因为range和xrange的默认“step”是1。
其他一些在Python中使用range和xrange的例子
下面是生成100到120之间的偶数的例子:
>>> for i in xrange(100, 120, 2):
... print(i)
...
100
102
104
106
108
110
112
114
116
118
这就是range和xrange,如果你想了解更多关于这两个函数的知识,请参照python的xrange和range文档
如果你传入的“start”比“stop”大,那么将返回一个空的列表,如果“step”比“stop”与“start”的差大,那么“stop”的值将会被增大到“step”,且返回的列表中只包含“start”一个元素。
下面的一些例子将使你更清楚:
>>> for i in xrange(70, 60):
... print(i)
...
# Nothing is printed
>>> for i in xrange(10, 60, 70):
... print(i)
...
10
弃用python中的xrange
再多说一点,在python3.x中,xrange函数已经不复存在了,python3.x中的range就是python2.x中的xrange。因此为了你的代码的可移植性,可能你就需要坚持使用range,当然,你也可以使用python2转python3工具来转换你的代码,但是这又带来了额外的麻烦。
xrange被删去的原因是想让人们更好的去使用它,并且这种影响可以忽略不计。也就是说python3.x中的range就是python2.x中的xrange。
你能在PEP文档中找到去掉xrange的原因。
好了,到这里就结束了,骚年。
原版英文文档参见:http://pythoncentral.io/how-to-use-pythons-xrange-and-range/
本文固定连接:http://blog.dreamchasinger.cn/?p=606
欢迎访问我的自建博客:http://blog.dreamchasinger.cn/