官术网_书友最值得收藏!

第1章 Python介紹

本書主要介紹數據科學所使用的工具,但因為每一種語言都有自己的生態系統,而筆者多用Python,所以本書主要會從Python的角度來介紹這些工具。閱讀本書的讀者,不管之前的基礎如何,如果對Python這門編程語言有一定的了解,將能更好地掌握書中內容??赡苡泻芏嘧x者曾經在學校里學過C/C++或是VB,又或者聽說過Java、PHP等這樣廣泛使用的編程語言,初聞Python的時候可能會對這個名字略感陌生,不過這一點并不能阻礙Python成為數據科學領域的“一等公民”。從本質上來說,編程語言都是類似的,即通過計算的方式表達人類大腦中的想法,可能讀者現在還想象不出來在電腦上瀏覽網站的動作是如何轉換成公式,并通過電腦進行計算的。這個看似簡單的動作其實包含了一系列從低級到高級的抽象,也就是我們常說的算法、設計模式等內容?,F在的編程語言有上千種之多,雖然各有各的特色,但是都脫離不了基本的算法和設計模式。很多有用的框架都在多種編程語言上實現過,他們的功能幾乎是一致的。不過這些種編程語言中也有著一些明顯的區別,表1-1提供了區分不同編程語言的一些維度。

表1-1 區分編程語言的一些維度

表1-1中灰色部分就是Python所對應的特性??偟膩碚f,Python是一門高級語言,使用者并不需要關心計算機底層是如何工作的。而且Python的使用不僅局限于數據處理,它還可用于Web開發、嵌入式開發等領域,是一門被廣泛使用的高級語言。

由于Python是解釋運行的,因此并不需要提前編譯,省去了大量的麻煩,并且可以在大多數常見的操作系統上執行。

1.1 Python的版本之爭

筆者非常希望這本書是你的第一本Python書,這樣本書就不用去解釋為什么Python會有兩個不兼容的版本了。但是,這個問題必須解釋清楚!因為這是一本入門類圖書,不僅應該講授當下必須了解的知識,還應當適當地回顧歷史、展望未來。Python之父吉多·范羅蘇姆是在一個圣誕節的假期為了打發無聊時光而開發的Python早期版本,不過當時由于電腦性能太差,而Python的設計又強調通過消耗電腦的時間來節約人力的時間,導致Python程序運行緩慢,因此在早期并沒有受到太多關注。2001年Python才發布了2.0版本,實際上在2.4版本發布的2004年之后Python的使用才開始快速增長。Python 2.5版本在以前是一個非常流行的版本,以至于這個版本被維護了很多年,至今仍然能夠看到很多以這個版本撰寫的圖書。在這個時期電腦的性能得到飛速提升,程序員們也慢慢地接受了這種花費計算機的一些時間來節約自己的時間的理念。在Python 2.x發布了9年之后的2009年,Python 3.x發布了,為了解決2.x版本中的一些早期設計缺陷,以及包括字符串編碼等Python老大難問題。不過這似乎也帶來了更多的問題,在經過了3個版本的補救之后,3.4版對Python3.x進行了大刀闊斧的修改,以至于在3.x的版本中3.4之前和之后的版本也并不兼容。好在當時遷移到3.x的項目并不多,不過這也確實給人以Python 3.x不靠譜的印象,因此也為以后3.x版本的推廣增加了一些難度。當然坊間流傳的另外一個原因是“Python 3.x比Python 2.x慢”,我不得不承認這是個事實,但Python本來也不是以快為目的而設計的,所以真的不必在意這一點。

目前,常用的Python有兩個版本,Python 2.x和Python 3.x(通常指3.4以后的版本,3.0-3.3版本官方已經不推薦使用了)在本書寫作時最新的版本是Python 2.7.11和Python 3.5.1。,兩個版本在很多方面都不兼容,甚至簡單的“打印”輸出都不兼容,所以基本上沒辦法無痛地將寫好的Python程序在兩個不同版本的解釋器上運行。Python 3.0于2009年年初發布,Python社區從版本2向版本3的跨越用了7年時間,但仍然說不上成功,大量有用的庫仍然不支持Python 3。即使有這樣的問題,新版本的Python仍有不少優點,比如它統一了Python 2中比較混亂的部分,解決了編碼問題,增加了新式類,尤其在Python 3.5這個版本中,還增加了異步關鍵字async、await等,這些改變使得Python 3相比于Python 2有著很大的優勢。然而在本書寫作之時,仍然有一些重要的庫不支持Python 3,所以筆者推薦使用Python 2.7進行本書的學習。不過為了著眼未來,本書會盡量使用Python 3的風格來書寫程序,并且會在首次出現時注明,希望能夠幫助那些未來會使用Python 3的讀者減少一些遷移的痛苦。

