鍍金池/ 教程/ Python/ 列表(1)
標準庫 (4)
如何成為 Python 高手
標準庫 (6)
標準庫 (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習
列表(3)
從小工到專家
除法
錯誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準備
函數(shù)練習
標準庫 (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個簡單的程序
將數(shù)據(jù)存入文件
語句(5)
SQLite 數(shù)據(jù)庫
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語句(4)
錯誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標準庫 (1)
生成器
mysql 數(shù)據(jù)庫 (1)
第三方庫
實戰(zhàn)
運算符
類(3)
字典(2)
語句(1)
數(shù)和四則運算
語句(2)
文件(2)
MySQL 數(shù)據(jù)庫 (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫 (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標準庫 (5)
函數(shù)(4)
類(5)
字符串(2)
關于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學函數(shù)和運算優(yōu)先級
字符串(3)
為計算做準備
多態(tài)和封裝
類(4)
迭代
語句(3)
錯誤和異常 (3)
分析 Hello
Python 安裝
標準庫 (2)
列表(2)
元組

列表(1)

前面的學習中,我們已經(jīng)知道了兩種 Python 的數(shù)據(jù)類型:int 和 str。再強調(diào)一下對數(shù)據(jù)類型的理解,這個世界是由數(shù)據(jù)組成的,數(shù)據(jù)可能是數(shù)字(注意,別搞混了,數(shù)字和數(shù)據(jù)是有區(qū)別的),也可能是文字、或者是聲音、視頻等。在 Python 中(其它高級語言也類似)把狀如 2,3 這樣的數(shù)字劃分為一個類型,把狀如“你好”這樣的文字劃分一個類型,前者是 int 類型,后者是 str 類型(這里就不說翻譯的名字了,請看官熟悉用英文的名稱,對日后編程大有好處,什么好處呢?誰用誰知道!)。

前面還學習了變量,如果某個變量指向一個對象(某種類型的數(shù)據(jù))行話是:賦值),通常這個變量我們就把它叫做 int 類型的變量(注意,這種說法是不嚴格的,或者是受到別的語言影響的,在 Python 中,特別要注意:變量沒有類型,對象有類型。在 Python 里,變量不用提前聲明(在某些語言,如 JAVA 中需要聲明變量之后才能使用。這個如果看官沒有了解,不用擔心,因為我們是學習 Python,以后學習的語言多了,自然就能體會到這點區(qū)別了),隨用隨命名。

這一講中的 list 類型,也是 Python 的一種數(shù)據(jù)類型。翻譯為:列表。下面的黑字,請看官注意了:

LIST 在 Python 中具有非常強大的功能。

定義

在 Python 中,用方括號表示一個 list,[ ]

在方括號里面,可以是 int,也可以是 str 類型的數(shù)據(jù),甚至也能夠是 True/False 這種布爾值??聪旅娴睦?,特別注意閱讀注釋。

>>> a=[]        #定義了一個變量 a,它是 list 類型,并且是空的。
>>> type(a)
<type 'list'>   #用內(nèi)置函數(shù) type()查看變量 a 的類型,為 list
>>> bool(a)     #用內(nèi)置函數(shù) bool()看看 list 類型的變量 a 的布爾值,因為是空的,所以為 False
False
>>> print a     #打印 list 類型的變量 a
[]

bool()是一個布爾函數(shù),這個東西后面會詳述。它的作用就是來判斷一個對象是“真”還是“空”(假)。如果想上面例子那樣,list 中什么也沒有,就是空的,用 bool()函數(shù)來判斷,得到 False,從而顯示它是空的。

不能總玩空的,來點實的吧。

>>> a=['2',3,'qiwsir.github.io']
>>> a
['2', 3, 'qiwsir.github.io']
>>> type(a)
<type 'list'>
>>> bool(a)
True
>>> print a
['2', 3, 'qiwsir.github.io']

用上述方法,定義一個 list 類型的變量和數(shù)據(jù)。

本講的標題是“有容乃大的 list”,就指明了 list 的一大特點:可以無限大,就是說 list 里面所能容納的元素數(shù)量無限,當然這是在硬件設備理想的情況下。

如果看官以后或者已經(jīng)了解了別的語言,比如比較常見的 Java,里面有一個跟 list 相似的數(shù)據(jù)類型——數(shù)組——但是兩者還是有區(qū)別的。在 Java 中,數(shù)組中的元素必須是基本數(shù)據(jù)類型中某一個,也就是要么都是 int 類型,要么都是 char 類型等,不能一個數(shù)組中既有 int 類型又有 char 類型。這是因為 java 中的數(shù)組,需要提前聲明,聲明的時候就確定了里面元素的類型。但是 python 中的 list,盡管跟 java 中的數(shù)組有類似的地方——都是[]包裹的—— list 中的元素是任意類型的,可以是 int,str,甚至還可以是 list,乃至于是以后要學的 dict 等。所以,有一句話說:List 是 python 中的苦力,什么都可以干。

索引和切片

尚記得在《字符串(3)》中,曾經(jīng)給“索引”(index)和“切片”。

>>> url = "qiwsir.github.io"
>>> url[2]
'w'
>>> url[:4]
'qiws'
>>> url[3:9]
'sir.gi'

在 list 中,也有類似的操作。只不過是以元素為單位,不是以字符為單位進行索引了。看例子就明白了。

>>> a
['2', 3, 'qiwsir.github.io']
>>> a[0]    #索引序號也是從 0 開始
'2'
>>> a[1]
3
>>> [2]
[2]
>>> a[:2]   #跟str中的類似,切片的范圍是:包含開始位置,到結束位置之前
['2', 3]    #不包含結束位置
>>> a[1:]
[3, 'qiwsir.github.io']

list 和 str 兩種類型的數(shù)據(jù),有共同的地方,它們都屬于序列(都是一些對象按照某個次序排列起來,這就是序列的最大特征),因此,就有很多類似的地方。如剛才演示的索引和切片,是非常一致的。

>>> lang = "python"
>>> lang.index("y")
1
>>> lst = ['python','java','c++']
>>> lst.index('java')
1

在前面講述字符串索引和切片的時候,以及前面的演示,所有的索引都是從左邊開始編號,第一個是 0,然后依次增加 1。此外,還有一種編號方式,就是從右邊開始,右邊第一個可以編號為 -1,然后向左依次是:-2,-3,...,依次類推下來。這對字符串、列表等各種序列類型都是用。

>>> lang
'python'
>>> lang[-1]
'n'
>>> lst
['python', 'java', 'c++']
>>> lst[-1]
'c++'

從右邊開始編號,第 -1 號是右邊第一個。但是,如果要切片的話,應該注意了。

>>> lang[-1:-3]
''
>>> lang[-3:-1]
'ho'
>>> lst[-3:-1]
['python', 'java']

序列的切片,一定要左邊的數(shù)字小有右邊的數(shù)字,lang[-1:-3]就沒有遵守這個規(guī)則,返回的是一個空。

反轉

這個功能作為一個獨立的項目提出來,是因為在編程中常常會用到。通過舉例來說明反轉的方法:

>>> alst = [1,2,3,4,5,6]
>>> alst[::-1]    #反轉
[6, 5, 4, 3, 2, 1]
>>> alst
[1, 2, 3, 4, 5, 6]

當然,對于字符串也可以

>>> lang
'python'
>>> lang[::-1]
'nohtyp'
>>> lang
'python'

看官是否注意到,上述不管是 str 還是 lst 反轉之后,再看原來的值,沒有改變。這就說明,這里的反轉,不是在“原地”把原來的值倒過來,而是新生成了一個值,那個值跟原來的值相比,是倒過來了。

這是一種非常簡單的方法,雖然我在寫程序的時候常常使用,但是,我不是十分推薦,因為有時候讓人感覺迷茫。Python 還有另外一種方法讓list反轉,是比較容易理解和閱讀的,特別推薦之:

>>> list(reversed(alst))
[6, 5, 4, 3, 2, 1]

比較簡單,而且很容易看懂。不是嗎?

順便給出 reversed 函數(shù)的詳細說明:

>>> help(reversed)
Help on class reversed in module __builtin__:

class reversed(object)
 |  reversed(sequence) -> reverse iterator over values of the sequence
 |  
 |  Return a reverse iterator

它返回一個可以迭代的對象(關于迭代的問題,后續(xù)會詳述之),不過是已經(jīng)將原來的序列對象反轉了。比如:

>>> list(reversed("abcd"))
['d', 'c', 'b', 'a']

很好,很強大,特別推薦使用。

對 list 的操作

任何一個行業(yè)都有自己的行話,如同古代的強盜,把撤退稱之為“扯乎”一樣,縱然是一個含義,但是強盜們愿意用他們自己的行業(yè)用語,俗稱“黑話”。各行各業(yè)都如此。這樣做的目的我理解有兩個,一個是某種保密;另外一個是行外人士顯示本行業(yè)的門檻,讓別人感覺這個行業(yè)很高深,從業(yè)者有一定水平。

不管怎么,在 Python 和很多高級語言中,都給本來數(shù)學角度就是函數(shù)的東西,又在不同情況下有不同的稱呼,如方法、類等。當然,這種稱呼,其實也是為了區(qū)分函數(shù)的不同功能。

前面在對 str 進行操作的時候,有一些內(nèi)置函數(shù),比如 s.strip(),這是去掉左右空格的內(nèi)置函數(shù),也是 str 的方法。按照一貫制的對稱法則,對 list 也會有一些操作方法。

在講述字符串的時候,提到過,所有的序列,都有幾種基本操作。list 當然如此。

基本操作

  • len()

在交互模式中操作:

>>> lst
['python', 'java', 'c++']
>>> len(lst)
3
  • +,連接兩個序列

交互模式中:

>>> lst
['python', 'java', 'c++']
>>> alst
[1, 2, 3, 4, 5, 6]
>>> lst + alst
['python', 'java', 'c++', 1, 2, 3, 4, 5, 6]
  • *,重復元素

交互模式中操作

>>> lst
['python', 'java', 'c++']
>>> lst * 3
['python', 'java', 'c++', 'python', 'java', 'c++', 'python', 'java', 'c++']
  • in

列表 lst 還是前面的值

>>> "python" in lst
True
>>> "c#" in lst
False
  • max()和 min()

以 int 類型元素為例。如果不是,都是按照字符在 ascii 編碼中所對應的數(shù)字進行比較的。

>>> alst
[1, 2, 3, 4, 5, 6]
>>> max(alst)
6
>>> min(alst)
1
>>> max(lst)
'python'
>>> min(lst)
'c++'
  • cmp()

采用上面的方法,進行比較

>>> lsta = [2,3]
>>> lstb = [2,4]
>>> cmp(lsta,lstb)
-1
>>> lstc = [2]
>>> cmp(lsta,lstc)
1
>>> lstd = ['2','3']
>>> cmp(lsta,lstd)
-1

追加元素

>>> a = ["good","python","I"]      
>>> a
['good', 'python', 'I']
>>> a.append("like")        #向 list 中添加 str 類型 "like"
>>> a
['good', 'python', 'I', 'like']
>>> a.append(100)           #向 list 中添加 int 類型 100
>>> a
['good', 'python', 'I', 'like', 100]

官方文檔這樣描述 list.append()方法

list.append(x)

Add an item to the end of the list; equivalent to a[len(a):] = [x].

從以上描述中,以及本部分的標題“追加元素”,是不是能夠理解 list.append(x)的含義呢?即將新的元素 x 追加到 list 的尾部。

列位看官,如果您注意看上面官方文檔中的那句話,應該注意到,還有后面半句: equivalent to a[len(a):] = [x],意思是說 list.append(x)等效于:a[len(a):]=[x]。這也相當于告訴我們了另外一種追加元素的方法,并且兩種方法等效。

>>> a
['good', 'python', 'I', 'like', 100]
>>> a[len(a):]=[3]      #len(a),即得到 list 的長度,這個長度是指 list 中的元素個數(shù)。
>>> a
['good', 'python', 'I', 'like', 100, 3]
>>> len(a)
6
>>> a[6:]=['xxoo']
>>> a
['good', 'python', 'I', 'like', 100, 3, 'xxoo']

總目錄   |   上節(jié):字符編碼   |   下節(jié):列表(2)

如果你認為有必要打賞我,請通過支付寶:qiwsir@126.com,不勝感激。