list的話題的確不少,而且,在編程中,用途也非常多。
有看官可能要問了,如果要生成一個list,除了要把元素一個一個寫上之外,有沒有能夠讓計算機自己按照某個規律生成list的方法呢?
如果你提出了這個問題,充分說明你是一個“懶人”,不過這不是什么壞事情,這個世界就是因為“懶人”的存在而進步。“懶人”其實不懶。
## 對list的操作
### range(start,stop)生成數字list
range(start, stop[, step])是一個內置函數。
要研究清楚一些函數特別是內置函數的功能,建議看官首先要明白內置函數名稱的含義。因為在python中,名稱不是隨便取的,是代表一定意義的。關于取名字問題,可以看參考本系列的:[永遠強大的函數](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/106.md)中的《取名字的學問》部分內容。
> range
>
> n. 范圍;幅度;排;山脈 vi. (在...內)變動;平行,列為一行;延伸;漫游;射程達到 vt. 漫游;放牧;使并列;歸類于;來回走動
在具體實驗之前,還是按照管理,摘抄一段[官方文檔的原話](https://docs.python.org/2/library/functions.html#range),讓我們能夠深刻理解之:
> This is a versatile function to create lists containing arithmetic progressions. It is most often used in for loops. The arguments must be plain integers. If the step argument is omitted, it defaults to 1\. If the start argument is omitted, it defaults to 0\. The full form returns a list of plain integers [start, start + step, start + 2 * step, ...]. If step is positive, the last element is the largest start + i * step less than stop; if step is negative, the last element is the smallest start + i * step greater than stop. step must not be zero (or else ValueError is raised).
從這段話,我們可以得出關于range()函數的以下幾點:
* 這個函數可以創建一個數字元素組成的列表。
* 這個函數最常用于for循環(關于for循環,馬上就要涉及到了)
* 函數的參數必須是整數,默認從0開始。返回值是類似[start, start + step, start + 2*step, ...]的列表。
* step默認值是1。如果不寫,就是按照此值。
* 如果step是正數,返回list的最最后的值不包含stop值,即start+i_step這個值小于stop;如果step是負數,start+i_step的值大于stop。
* step不能等于零,如果等于零,就報錯。
在實驗開始之前,再解釋range(start,stop[,step])的含義:
* start:開始數值,默認為0,也就是如果不寫這項,就是認為start=0
* stop:結束的數值,必須要寫的。
* step:變化的步長,默認是1,也就是不寫,就是認為步長為1。堅決不能為0
實驗開始,請以各項對照前面的講述:
~~~
>>> range(9) #stop=9,別的都沒有寫,含義就是range(0,9,1)
[0, 1, 2, 3, 4, 5, 6, 7, 8] #從0開始,步長為1,增加,直到小于9的那個數
>>> range(0,9)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> range(0,9,1)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> range(1,9) #start=1
[1, 2, 3, 4, 5, 6, 7, 8]
>>> range(0,9,2) #step=2,每個元素等于start+i*step,
[0, 2, 4, 6, 8]
~~~
僅僅解釋一下range(0,9,2)
* 如果是從0開始,步長為1,可以寫成range(9)的樣子,但是,如果步長為2,寫成range(9,2)的樣子,計算機就有點糊涂了,它會認為start=9,stop=2。所以,在步長不為1的時候,切忌,要把start的值也寫上。
* start=0,step=2,stop=9.list中的第一個值是start=0,第二個值是start+1_step=2(注意,這里是1,不是2,不要忘記,前面已經講過,不論是list還是str,對元素進行編號的時候,都是從0開始的),第n個值就是start+(n-1)_step。直到小于stop前的那個值。
熟悉了上面的計算過程,看看下面的輸入誰是什么結果?
~~~
>>> range(-9)
~~~
我本來期望給我返回[0,-1,-2,-3,-4,-5,-6,-7,-8],我的期望能實現嗎?
分析一下,這里start=0,step=1,stop=-9.
第一個值是0;第二個是start+1*step,將上面的數代入,應該是1,但是最后一個還是-9,顯然出現問題了。但是,python在這里不報錯,它返回的結果是:
~~~
>>> range(-9)
[]
>>> range(0,-9)
[]
>>> range(0)
[]
~~~
報錯和返回結果,是兩個含義,雖然返回的不是我們要的。應該如何修改呢?
~~~
>>> range(0,-9,-1)
[0, -1, -2, -3, -4, -5, -6, -7, -8]
>>> range(0,-9,-2)
[0, -2, -4, -6, -8]
~~~
有了這個內置函數,很多事情就簡單了。比如:
~~~
>>> range(0,100,2)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98]
~~~
100以內的自然數中的偶數組成的list,就非常簡單地搞定了。
思考一個問題,現在有一個列表,比如是["I","am","a","pythoner","I","am","learning","it","with","qiwsir"],要得到這個list的所有序號組成的list,但是不能一個一個用手指頭來數。怎么辦?
請沉思兩分鐘之后,自己實驗一下,然后看下面。
~~~
>>> pythoner
['I', 'am', 'a', 'pythoner', 'I', 'am', 'learning', 'it', 'with', 'qiwsir']
>>> py_index = range(len(pythoner)) #以len(pythoner)為stop的值
>>> py_index
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
~~~
再用手指頭指著pythoner里面的元素,數一數,是不是跟結果一樣。
### 排排坐,分果果
排序,不管在現實還是在網絡上都是隨處可見的。梁山好漢要從第一個排序到第108個,這是一個不很容易搞定的活。
前面提到的內置函數range()得到的結果,就是一個排好序的。對于一個沒有排好序的list,怎么排序呢?
有兩個方法可以實現對list的排序:
* list.sort(cmp=None, key=None, reverse=False)
* sorted(iterable[, cmp[, key[, reverse]]])
通過下面的實驗,可以理解如何排序的方法
~~~
>>> number = [1,4,6,2,9,7,3]
>>> number.sort()
>>> number
[1, 2, 3, 4, 6, 7, 9]
>>> number = [1,4,6,2,9,7,3]
>>> number
[1, 4, 6, 2, 9, 7, 3]
>>> sorted(number)
[1, 2, 3, 4, 6, 7, 9]
>>> number = [1,4,6,2,9,7,3]
>>> number
[1, 4, 6, 2, 9, 7, 3]
>>> number.sort(reverse=True) #開始實現倒序
>>> number
[9, 7, 6, 4, 3, 2, 1]
>>> number = [1,4,6,2,9,7,3]
>>> number
[1, 4, 6, 2, 9, 7, 3]
>>> sorted(number,reverse=True)
[9, 7, 6, 4, 3, 2, 1]
~~~
其實,在高級語言中,排序是一個比較熱門對的話題,如果有興趣的讀者,可以到我寫的[有關算法](https://github.com/qiwsir/algorithm/blob/master/README.md)中查看有關排序的話題。
至此,有關list的基本操作的內置函數,就差不多了。不過最后,還要告訴看官們一個學習方法。因為python的內置函數往往不少,有時候光憑教程,很難學到全部,那么,最關鍵地是要自己會查找都有哪些函數可以用。怎么查找呢?
## 一個非常重要的方法
假設有一個list,如何知道它所擁有的內置函數呢?請用help(),幫助我吧。
~~~
>>> help(list)
~~~
就能夠看到所有的關于list的函數,以及該函數的使用方法。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python