1.2 Python解釋器

由于Python是一門開源語言,所以只要愿意,任何人都可以為其實現一個解釋器。目前官方解釋器CPython是絕對主流,如果讀者有興趣,可以了解一下其他的版本,比如支持JIT(即時編譯)的PyPy,可以把Python編譯成C語言的Cython,擁有notebook這樣友好、方便編程界面的IPython等。本書會使用官方解釋器CPython進行講解,并且還會使用到一些第三方的庫,本節也將介紹一下如何在主流的操作系統中安裝必要的軟件。

1.2.1 Mac OS X系統

如果讀者使用的是蘋果電腦(并且使用的是其自帶的系統),那么無須特別安裝Python,因為它已經被預先安裝在電腦中了。為了驗證這一點,讀者可以打開Mac OS X的“終端”應用,在打開的終端里輸入“python”。如果可以看到如下的輸出則證明電腦中已經正確地安裝了Python:

          Macbook Pro:~:$ python
          Python 2.7.9 (v2.7.9:648dcafa7e5f,  Dec 102014,  10:10:46)
          [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
          Type "help",  "copyright",  "credits" or "license" for more information.
          >>>

上述代碼中第一行的“$”符號是終端的命令提示符,需要在這個符號之后輸入“python”這個命令以打開Python,如果一切正常,則終端會輸出一些關于Python版本的信息,最后一行以“>>>”結尾?!?gt;>>”是Python交互式解釋器的命令提示符,想要使用Python,應當在這個符號后面鍵入Python命令。若想要退出Python則需要在“>>>”之后輸入“exit()”,或者同時按下鍵盤上的快捷鍵Ctrl+D。

1.2.2 Linux系統

如果讀者使用的是Linux系統,那么與Mac OS X系統一樣,無須進行安裝即可使用Python。打開終端的方式取決于你使用的Linux發行版本如果讀者想學習Linux,并且不知道該如何選擇Linux發行版,那么本書推薦選擇Ubuntu。,不過讀者可以嘗試按Ctrl+Alt+T的組合鍵來啟動終端,或者在應用菜單中尋找“終端”或名為“Terminal”的應用。在打開了終端之后在命令提示符(通常來說是“$”)后,鍵入“python”以確認Python的版本信息,終端輸出的內容應當與Mac OS X的相同,并且“>>>”同樣代表Python命令提示符,若想要使用Python,則應當在這個符號后面輸入Python命令。

1.2.3 Windows系統

由于Windows系統默認沒有提供Python不僅是Python,即使Java、C/C++這些常見語言的編程環境Windows都默認沒有提供。,因此需要單獨安裝Python。讀者可以嘗試訪問https://www.python.org/downloads/windows/以獲取最新的Python安裝包。在寫作本書時最新的Python 2.x版本是Python 2.7.11,分為32位版和64位版,下載地址分別如下。

32位版:https://www.python.org/ftp/python/2.7.11/python-2.7.11.msi

64位版:https://www.python.org/ftp/python/2.7.11/python-2.7.11.amd64.msi

如果讀者的電腦是較新的操作系統Windows 7以后的系統,包括Windows 7、Windows 8和Windows 10。,并且擁有4GB以上的內存,那么通常來說安裝64位的軟件應該是沒有問題的。如果讀者所用的系統較老,或者不確定自己的系統是多少位的,可以選擇32位的版本進行安裝。因為無論是32位還是64位的系統,都能夠運行32位版本的軟件,反過來32位的系統卻不能運行64位的軟件。

下載完成之后雙擊鼠標進行安裝,在該過程中,就像安裝普通的應用程序一樣連續單擊“下一步”,直到出現圖1-1所示的界面為止。

圖1-1 Windows版Python安裝界面

然后在Add python.exe to Path的安裝選項中選擇Will be installed on local hard driver。接下來通過同時按下Win+R鍵Win鍵就是空格鍵的左邊或右邊帶有微軟徽標的按鍵。打開運行,在彈出的運行對話框中鍵入cmd,如圖1-2所示。

圖1-2 Windows“運行”程序界面

操作完成后,就打開了Windows的命令行界面,如圖1-3所示。

圖1-3 Windows命令行(cmd)窗口

此時在命令提示符“>”后輸入“python”會出現兩種情況:情況一,會出現與Mac OS X系統一樣的Python版本信息,并且以“>>>”結尾。情況二,會出現“‘python’不是內部或外部命令,也不是可運行的程序或批處理文件?!钡腻e誤信息。如果是這樣,就需要先運行下面的命令只有在安裝時需要運行一次,以后無須再次運行。以修正這個錯誤:

          set PATH=%PATH%; C:/Python27

之后再運行Python,就可以得到正常的輸出了,如圖1-4所示。

圖1-4 在Windows上正確運行Python的界面

至此,讀者應該已經能夠在自己的電腦上使用Python進行編程了。在Windows下,想要退出Python只能使用輸入exit()的這一種方式,Windows的cmd不接受Ctrl+D的命令。

1.3 第一段Python程序

Python程序有時也稱為Python腳本,是定義和命令的序列。Python提供了非常方便的交互式解釋器,也就是1.2節中提到的在終端輸入“python”時啟動的程序。很明顯,無論是終端還是Python交互式解釋器,都需要用戶在命令提示符后面輸入命令才能工作,通常我們稱其為shell、Linux shell、Mac OS X shell或是Python shell。shell對應的中文有“殼”的意思,表示這是計算機核心計算單元的一層外殼,用戶可通過這層殼向計算機發送命令。現在請讀者打開Python shell,讓我們嘗試一些例子:

          Macbook Pro:~:$ python
          Python 2.7.9 (v2.7.9:648dcafa7e5f,  Dec 102014,  10:10:46)
          [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
          Type "help",  "copyright",  "credits" or "license" for more information.
          >>>print("Hello Data")
          Hello Data
          >>>print("Hello %s" % "World")
          Hello World
          >>> "Hello Data"
          'Hello Data'
          >>>1 + 2
          3
          >>>

這里分別執行了4條命令,在命令提示符“>>>”之后,我們手動輸入了print("Hello Data")、print("Hello %s" % "World")、"Hello Data"、1 + 2。每輸入一條命令按一次回車鍵,Python shell就會在接下來的一行頂格打印出執行完該命令所得到的結果,并換行輸出另外一個命令提示符,以等待下一條命令。注意,這里在第一條和第二條語句中分別給print函數在Python 2中print通常是以命令的方式出現的,比如print “Hello Data”,但這里使用的是Python 3打印函數的形式,后續的章節中會講解打印函數相較于打印命令的優點。傳了一個值,如果是一句話這里暫時還不能在shell中輸入中文字符,關于如何處理中文會在第2章中詳細介紹。,那么print函數會將其打印到屏幕上。接下來的命令中則省略了print函數,直接輸入"Hello Data",其結果與前兩條語句的結果稍稍有些不同(多了左右的單引號)。這是Python shell特有的功能,無需特殊的命令就能輸出Python語句的結果(單引號僅表示結果是字符串類型的,并沒有其他的含義)。

最后一條語句中進行了一個簡單的數學計算,讀者還可以嘗試其他的運算。需要特別注意的是,當進行除法計算時,比如下面這個命令:

          >>>10/3
          3

所得到的結果是整除法的結果(省略了小數部分),如果想要得到正常的結果,請用小數表示這個計算,比如:

          >>>10/3.0
          3.3333333333333335

這個問題在Python 3中已經得到了解決,并且在Python 2中也有很好的解決方案,關于這點第2章中會進行詳細的介紹。

1.4 使用Python shell調試程序

Python shell不僅為Python初學者提供了一個方便的入門工具,更是提高了專業程序員和數據科學家們的生產力。比如在編寫程序時忘記了某個表達式的寫法,可以打開Python shell,在里面調試好了之后再寫入程序。或者直接在Python shell中探索原始數據文件中的數據,變換數據的結構,執行計數、去重、分組等操作。并且可以隨時查看前輩們留給我們的建議,比如在Python shell中輸入import this,將導入Python中一個名為this的模塊:

          >>> import this
          The Zen of Python,  by Tim Peters

          Beautiful is better than ugly.
          Explicit is better than implicit.
          Simple is better than complex.
          Complex is better than complicated.
          Flat is better than nested.
          Sparse is better than dense.
          Readability counts.
          Special cases aren't special enough to break the rules.
          Although practicality beats purity.
          Errors should never pass silently.
          Unless explicitly silenced.
          In the face of ambiguity,  refuse the temptation to guess.
          There should be one-- and preferably only one --obvious way to do it.
          Although that way may not be obvious at first unless you're Dutch.
          Now is better than never.
          Although never is often better than *right* now.
          If the implementation is hard to explain,  it's a bad idea.
          If the implementation is easy to explain,  it may be a good idea.
          Namespaces are one honking great idea -- let's do more of those!
          >>>

大意是:

          Python之道

          美麗優于丑陋
          明確優于晦澀
          簡單勝于復雜
          復雜勝于混亂
          平鋪勝于嵌套
          稀疏勝于緊湊
          可讀性很重要
          盡管實用性很重要,但也不能破例違背上述原則
          絕不讓錯誤無聲無息,除非你想這么做
          面對模棱兩可時,不要妄想猜測能解決問題
          應該只有一種最適合的,且顯而易見的解決方案
          可能這種方案一開始并不那么顯而易見,因為你不是Python之父
          做比不做強,但是隨意做還不如不做
          很難向別人解釋的方案是不好的
          很容易向別人解釋的方案也許是好的
          命名空間是一個令人拍手稱贊的好點子,讓我們善加利用

通過上面的例子,我們已經知道了Python中模塊的概念,模塊是Python中最大的代碼單位,以后我們還會學到文件、函數、語法塊等不同級別的Python代碼單位。在一個Python的模塊中可能會包含一個到多個不同的功能,Python中隨解釋器一起分發的標準模塊有300多個,可以應付絕大多數的編程任務,也確實有些程序員堅持只使用標準庫提供的模塊。不過本書提倡的是另外一種編程的哲學,即“不要重復造輪子”,只要某一個功能已經被別人實現為模塊了,那么最好拿來就用,而不是自己重新編寫。所以我們會安裝很多第三方模塊,這些模塊也是非常優秀的,只是還沒有被收錄進官方的標準模塊中事實上很多官方的標準模塊都曾經是第三方模塊。,也是基于此,下面將使用pip來安裝第三方模塊。不過,根據操作系統的不同,安裝方式也略有區別,如果讀者使用Mac或Linux系統,那么按照之前的教程并沒有經歷安裝Python解釋器的步驟,因此這里需要讀者確認一下自己的Python版本??梢栽诮K端輸入python,比如:

          $ python
          Python 2.7.11 (default,  Jan 282016,  13:11:18)
          [GCC 4.2.1 Compatible Apple LLVM 7.0.2 (clang-700.1.81)] on darwin
          Type "help",  "copyright",  "credits" or "license" for more information.
          >>>

在輸出的第一行Python代碼之后,由點號分隔的部分就是Python的版本,例如上述代碼中顯示的版本是2.7.11。如果你的Python版本為2.7.9或高于該版本,那么你無須任何操作就已經擁有了pip程序,可以在終端中輸入pip嘗試一下,會有類似下面的輸出:

          $pip

          Usage:
          pip <command> [options]

          Commands:
          install                    Install packages.
          download                   Download packages.
          uninstall                  Uninstall packages.
          freeze                     Output installed packages in requirements format.
          list                       List installed packages.
          show                       Show information about installed packages.
          search                     Search PyPI for packages.
          wheel                      Build wheels from your requirements.
          hash                       Compute hashes of package archives.
          completion                 A helper command used for command completion
          help                       Show help for commands.

如果很不幸你的Python版本號低于2.7.9,那么需要手動安裝pip,可以在網址https://bootstrap.pypa.io/get-pip.py中下載安裝腳本。

將腳本下載到某一個目錄中,然后使用下面的命令進行安裝:

          $sudo python get-pip.py

由于Mac系統和Linux系統權限的要求,這一步需要你輸入電腦的開機密碼。

對于Windows系統來說,如果是參考本書的安裝方式進行安裝的,那么你已經獲得了最新版本的Python,也就表示你已經擁有了pip,可以直接使用。

使用pip安裝Python的第三方模塊非常簡單,比如我們要安裝requests這個第三方模塊,可以使用下面的命令:

          $pip install requests

一般來講,Windows的用戶直接運行這個命令就可以安裝了,而Mac或Linux用戶由于系統權限的原因需要在命令的最前方增加sudo這個命令,代碼如下:

          $sudo pip install requests

以后的章節中將不再強調這一區別,請讀者根據自己的系統使用相對應的命令。另外有一部分因為歷史原因,第三方庫是使用C語言編寫的,因此很可能還需要你的電腦上裝有C/C++編譯器。對于Mac和Linux來說,就是GCC編譯器,對于Windows來說則是Visual Studio。

在上述過程的實踐中,大家可能會遇到各種各樣的問題,本書無法窮盡所有可能會遇到的問題,所以當遇到具體的問題時應當盡量求助于搜索引擎。關于使用搜索引擎,筆者自己有一條最基本的原則:我不可能是第一個遇到該問題的人!只要遵守這個原則,絕大多數情況下都能找到令人滿意的答案。

主站蜘蛛池模板: 揭阳市| 长沙县| 彰武县| 临汾市| 华池县| 黑龙江省| 舟曲县| 阳谷县| 宜君县| 通化市| 宜章县| 石门县| 孝感市| 洪江市| 卢氏县| 德昌县| 长阳| 浙江省| 武强县| 宁河县| 香港| 紫阳县| 滦南县| 伊通| 青铜峡市| 千阳县| 孟津县| 肇源县| 黑龙江省| 剑阁县| 内丘县| 武胜县| 东海县| 邵东县| 阿勒泰市| 梅河口市| 南溪县| 牙克石市| 苍南县| 绍兴县| 和田县|