史上最詳細、最完全的ipython使用教程,Python使用者必備!——ipython系列之一
一、ipython簡介
關於什麼是ipython,本文就不加以介紹了,他是一個非常流行的python直譯器,相比於原生的python直譯器,有太多優點和長處,因此幾乎是python開發人員的必知必會。
1、ipython相比於原生的python有什麼優勢
(1) python shell不能在退出儲存歷史;ipython歷史記錄自動儲存:儲存在history.sqlite檔案下:可用“_”、“__”、“___”呼叫最近三次記錄;
(2) python shell不支援tab自動補全;ipython支援tab補全;
(3) python shell不能快速獲取類、函式資訊;ipython通過“?”顯示物件簽名、文件字串、程式碼位置,通過“??”顯示原始碼;(4) python shell不能直接執行shell命令,需要藉助sys;ipython通過“!”呼叫系統命令,如“!uptime”;
(5) 其他ipython有很多magic函式,可通過使用%lsmagic列舉;
%run:執行python檔案
%edit:使用編輯器開啟當前函式編輯
%save:把某些歷史記錄儲存到檔案
%debug:啟用debug程式
等等,後面會講到
(6)ipython有很多快捷鍵
(7)ipython的擴充套件巨集系統、storemagic持久化巨集、變數、別名;以及autoreload自動過載等功能;
下面挑選幾個典型的加以說明:
(1)Python物件在ipython環境下排版得更好,格式化更加美觀。比如對於一個字典型別data。
>>> import numpy as np >>> data={i:np.random.randn() for i in range(8)} >>> data {0: 0.5745972896627615, 1: 0.888451102340561, 2: -2.2941687621316924, 3: 0.01790118639622907, 4: 0.3600199138099036, 5: 0.6118078188322031, 6: 0.5261552735725278, 7: -0.20874867962524404}
這是原生python下顯示的結果,很不美觀, 因為當字典很長的時候,很難看。
data={i:np.random.randn() for i in range(8)}
In [13]: data
Out[13]:
{0: -0.24691306010199965,
1: 1.0770180986231184,
2: 0.9459463985248865,
3: 0.7618376828038825,
4: 1.6075756654719342,
5: -0.04417798701828061,
6: -1.062961626712148,
7: -0.7381927912455305}
這是ipython下的輸出格式,可以看見,字典排列的很美觀,非常易於檢視。
(2)提供更強大的互動體驗
我們都知道,在python原生開發條件下,單下劃線“_”表示的是最近的一個輸出結果,但是ipython則在此基礎之上做出了更強大的功能。因為原生Python編輯器不僅醜,而且是沒有行號的,但是ipython提供了行號,這不僅更好看,而且有很多妙用哦,如下:
_ :表示最近的一個輸出結果;
__ :表示最近的兩個輸出結果;
_行號 :檢視指定行的那個變數的結果
_i行號:檢視指定行號輸入的變數名稱
示例如下:
In [1]: a=100
In [2]: a
Out[2]: 100
In [3]: b=200
In [4]: b
Out[4]: 200
In [5]: _
Out[5]: 200
In [6]: __
Out[6]: 200
注意:這裡一定要輸出a、b,也就是說,如果上面沒有第二行和第四行,那是不行的,像下面這樣
a=100
_
這時會報錯的,因為_和__針對的是最近一個和最近兩個輸出了的,沒有輸出就不行了。
In [9]: _4
Out[9]: 200
In [10]: _i3
Out[10]: 'b=200'
In [11]: _i4
Out[11]: 'b'
注意:
(a)_4 表示的是檢視第四行輸出的變數,但是這裡如果改為_3 就不行了,因為第三行之定義了b=200,並沒有輸出,所以
_行號 只能夠用在輸出的行號上面。
(b) 但是 _i行號,不管是用在輸出還是輸入上面都是沒有問題的。
如何判斷是輸出還是輸入?前面是In的表示輸入,是Out表示輸出。
二、ipython的內省
ipython相較於原生的python,提供了更加強大的內省功能,所謂內省,也稱之為內視,即 object introspection,主要有以下一些常見的方法:
object? 或者?object :顯示該物件的一些通用資訊,注意python裡面一切皆物件哦,包括函式、類。
object?? 或者??object:兩個問號顯示詳細資訊,如果是類或者是函式,還會顯示原始碼。即將問號放在前面和後面都可以。
萬用字元*匹配:如
numpy.*load*? 這會顯示所有的包含有load的函式
numpy.*sort? 這會顯示所有以sort結尾的函式
三、ipython快捷鍵
下面介紹一下第一個和第二個快捷鍵,比如有如下程式碼:
- Ctrl-P 或上箭頭鍵 後向搜尋命令歷史中以當前輸入的文字開頭的命令
- Ctrl-N 或下箭頭鍵 前向搜尋命令歷史中以當前輸入的文字開頭的命令
- Ctrl-R 按行讀取的反向歷史搜尋(部分匹配)
- Ctrl-Shift-v 從剪貼簿貼上文字
- Ctrl-C 中止當前正在執行的程式碼
- Ctrl-A 將游標移動到行首
- Ctrl-E 將游標移動到行尾
- Ctrl-K 刪除從游標開始至行尾的文字
- Ctrl-U 清除當前行的所有文字譯註12
- Ctrl-F 將游標向前移動一個字元
- Ctrl-b 將游標向後移動一個字元
- Ctrl-L 清屏
In [16]: a=100
In [17]: a
Out[17]: 100
In [18]: abc=100
In [19]: abcd=1000
In [20]: a=100
In [21]: a
當輸入a之後,然後按Ctrl+P,或者是按向上的方向鍵,則會依次顯示已a開頭的變數,依次是a、abcd、abc、a,不僅如此,很久之前在ipython裡面輸入過的變數,只要是以a開頭的,都能夠顯示,知道最開始的那個以a開頭的位置,如果是Ctrl+N或者是向下的方向鍵,則正好相反。
四、魔術命令——magic command
什麼是ipython的魔法命令?
所謂的模式命令,是指那些給我們提供方便,輕鬆控制ipython互動系統的命令,可以這樣去理解,魔術命令可以看成是ipython互動環境下面的命令列程式,其中很多還有一些命令列引數選項。
%quickref :可以顯示ipython的快速參考
%magic :可以檢視到底有哪些模式命令(這個方法會顯示每一個命令的詳細資訊,因此會很多)
%lsmagic :這裡只會顯示模式命令的名字,會比較簡潔,檢視起來更方便
%命令? 或者是%命令??:當我們想要檢視某一命令的詳細資訊,我們可以使用同前面類似的方法,在魔術命令後面新增一個或者是兩個問號??來檢視詳細資訊。
預設情況下,魔術命令總是以百分號%開頭,但這不是必須的,我們也可以不使用百分號,我們也可以直接使用不帶百分號的魔術命令,這稱之為“自動魔術命令——automagic”如:
magic 這會得到和 %magic一樣的效果,但是需要注意的是,不使用百分號時,不能出現和魔術命令同名稱的變數,否則顯示的就是變量了。那到底是使用百分號還是不使用百分號呢?事實上,我們也是可以自由控制的,通過%automagic來控制,
預設情況下,它是開啟的,即我們可以使用無%的魔術命令,只要與變數名不衝突即可,我麼也可以關閉,如下:
%automagic -off 0
Automagic is OFF, % prefix IS needed for line magics.
此時,再次輸入magic命令時,顯示:
magic
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
~\Desktop\test.py in <module>()
----> 1 magic
NameError: name 'magic' is not defined
顯示magic是不存在的,因為已經關閉了。此時必須使用%開頭
如何控制它的開還是關閉呢?
%automagic - on, 1 #此時開啟
%automagic - off, 0 #此時關閉
下面介紹一些常見的魔術命令。
1、%run——執行一個Python指令碼
即在ipython中我不僅可以執行程式碼,我還可以執行一個已知的python指令碼檔案,就像是在命令列中的使用是一樣的,比如有一個以下的Python檔案:
def addfunc(a,b,c):
return a+b-c
a=100
b=200
c=150
result=addfunc(a,b,c)
現在我們在ipython裡面輸入如下程式碼:
In [21]: %run C:\Users\XinAir\Desktop\test.py
In [22]: a
Out[22]: 100
In [23]: b
Out[23]: 200
In [24]: c
Out[24]: 150
In [25]: result
Out[25]: 150
我們發現,指令碼檔案裡面的變數,我們依然可以使用,一般格式如下:
%run C:\Users\XinAir\Desktop\test.py 命令列引數(如果有命令的話)
這個和cmd模式之下的
python C:\Users\XinAir\Desktop\test.py 命令列引數(如果有命令的話) 兩者是不是異曲同工。
不僅如此,我不僅能夠直接使用指令碼檔案裡面的程式碼,指令碼檔案也可以使用ipython環境中的變數,如下:
In [26]: %run C:\Users\XinAir\Desktop\test.py
In [27]: x=1000
In [28]: y=2000
In [29]: z=1500
In [30]: result=addfunc(x,y,z)
In [31]: result
Out[31]: 1500
我們發現,不僅可以直接使用指令碼檔案中的變數、函式,還可以給指令碼檔案使用ipython本身的變數,除此之外,我還可以使用下面語句:
%run -i C:\Users\XinAir\Desktop\test.py 這個地方的-i是可選引數,可以要,也可不要代表的就是interactive(互動)的意思。
2、%paste或者是%cpaste——執行剪下板中的程式碼
很多人可能覺得之好像沒什麼用,實際上,它的用處非常大,我們在編寫程式碼的時候,我們希望執行某一小段程式碼進行相關的測試,但是我們又不想專門再建立一個py檔案,所以我們可以將程式碼複製或者是剪下一下,這個時候程式碼進入了剪下板,然後開啟ipython,此時我們有三種處理辦法
第一:直接使用Ctrl+V進行貼上,然後測試程式碼
第二:輸入魔術命令%paste,回車,這個時候在剪下板中的程式碼自動貼上了進來,不再需要手動Ctrl+V了
第三:輸入魔術命令%cpaste,回車,然後再手動Ctrl+V,將程式碼複製進來,注意最後一定要按兩個減號“--”退出才行哦,實際上它給了提示的。如下
%cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:x=5
:y=7
:if x>5:
: x+=1
:
: y=8
:--
In [54]: y
Out[54]: 7
In [55]: x
Out[55]: 5
3、%timeit 和%time 檢測任意Python語句的執行時間
a=numpy.random.randn(100,100)
In [65]: %timeit numpy.dot(a,a)
70.8 µs ± 1.74 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
注意,執行的語句要和%timeit放在同一行,%timeit python語句
%time指一次執行程式碼的總體時間
%tinmeit指多次執行程式碼的平均時間,使用這個命令是因為每次執行同一個程式碼的時間是不一樣的,所以通過多次執行程式碼求出的平均時間更能說明程式碼的總體執行時間
4、%who和%who_ls和%whos——檢視當前interactive環境中的變數
他們都可以檢視當前的ipython環境中有哪些變數,但有所區別
%who :依次顯示出每一個變數的名稱
%who_ls:以列表的形式返回
%whos:顯示出每一個變數的詳細資訊
In [5]: %who
a b c
In [6]: %who_ls
Out[6]: ['a', 'b', 'c']
In [7]: %whos
Variable Type Data/Info
----------------------------
a int 100
b int 200
c int 300
5、%hist——檢視歷史命令
In [11]: %hist
magic
a=100
b=200
c=300
%who
%who_Is
%who_is
%who_ls
%whos
%hist
6、刪除ipython環境中的變數
%xdel variable 刪除單個變數的引用
%reset指刪除interactive名稱空間中全部的變數名
7、其他常用魔術命令
%debug 從最新的異常跟蹤的底部進入互動式偵錯程式
%pdb 在異常發生後自動進入偵錯程式
%page OBJECT 通過分頁器列印輸出object
%prun statement 通過cprofile執行statement,並列印分析器的輸出結果
當然,魔術命令有很多,沒有完全列舉出,可以自己檢視,後面的博文中也還會接觸到。
8、ipython開發環境與cmd之間的互相切換
在ipython互動情況下,直接輸入命令 !cmd 即可進入cmd模式
在cmd模式下直接輸入 ipython 可以再次回到 ipython模式
後面會繼續深入講解ipython的高階用法,請關注!