📜  Python中的 range() 与 xrange()

📅  最后修改于: 2022-05-13 01:55:25.662000             🧑  作者: Mango

Python中的 range() 与 xrange()

range() 和 xrange() 是两个函数,可用于在Python的 for 循环中迭代一定次数。在Python 3 中,没有 xrange,但 range函数的行为类似于Python 2 中的 xrange。如果要编写可在Python 2 和Python 3 上运行的代码,则应使用 range()。

  • range() – 这将返回一个范围对象(一种可迭代的类型)。
  • xrange() – 此函数返回生成器对象,该生成器对象只能通过循环来显示数字。唯一的特定范围是按需显示的,因此称为“惰性评估”。

两者都以不同的方式实现,并具有与之相关的不同特征。比较点如下:

  • 返回类型
  • 记忆
  • 操作使用
  • 速度

返回类型

range() 返回 -范围对象。
xrange() 返回 – xrange()对象。

Python
# Python code to demonstrate range() vs xrange()
# on  basis of return type
 
# initializing a with range()
a = range(1,10000)
 
# initializing a with xrange()
x = xrange(1,10000)
 
# testing the type of a
print ("The return type of range() is : ")
print (type(a))
 
# testing the type of x
print ("The return type of xrange() is : ")
print (type(x))


Python
# Python code to demonstrate range() vs xrange()
# on  basis of memory
 
import sys
 
# initializing a with range()
a = range(1,10000)
 
# initializing a with xrange()
x = xrange(1,10000)
 
# testing the size of a
# range() takes more memory
print ("The size allotted using range() is : ")
print (sys.getsizeof(a))
 
# testing the size of x
# xrange() takes less memory
print ("The size allotted using xrange() is : ")
print (sys.getsizeof(x))


Python
# Python code to demonstrate range() vs xrange()
# on  basis of operations usage
 
# initializing a with range()
a = range(1,6)
 
# initializing a with xrange()
x = xrange(1,6)
 
# testing usage of slice operation on range()
# prints without error
print ("The list after slicing using range is : ")
print (a[2:5])
 
# testing usage of slice operation on xrange()
# raises error
print ("The list after slicing using xrange is : ")
print (x[2:5])


输出:

The return type of range() is : 

The return type of xrange() is : 

记忆

与使用 xrange() 存储范围的变量相比,存储由range () 创建的范围的变量占用更多内存。其基本原因是 range() 的返回类型是 list 而 xrange() 是 xrange() 对象。

Python

# Python code to demonstrate range() vs xrange()
# on  basis of memory
 
import sys
 
# initializing a with range()
a = range(1,10000)
 
# initializing a with xrange()
x = xrange(1,10000)
 
# testing the size of a
# range() takes more memory
print ("The size allotted using range() is : ")
print (sys.getsizeof(a))
 
# testing the size of x
# xrange() takes less memory
print ("The size allotted using xrange() is : ")
print (sys.getsizeof(x))

输出:

The size allotted using range() is : 
80064
The size allotted using xrange() is : 
40

操作使用

由于 range() 返回列表,因此可以在列表上应用的所有操作都可以在其上使用。另一方面,由于 xrange() 返回 xrange 对象,与 list 关联的操作不能应用于它们,因此是不利的。

Python

# Python code to demonstrate range() vs xrange()
# on  basis of operations usage
 
# initializing a with range()
a = range(1,6)
 
# initializing a with xrange()
x = xrange(1,6)
 
# testing usage of slice operation on range()
# prints without error
print ("The list after slicing using range is : ")
print (a[2:5])
 
# testing usage of slice operation on xrange()
# raises error
print ("The list after slicing using xrange is : ")
print (x[2:5])

错误:

Traceback (most recent call last):
  File "1f2d94c59aea6aed795b05a19e44474d.py", line 18, in 
    print (x[2:5])
TypeError: sequence index must be integer, not 'slice'

输出:

The list after slicing using range is : 
[3, 4, 5]
The list after slicing using xrange is : 

速度

由于 xrange() 仅评估仅包含惰性评估所需值的生成器对象,因此在实现上比 range()更快

要点:

  • 如果您想编写可在Python 2 和Python 3 上运行的代码,请使用 range(),因为 xrange函数在Python 3 中已弃用。
  • 如果多次迭代相同的序列,range() 会更快。
  • xrange() 每次都必须重建整数对象,但 range() 将具有真正的整数对象。 (然而,它在内存方面的表现总是更差)
range()xrange()
Returns a list of integers.Returns a generator object.
Execution speed is slowerExecution speed is faster.
Takes more memory as it keeps the entire list of elements in memory.Takes less memory as it keeps only one element at a time in memory.
All arithmetic operations can be performed as it returns a list.Such operations cannot be performed on xrange().
In python 3, xrange() is not supported.In python 2, xrange() is used to iterate in for loops.