今天运行程序时,发现出现 NameError:name 'xrange' is not defined 这个错误,程序是没有问题的,不要惊慌,版本问题。
一、问题出现原因
在 Python 2 中,经常会用 xrange() 创建一个可迭代对象,通常出现在 “for循环” 中,这种行为与生成器非常相似。在 Python 3 中,range() 的实现方式与 xrange() 函数相同,所以就不存在专用的 xrange(),如果你在Python 3使用xrange()就会出现 NameError:name 'xrange' is not defined 这个错误。
解决方法:将 xrange( ) 函数全部换为 range( )
二、xrange() 函数
xrange() 函数用法与 range 完全相同,range 生成的是一个数组,而 xrange() 生成的是一个生成器,每次按需生成一个值,只占用少量的内存空间。
xrange 语法:
- xrange (stop)
- xrange (start, stop[, step])
xrange 参数说明:
- start: 计数从 start 开始。默认是从 0 开始。例如 xrange(4) 等价于 xrange(0, 4)(语法12)
- stop: 计数到 stop 结束,但不包括 stop。例如:xrange(0, 4) 是 [0, 1, 2, 3 ] 没有 4(语法1)
- step:步长,默认为1。例如:xrange(0, 4) 等价于 xrange(0, 4, 1)是 [0, 1, 2, 3 ](语法2)
由于我用的是 Python 3 ,range() 的实现方式与 xrange() 函数相同,所以我就展示一下 range() 的用法,当然你也可以在Python 2 中试试 xrange() 的用法。
range(4)
Out[6]: range(0, 4)
list(range(4))
Out[7]: [0, 1, 2, 3]
list(range(0,4))
Out[8]: [0, 1, 2, 3]
list(range(0,8,2))
Out[9]: [0, 2, 4, 6]
在运行是我们发现 Python 3 中的 range() 和 Python 2 中 xrange() 执行速度有差异,由于这两者的实现方式相同,因此理论上执行速度应该也是相同的,这里的速度差别仅仅是因为 Python 3 的总体速度就比 Python 2 慢。
三、print 在 Python 2 和 Python 3 中的用法
Python 2中的print语句不带括号,当然额外的使用括号也行的。Python 3中的print()函数必须用括号将需要输出的对象括起来。如果在Python 3中不带括号调用print函数时,会触发SyntaxError: Missing parentheses in call to 'print'。