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]。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM