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子目录里,因此不必担心模块究竟被安装到哪个地方或者清空下载目录会不会把它删掉。

《机器学习实战》