目錄[-]
在 IPython 的官網(ipython.org)上,介紹其的第一句話便是:IPython 是一個加強版的交互式 Shell。另外很多介紹 IPython 的文章也常以這句話開頭,但這句話實在是等于沒說。讓 IPython 在各種 shell(IDE) 中脫穎而出,成為科學計算標配的,并不是按 Tab 鍵代碼補完、以 % 開頭的魔術命令這些大家都有的東西,而是與 matplotlib 這個數據可視化(繪圖)包的深度集成以及奇妙的 Notebook。
IPython 較早的富 GUI 實現應該是 Qt Console。過去在標準 shell 里繪圖時,彈出的繪圖窗口會接管 shell 會話的控制權,你想繼續輸入命令就必須先把繪圖窗口關掉。這對于希望同時實現可視化和交互式過程的數據分析用戶來說顯然是難以忍受的,因此 Qt console 站出來解決了這個問題。在 Qt console 中通過 matplotlib 繪制的圖形會獨立嵌于控制臺中,并不影響你繼續輸入命令。
2011年,由 Brian Granger 領導的 IPython 團隊開始開發一種基于Web技術的交互式計算文檔格式,即 IPython Notebook。為什么說它是文檔格式,而非計算工具呢?實際上它兩者都是。Notebook 在交互上使用了 C/S 結構,它通過 Tornado 建立一個 shell 服務器,并使用瀏覽器作為客戶端。另外 notebook 頁面都被保存為.ipynb的類 JSON 文件格式。這種文件格式也是 Notebook 最吸引人的地方。
IPython Notebook 更詳細的介紹在下面第二節中給出,第一節講的是一些對 IPython 的各種實現通用的功能。
基礎
Tab 鍵自動完成
和其他 IDE 差不多,自己多試試就好了
內省
在變量名或命令的前面或后面加一個 “?” 并執行,可以用于顯示該對象的一些通用信息,如對象類型、文檔字符串等,這就叫做對象內省。這種操作查看到的信息,尤其是函數和類的信息,比通常直接引用變量名然后回車所看到的(__repr__)要好。“?” 的另一個用法是可以搜索 IPython 的命名空間,配合通配符使用效果如下:
In[1]:importnumpyasnpIn[2]:np.*load*?np.loadnp.loadsnp.loadtxtnp.pkgload
使用雙問號“??”還可以查看對象的源代碼(如果可見的話)。
魔術命令
在 IPython 的會話環境中,所有文件都可以通過%run命令來當做腳本執行,并且文件中的變量也會隨即導入當前命名空間。即,對于一個模塊文件,你對他使用%run命令的效果和from module import *相同,除非這個模塊文件定義了 main 函數(if __name__ == '__main__:'),這種情況下 main 函數還會被執行。
這種以 % 開頭的命令在 IPython 中被稱為魔術命令,用于加強 shell 的功能。常用的魔術命令有:
%quickref顯示 IPython 快速參考
%magic顯示所有魔術命令的詳細文檔
%debug從最新的異常跟蹤的底部進入交互式調試器
%pdb在異常發生后自動進入調試器
%reset刪除 interactive 命名空間中的全部變量
%runscript.py執行script.py
%prunstatement通過 cProfile 執行對statement的逐行性能分析
%timestatement測試statement的執行時間
%timeitstatement多次測試statement的執行時間并計算平均值
%who、%who_ls、%whos顯示 interactive 命名空間中定義的變量,信息級別/冗余度可變
%xdelvariable刪除variable,并嘗試清除其在 IPython 中的對象上的一切引用
!cmd在系統 shell 執行cmd
output=!cmd args執行cmd并賦值
%bookmark使用 IPython 的目錄書簽系統
%cddirecrory切換工作目錄
%pwd返回當前工作目錄(字符串形式)
%env返回當前系統變量(以字典形式)
對魔術命令不熟悉的話可以通過%magic查看詳細文檔;對某一個命令不熟悉的話,可以通過%cmd?內省機制查看特定文檔。值得一提的是,IPython 中使用del命令無法刪除所有的變量引用,因此垃圾回收機制也無法啟用,所以有些時候你會需要使用%xdel或者%reset。
歷史輸入和輸出變量
與標準 Shell 類似,IPython 中也可以通過_和__訪問上一次和上上一次的輸出。同時你肯定注意到了,IPython 中每一次的輸入輸出都有序號。訪問歷史 X 行輸出的方法為:_X;訪問歷史 X 行輸入的方法為:_iX。因為訪問歷史輸出的使用概率較歷史輸入大很多,所以訪問歷史輸出僅使用下劃線加行號即可,同時為了區分,訪問歷史輸入時需添加小寫字母 “i”,代表 “in”。
In[24]:1+1Out[24]:2In[25]:_i24Out[25]:'1+1'In[26]:_24Out[26]:2
Notebook
Notebook 的官方信息可以從 ipython.org/notebook 獲得,不過好像被墻了。上不去的話也可以訪問它的 github 頁面,ipython/examples/Notebook 目錄下有很多可供參考的內容。前面說過 Notebook 有一種 .ipynb 的文件格式,當你打開這個例程目錄下的某個文件后,就能體會到 Notebook 的奇妙之處了。
演示文檔
目前在各種 Python 研討會上,一種流行的演示手段就是使用 IPython Notebook,然后再將 .ipynb 文件發布到網上以供所有人查閱。除了前面說過的可以內嵌 matplotlib 繪圖外,Notebook 還同時提供了對 LaTex 和 MarkDown 的支持!
如上圖便展示了一個 .ipynb 文件的示例頁面。其中一對In Out會話被視作一個單元,稱為cell。第一個 cell 里我寫入的內容其實是:
##LaTex 演示
---$Z=\frac{X-\bar{X}}{S}$
分別使用了 MarkDown 和 LaTex 的語法。按下Shift + Enter后這段內容就被渲染成了圖片中的樣子。
cell 特別親切的地方在于:它可以作為一個類似“段落”的概念來進行編輯,不管是執行前還是執行后,而且既可以針對內容進行編輯,也可以對 cell 整體應用 copy、paste、cut 等操作,甚至還可以前后移動 cell 的位置。這帶來的好處是,在大量試驗性的交互操作過后,他不會像普通 shell 那樣留下無數沒用的 IO 內容。如果某條命令的輸出不理想或者報了錯,你就可以回頭編輯后重新運行,或把它移位或干脆刪掉。這樣在很久的一段交互過程后,Notebook 留下的反而是一份干凈整潔的文檔。
.ipynb 文件使用的是一種類 JSON 的文本格式,就像這樣:
"worksheets": [? ? {"cells": [? ? ? ? ? ? {"cell_type":"markdown","metadata": {},"source": ["##LaTex \u6f14\u793a\n","---\n","$Z=\\frac{X-\\bar{X}}{S}$"]? ? ? ? ? ? },
這種交互式計算環境,對繪圖、數學公式、簡易排版語法的支持,還有一種方便的文檔格式,共同幫助 Notebook 成為了 Python 科學計算的理想工具。另外這種使用瀏覽器和服務進程的 C/S 結構還暗含了一種遠程連接可能,拋開安全性不談的話,其在教學方面也有很高的潛力。
操作指南
當通過 IPython Notebook.exe 進入應用時,首先打開的是 Home 頁面,地址一般為:http://127.0.0.1:8888/tree。Home 目錄下會列出所有的歷史文件記錄,右上角則有一個 “New Notebook” 按鈕可以新建一個會話。
在 .ipynb 文件的交互頁面,需要注意的除了標準的 IPython 語法外,就是頁面抬頭處的菜單欄和工具欄了。Notebook 很貼心地提供了非常友好的幫助頁面,因此本文不再贅述。基本看完這兩個頁面(內容很少)后就能對 Notebook 的操作方式了解的差不多。