讀古今文學網 > 機器學習實戰 > A.2 Python入門 >

A.2 Python入門

下面介紹本書中用到的Python功能。本書不對Python做詳盡的描述,如果讀者有興趣,推薦閱讀Elkner、Downey和Meyers的在線免費資料:「How to Think Like a Computer Scientist」(http://www.openbookproject.net/thinkcs/)。本節還將介紹容器類型(collection type)和控制結構(control structure)。幾乎每種編程語言都有類似的功能,這裡著重給出它們在Python中的用法。本節最後介紹了列表推導式(list comprehension),這是初學Python時最容易感到困惑的部分。

A.2.1 容器類型

Python提供多種數據類型來存放數據項集合。此外,用戶還可以通過添加模塊創建出更多容器類型。下面列出了幾個Python中常用的容器。

  • 列表(List)—— 列表是Python中存放有序對象的容器,可以容納任何數據類型:數值、布爾型、字符串等等。列表一般用兩個括號來表示,下面的代碼演示了如何創建一個名為jj的列表,並在列表內添加一個整數和一個字符串:
>>> jj=
>>> jj.append(1)
>>> jj.append(\'nice hat\')
>>> jj
[1, \'nice hat\']
  

當然,還可以把元素直接放在列表裡。例如,上述列表jj還可以用下面的語句一次性構建出來:

>>> jj = [1, \'nice hat\'] 
  

與其他編程語言類似,Python中也有數組數據類型。但數組中僅能存放同一種類型的數據,在循環的時候它的性能優於列表。為避免跟NumPy中的數組產生混淆,本書將不會使用該結構。

  • 字典(Dictionary)—— 字典是一個存放無序的鍵值映射(key/value)類型數據的容器,鍵的類型可以是數字或者字符串。在其他編程語言中,字典一般被稱為關聯數組(associative array)或者映射(map)。下面的命令創建了一個字典並在其中加入了兩個元素:
>>> jj={}
>>> jj[\'dog\']=\'dalmatian\'
>>> jj[1]=42
>>> jj
{1: 42, \'dog\': \'dalmatian\'}   
  

同樣,也可以用一條命令來完成上述功能:

>>> jj = {1: 42, \'dog\': \'dalmatian\'}
  
  • 集合(Set)—— 這裡的集合與數學中集合的概念類似,是指由不同元素組成的合集。下面的命令可以從列表中創建一個集合來:
>>> a=[1, 2, 2, 2, 4, 5, 5]
>>> sA=set(a)
>>> sA
set([1, 2, 4, 5]) 
  

集合支持一些數學運算,例如並集、交集和補集。並集用管道的符號(|)來表示,交集用&符號來表示。

>>> sB=set([4, 5, 6, 7])
>>> sB
set([4, 5, 6, 7])
>>> sA-sB
set([1, 2])
>>> sA | sB
set([1, 2, 4, 5, 6, 7])
>>> sA & sB
set([4, 5])
  

A.2.2 控制結構

Python裡的縮進非常重要,這點也引來了也不少人的抱怨,但嚴格的縮進也能迫使編程人員寫出乾淨、可讀性強的代碼。在for循環、while循環或者是if語句中,縮進用來標識出哪一段代碼屬於本循環。這裡的縮進可以採用空格或者製表符(tab)來完成。而在其他的編程語言中,一般使用大括號{ }或者關鍵字來實現這一點。所以通過使用縮進來代替括號,Python還節省了不少代碼空間。下面來看一些常用控制語句的寫法:

  1. If——if語句非常的直觀,可以在一行內完成:

    >>> if jj < 3: print \"it\'s less than three man\" 
      

    也可以寫成多行,使用縮進來告訴編譯器本語句尚未完成。這兩種格式都是可以的。

    >>> if jj < 3:
    ... print \"it\'s less than three man\"
    ... jj = jj + 1 
      

    多條件語句的關鍵字else if在Python中寫做elif,而else在Python中仍寫做else

    >>> if jj < 3: jj+=1
    ... elif jj==3: jj+=0
    ... else: jj = 0
      
  2. For——Python中的for循環與Java或C++0x1中的增強的for循環類似,它的意思是用for循環遍歷集合中的每個元素。下面分別以列表、集合和字典為例來介紹for循環的用法:

    >>> sB=set([4, 5, 6, 7])
    >>> for item in sB:
    ... print item
    ...
    4
    5
    6
    7
      

    1. C++0x,後來也稱為C++11,即ISO/IEC 14882:2011,是目前的C++編程語言的正式標準。它取代第二版標準ISO/IEC 14882:2003(第一版ISO/IEC 14882:1998公開於1998年,第二版於2003年更新,分別通稱C++98以及C++03,兩者差異很小)。——譯者注

下面遍歷一部字典:

>>> jj={\'dog\': \'dalmatian\', 1: 45}
>>> for item in jj:
... print item, jj[item]
...
1 45
dog dalmatian  
  

可以看到,字典中的元素會按鍵值大小順序遍歷。

A.2.3 列表推導式

新手接觸到Python最容易困惑的地方之一就是列表推導式。列表推導式用較為優雅的方式生成列表,從而避免大量的冗余代碼。但語法有點彆扭,下面先看一下實際效果然後再做討論:

>>> a=[1, 2, 2, 2, 4, 5, 5]
>>> myList = [item*4 for item in a]
>>> myList
[4, 8, 8, 8, 16, 20, 20]  
  

列表推導式總是放在括號中。上述代碼等價於:

>>> myList=
>>> for item in a:
... myList.append(item*4)
...
>>> myList
[4, 8, 8, 8, 16, 20, 20] 
  

可以看到,得到的myList結果是一樣的,但列表推導式所需的代碼更少。可能造成困惑的原因是加入到列表的元素在for循環的前面。這點違背了從左到右的文本閱讀方式。

下面來看一個更高級的列表推導式的用法。如果只想保留大於2的元素:

>>> [item*4 for item in a if item>2]
[16, 20, 20] 
  

用列表推導式可以寫出更有創意的代碼,當然如果代碼很難被讀懂,應盡量實現出更好的高可讀性的代碼。回顧完這些基礎知識之後,下一節將介紹如何安裝本書用到的各種Python模塊。

對大多數純Python模塊(沒有和其他語言的綁定模塊)來說,直接進入代碼的解壓目錄,輸入>python setup.py install即可安裝。這是默認的安裝方式,如果對模塊安裝方法不太明確時,可以嘗試一下上述命令。Python將把這些模塊安裝在Python主目錄下的Libssite-packages子目錄裡,因此不必擔心模塊究竟被安裝到哪個地方或者清空下載目錄會不會把它刪掉。