目錄[-]
在 IPython 的官網(wǎng)(ipython.org)上蜂绎,介紹其的第一句話便是:IPython 是一個(gè)加強(qiáng)版的交互式 Shell腐碱。另外很多介紹 IPython 的文章也常以這句話開(kāi)頭趁冈,但這句話實(shí)在是等于沒(méi)說(shuō)皂岔。讓 IPython 在各種 shell(IDE) 中脫穎而出,成為科學(xué)計(jì)算標(biāo)配的单芜,并不是按 Tab 鍵代碼補(bǔ)完蜕该、以 % 開(kāi)頭的魔術(shù)命令這些大家都有的東西,而是與 matplotlib 這個(gè)數(shù)據(jù)可視化(繪圖)包的深度集成以及奇妙的 Notebook洲鸠。
IPython 較早的富 GUI 實(shí)現(xiàn)應(yīng)該是 Qt Console堂淡。過(guò)去在標(biāo)準(zhǔn) shell 里繪圖時(shí),彈出的繪圖窗口會(huì)接管 shell 會(huì)話的控制權(quán)扒腕,你想繼續(xù)輸入命令就必須先把繪圖窗口關(guān)掉绢淀。這對(duì)于希望同時(shí)實(shí)現(xiàn)可視化和交互式過(guò)程的數(shù)據(jù)分析用戶(hù)來(lái)說(shuō)顯然是難以忍受的,因此 Qt console 站出來(lái)解決了這個(gè)問(wèn)題瘾腰。在 Qt console 中通過(guò) matplotlib 繪制的圖形會(huì)獨(dú)立嵌于控制臺(tái)中皆的,并不影響你繼續(xù)輸入命令。
2011年蹋盆,由 Brian Granger 領(lǐng)導(dǎo)的 IPython 團(tuán)隊(duì)開(kāi)始開(kāi)發(fā)一種基于Web技術(shù)的交互式計(jì)算文檔格式费薄,即 IPython Notebook。為什么說(shuō)它是文檔格式栖雾,而非計(jì)算工具呢楞抡?實(shí)際上它兩者都是。Notebook 在交互上使用了 C/S 結(jié)構(gòu)析藕,它通過(guò) Tornado 建立一個(gè) shell 服務(wù)器召廷,并使用瀏覽器作為客戶(hù)端。另外 notebook 頁(yè)面都被保存為.ipynb的類(lèi) JSON 文件格式噪径。這種文件格式也是 Notebook 最吸引人的地方柱恤。
IPython Notebook 更詳細(xì)的介紹在下面第二節(jié)中給出,第一節(jié)講的是一些對(duì) IPython 的各種實(shí)現(xiàn)通用的功能找爱。
基礎(chǔ)
Tab 鍵自動(dòng)完成
和其他 IDE 差不多梗顺,自己多試試就好了
內(nèi)省
在變量名或命令的前面或后面加一個(gè) “?” 并執(zhí)行车摄,可以用于顯示該對(duì)象的一些通用信息寺谤,如對(duì)象類(lèi)型、文檔字符串等吮播,這就叫做對(duì)象內(nèi)省变屁。這種操作查看到的信息,尤其是函數(shù)和類(lèi)的信息意狠,比通常直接引用變量名然后回車(chē)所看到的(__repr__)要好粟关。“环戈?” 的另一個(gè)用法是可以搜索 IPython 的命名空間闷板,配合通配符使用效果如下:
In[1]:importnumpyasnpIn[2]:np.*load*?np.loadnp.loadsnp.loadtxtnp.pkgload
使用雙問(wèn)號(hào)“??”還可以查看對(duì)象的源代碼(如果可見(jiàn)的話)澎灸。
魔術(shù)命令
在 IPython 的會(huì)話環(huán)境中,所有文件都可以通過(guò)%run命令來(lái)當(dāng)做腳本執(zhí)行遮晚,并且文件中的變量也會(huì)隨即導(dǎo)入當(dāng)前命名空間性昭。即,對(duì)于一個(gè)模塊文件县遣,你對(duì)他使用%run命令的效果和from module import *相同糜颠,除非這個(gè)模塊文件定義了 main 函數(shù)(if __name__ == '__main__:'),這種情況下 main 函數(shù)還會(huì)被執(zhí)行萧求。
這種以 % 開(kāi)頭的命令在 IPython 中被稱(chēng)為魔術(shù)命令其兴,用于加強(qiáng) shell 的功能。常用的魔術(shù)命令有:
%quickref顯示 IPython 快速參考
%magic顯示所有魔術(shù)命令的詳細(xì)文檔
%debug從最新的異常跟蹤的底部進(jìn)入交互式調(diào)試器
%pdb在異常發(fā)生后自動(dòng)進(jìn)入調(diào)試器
%reset刪除 interactive 命名空間中的全部變量
%runscript.py執(zhí)行script.py
%prunstatement通過(guò) cProfile 執(zhí)行對(duì)statement的逐行性能分析
%timestatement測(cè)試statement的執(zhí)行時(shí)間
%timeitstatement多次測(cè)試statement的執(zhí)行時(shí)間并計(jì)算平均值
%who饭聚、%who_ls忌警、%whos顯示 interactive 命名空間中定義的變量,信息級(jí)別/冗余度可變
%xdelvariable刪除variable秒梳,并嘗試清除其在 IPython 中的對(duì)象上的一切引用
!cmd在系統(tǒng) shell 執(zhí)行cmd
output=!cmd args執(zhí)行cmd并賦值
%bookmark使用 IPython 的目錄書(shū)簽系統(tǒng)
%cddirecrory切換工作目錄
%pwd返回當(dāng)前工作目錄(字符串形式)
%env返回當(dāng)前系統(tǒng)變量(以字典形式)
對(duì)魔術(shù)命令不熟悉的話可以通過(guò)%magic查看詳細(xì)文檔法绵;對(duì)某一個(gè)命令不熟悉的話,可以通過(guò)%cmd?內(nèi)省機(jī)制查看特定文檔酪碘。值得一提的是朋譬,IPython 中使用del命令無(wú)法刪除所有的變量引用,因此垃圾回收機(jī)制也無(wú)法啟用兴垦,所以有些時(shí)候你會(huì)需要使用%xdel或者%reset徙赢。
歷史輸入和輸出變量
與標(biāo)準(zhǔn) Shell 類(lèi)似,IPython 中也可以通過(guò)_和__訪問(wèn)上一次和上上一次的輸出探越。同時(shí)你肯定注意到了狡赐,IPython 中每一次的輸入輸出都有序號(hào)。訪問(wèn)歷史 X 行輸出的方法為:_X钦幔;訪問(wèn)歷史 X 行輸入的方法為:_iX枕屉。因?yàn)樵L問(wèn)歷史輸出的使用概率較歷史輸入大很多,所以訪問(wèn)歷史輸出僅使用下劃線加行號(hào)即可鲤氢,同時(shí)為了區(qū)分搀擂,訪問(wèn)歷史輸入時(shí)需添加小寫(xiě)字母 “i”,代表 “in”卷玉。
In[24]:1+1Out[24]:2In[25]:_i24Out[25]:'1+1'In[26]:_24Out[26]:2
Notebook
Notebook 的官方信息可以從 ipython.org/notebook 獲得哨颂,不過(guò)好像被墻了。上不去的話也可以訪問(wèn)它的 github 頁(yè)面相种,ipython/examples/Notebook 目錄下有很多可供參考的內(nèi)容威恼。前面說(shuō)過(guò) Notebook 有一種 .ipynb 的文件格式,當(dāng)你打開(kāi)這個(gè)例程目錄下的某個(gè)文件后,就能體會(huì)到 Notebook 的奇妙之處了沃测。
演示文檔
目前在各種 Python 研討會(huì)上缭黔,一種流行的演示手段就是使用 IPython Notebook食茎,然后再將 .ipynb 文件發(fā)布到網(wǎng)上以供所有人查閱蒂破。除了前面說(shuō)過(guò)的可以?xún)?nèi)嵌 matplotlib 繪圖外,Notebook 還同時(shí)提供了對(duì) LaTex 和 MarkDown 的支持别渔!
如上圖便展示了一個(gè) .ipynb 文件的示例頁(yè)面附迷。其中一對(duì)In Out會(huì)話被視作一個(gè)單元,稱(chēng)為cell哎媚。第一個(gè) cell 里我寫(xiě)入的內(nèi)容其實(shí)是:
##LaTex 演示
---$Z=\frac{X-\bar{X}}{S}$
分別使用了 MarkDown 和 LaTex 的語(yǔ)法喇伯。按下Shift + Enter后這段內(nèi)容就被渲染成了圖片中的樣子。
cell 特別親切的地方在于:它可以作為一個(gè)類(lèi)似“段落”的概念來(lái)進(jìn)行編輯拨与,不管是執(zhí)行前還是執(zhí)行后稻据,而且既可以針對(duì)內(nèi)容進(jìn)行編輯,也可以對(duì) cell 整體應(yīng)用 copy买喧、paste捻悯、cut 等操作,甚至還可以前后移動(dòng) cell 的位置淤毛。這帶來(lái)的好處是今缚,在大量試驗(yàn)性的交互操作過(guò)后,他不會(huì)像普通 shell 那樣留下無(wú)數(shù)沒(méi)用的 IO 內(nèi)容低淡。如果某條命令的輸出不理想或者報(bào)了錯(cuò)姓言,你就可以回頭編輯后重新運(yùn)行,或把它移位或干脆刪掉蔗蹋。這樣在很久的一段交互過(guò)程后何荚,Notebook 留下的反而是一份干凈整潔的文檔。
.ipynb 文件使用的是一種類(lèi) JSON 的文本格式猪杭,就像這樣:
"worksheets": [? ? {"cells": [? ? ? ? ? ? {"cell_type":"markdown","metadata": {},"source": ["##LaTex \u6f14\u793a\n","---\n","$Z=\\frac{X-\\bar{X}}{S}$"]? ? ? ? ? ? },
這種交互式計(jì)算環(huán)境餐塘,對(duì)繪圖、數(shù)學(xué)公式胁孙、簡(jiǎn)易排版語(yǔ)法的支持唠倦,還有一種方便的文檔格式,共同幫助 Notebook 成為了 Python 科學(xué)計(jì)算的理想工具涮较。另外這種使用瀏覽器和服務(wù)進(jìn)程的 C/S 結(jié)構(gòu)還暗含了一種遠(yuǎn)程連接可能稠鼻,拋開(kāi)安全性不談的話,其在教學(xué)方面也有很高的潛力狂票。
操作指南
當(dāng)通過(guò) IPython Notebook.exe 進(jìn)入應(yīng)用時(shí)候齿,首先打開(kāi)的是 Home 頁(yè)面,地址一般為:http://127.0.0.1:8888/tree。Home 目錄下會(huì)列出所有的歷史文件記錄慌盯,右上角則有一個(gè) “New Notebook” 按鈕可以新建一個(gè)會(huì)話周霉。
在 .ipynb 文件的交互頁(yè)面,需要注意的除了標(biāo)準(zhǔn)的 IPython 語(yǔ)法外亚皂,就是頁(yè)面抬頭處的菜單欄和工具欄了俱箱。Notebook 很貼心地提供了非常友好的幫助頁(yè)面,因此本文不再贅述灭必∧祝基本看完這兩個(gè)頁(yè)面(內(nèi)容很少)后就能對(duì) Notebook 的操作方式了解的差不多。