python学习笔记(二) python3中为什么range(1,3)==[1,2],return False

本文主要参考(可能需要科学上网):
[1] https://www.pythoncentral.io/pythons-range-function-explained/
[2] https://justindailey.blogspot.com/2011/09/python-range-vs-xrange.html

工作环境是Ubuntu14.04LTS下terminal。
一般Ubuntu都会帮我们安装好python,按“ctrl+alt+t”就可以进入terminal。系统里面一般还会备有两个版本的python:python2.x和python3.x。直接输入python的话能够启动系统中的python2.x版本,如果想启动python3.x版本,就使用python3命令。运行也是一样,启动python2.x版本程序直接使用python name.py就行,如果想让python3.x来运行的话,就使用python3 name.py命令。
range是一个比较基础的函数,可以用他来生成我们想要的数字序列。之前用的python2.x版本,他直接就返回的是一个list,所以之前没注意。现在用python3,抱着好奇的心态在命令行中试了下:range(1, 3) == [1, 2]没想到居然返回了False,这让我一时半会儿很懵。
网上找了找,看了看几个帖子之后,解决了心中的疑惑,下面将问题的解答记录如下,希望能够为初学者提供帮助:
1. 基础知识 python的range()函数
range()函数有两种参数类型:
range(stop)
  stop: Number of integers (whole numbers) to generate, starting from zero. eg. range(3) == [0, 1, 2].
range([start], stop[, step])
  start: Starting number of the sequence.
  stop: Generate numbers up to, but not including this number.
  step: Difference between each number in the sequence.
需要注意的是这些参数:
* 必须为整数
* 可以为正数或负数
* 产生的序列是包含开头而不包含停止的,如range(0,5)产生的是从0开始而不包括5的整数
2. range()和xrange()函数
除了range()函数以外,python中还有一个函数叫做xrange(),这个函数是在python2.x版本中的。在python3.x版本中,xrange()名字被改成了range(),而老版本的range()函数被舍弃了。那么这两个函数有什么不同呢?
在python2.x中,range()的调用结果将返回一个list,而xrange()将返回一个迭代量(一个类,即class 'range')。所以说,在python3.x版本中range(1,3) == [1,2],会返回False。而在2.x版本中则会返回True。因为在python3.x中,range()有了自己的类型,所以造成了结果的不同。这样的后果就是,python3.x中,你不能使用切片来访问range()的返回值了。幸运的是,你可以通过list()函数将range类型转换成一个列表来使用。
但是这个返回的类型似乎并不太影响我们使用它们。甚至在一些循环中,你根本不需要考虑这样的区别,有时你在python2.x和python3.x版本中可以用相同的for循环达成想要的结果。那么,python在后续的3.x版本中为什么要舍弃原来的range(),或者python2.x版本中,为什么要多一个xrange()函数呢?
这是由于range类型是一个迭代类型,他在for循环的每一次执行过程中,将动态的得到下一个值。而旧版本的range()由于返回值是一个list,所以在运行for循环之前就需要得到整个list的数值。如果range()的范围很大的话,这将会加重内存的负担,而range类型的这种动态生成的特性使得它能够使用更少的内存,快速的运行。原始版本的range()和xrange()运行速度的比较可以参考文献[2]。

 

posted @ 2018-04-10 17:13  NeoScofield  阅读(1994)  评论(0编辑  收藏  举报