Python開發者必備,史上最詳細的ipython教程

python開發者必備,史上最詳細的 ipython 教程——上

Python開發者必備,史上最詳細的ipython教程

送你小心心記得關注我哦!!

進入正文

Python開發者必備,史上最詳細的ipython教程

全文摘要

ipython到底有什麼用,可能很多小夥伴平時都是在用集成的IDE編寫代碼,比如pycharm等,但是ipython實際上是python最有力的武器,在數據分析科學、數據挖掘等領域有著不可替代的作用。但是很少有系統性的ipython教程,大多是零散分散的一些教程,小編進過悉心整理,決定出一期ipython詳細教程,本文是第一期,後面會繼續跟進,歡迎繼續關注。本文較長,閱讀時間約30min。

Python開發者必備,史上最詳細的ipython教程

ipython教程——系列一

01

ipython簡介

關於什麼是ipython,本文就不加以介紹了,他是一個非常流行的python解釋器,相比於原生的python解釋器,有太多優點和長處,因此幾乎是python開發人員的必知必會。

ipython簡介

Ipython的優勢所在

(1) python shell不能在退出保存歷史;ipython歷史記錄自動保存:保存在history.sqlite文件下:可用“_”、“__”、“___”調用最近三次記錄;

(2) python shell不支持tab自動補全;ipython支持tab補全;

(3) python shell不能快速獲取類、函數信息;ipython通過“?”顯示對象簽名、文檔字符串、代碼位置,通過“??”顯示源代碼;(4) python shell不能直接執行shell命令,需要藉助sys;ipython通過“!”調用系統命令,如“!

(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表示輸出。

02

ipython的內省

ipython相較於原生的python,提供了更加強大的內省功能,所謂內省,也稱之為內視

,即 object introspection,主要有以下一些常見的方法:

object? 或者?object :顯示該對象的一些通用信息,注意python裡面一切皆對象哦,包括函數、類。

object?? 或者??object:兩個問號顯示詳細信息,如果是類或者是函數,還會顯示源代碼。即將問號放在前面和後面都可以。

通配符*匹配:如

numpy.*load*? 這會顯示所有的包含有load的函數

numpy.*sort? 這會顯示所有以sort結尾的函數

03

ipython的快捷鍵

ipython其實完全可以看成是一個集成的開發環境了,相較於原生的python編輯環境,有著眾多實用的快捷鍵操作。下面介紹一下第一個和第二個快捷鍵,比如有如下所示:

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或者是向下的方向鍵,則正好相反。

04

ipython的魔術命令

什麼是ipython的魔法命令?

魔術命令是ipython提供的最為強大的武器,所謂的魔術命令,是指那些給我們提供方便,輕鬆控制ipython交互系統的命令,可以這樣去理解,魔術命令可以看成是ipython交互環境下面的命令行程序,其中很多還有一些命令行參數選項。

%quickref :可以顯示ipython的快速參考

%magic :可以查看到底有哪些模式命令(這個方法會顯示每一個命令的詳細信息,因此會很多)

%lsmagic :這裡只會顯示模式命令的名字,會比較簡潔,查看起來更方便

%命令? 或者是%命令??:當我們想要查看某一命令的詳細信息,我們可以使用同前面類似的方法,在魔術命令後面添加一個或者是兩個問號??來查看詳細信息。

自動魔術命令——automagic

默認情況下,魔術命令總是以百分號%開頭,但這不是必須的,我們也可以不使用百分號,我們也可以直接使用不帶百分號的魔術命令,這稱之為“自動魔術命令——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>()/<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之間的互相切換

(1)在ipython交互情況下,直接輸入命令 !cmd 即可進入cmd模式

(2)在cmd模式下直接輸入 ipython 可以再次回到 ipython模式

後面會繼續深入講解ipython的高級用法,請關注!

python開發者必備,史上最詳細的 ipython 教程——下

進入正文

Python開發者必備,史上最詳細的ipython教程

全文摘要

ipython到底有什麼用,上一篇文章中講到了ipython的基礎應用、優良特性、自動補全、內省、魔術命令的基礎知識,本文將繼續在此基礎之上,對ipython進行進階,包括qtconsole的使用、與matplotlib的集成、與操作系統進行交互等較為高級的內容。本文是系列文章的第二期,後面會繼續跟進,歡迎繼續關注。本文較長,閱讀時間約30min。

Python開發者必備,史上最詳細的ipython教程

ipython教程——系列二

聲明:本文承接前面一篇文章,ipython系列之一;另外,本文所指的ipython不是ipython notebook,ipython notebook已經被jupyter notebook所取代,不再叫ipython notebook了。

前面講解了ipython裡面的一些核心知識點,包括它的優勢所在、快捷鍵操作、內省、什麼是魔術命令等等,本文將在前文的基礎之上,進一步拓展,講解ipython的進階知識點。

01

ipython與matplotlib集成

關於matplotlib的強大之處,這裡不再說明,想要知道matplotlib的體系架構和繪圖方法,可以參見我的另外兩篇文章:

matplotlib高級繪圖——路徑和形狀

matplotlib教程——matplotlib與tkinter集成

深入詳解matplotlib畫圖進階

我們先通過一個簡單的例子來說明,我需要使用ipython畫一個簡單圖形,如果直接打開ipython,然後繪製,代碼如下:

In [1]: import matplotlib.pyplot as plt

In [2]: x=[1,2,3,4,5]

In [3]: y=[2,4,6,8,10]

In [4]: plt.plot(x,y)

Out[4]: [<matplotlib.lines.line2d>]/<matplotlib.lines.line2d>

In [5]: plt.show()

然後會打開下面的一個圖像,如下:

Python開發者必備,史上最詳細的ipython教程

但是,會出現一個問題,這個時候我如果想要繼續在ipython裡面輸入其他的語句或者是執行其他的命令,沒辦法執行了,這是因為matplotlib的GUI時間循環接管了ipython的控制權,只有關閉了GUI窗口,才能夠繼續進行操作。這種

阻塞式的問題極大地影響了交互體驗,那怎麼辦呢?

我們不要直接啟動在菜單中啟動ipython,而是通過輸入cmd命令,然後通過命令 ipython --pylab 這句話啟動ipython,通過添加參數--pylab就可以解決上面的阻塞問題了,現在當我們再次輸入上面的代碼,發現及時GUI沒有關閉,我們依然可以在ipython中進行交互,這是非常方便的。

--pylab 參數有以下兩個方面的好處:

(1)ipython會默認啟動後臺的GUI,這樣就不需要plt.show()這一句話,在plot繪圖函數後面直接回車,就可以顯示圖片了

(2)GUI不會對ipython造成任何阻塞,不會影響交互

注意,我們還可以通過魔法命令%gui,選擇合適的畫圖後端引擎,一般格式為%gui guiname,如下所示:

%gui wx # enable wxPython event loop integration

%gui qt4|qt # enable PyQt4 event loop integration

%gui qt5 # enable PyQt5 event loop integration

%gui gtk # enable PyGTK event loop integration

%gui gtk3 # enable Gtk3 event loop integration

%gui tk # enable Tk event loop integration

%gui osx # enable Cocoa event loop integration

# (requires %matplotlib 1.1)

%gui # disable all event loop integration

關於後端畫圖引擎,還有一個魔術命令%matplotlib 可以使用,常見的如下:

(1)%matplotlib #顯示當前使用後端

Using matplotlib backend: TkAgg

(2)%matplotlib --list 或者是 -l #顯示有哪些後端可以使用

Available matplotlib backends: ['osx', 'qt4', 'qt5', 'gtk3', 'notebook', 'wx', 'qt', 'nbagg','gtk', 'tk', 'inline']

(3)%matplotlib inline #這是在jupyter notebook中使用的,讓jupyter與matplotlib集成,這種情況下,默認使用的是TkAgg後端

但是上面的方式依然有一個問題,那就是ipython窗口與matplotlib窗口並沒有放在一起,雖然他們不再有阻塞,但是依然影響更加舒適的交互體驗,因為ipython程序是一個和用戶終端有點類似的黑色的窗體(實際上我們可以修改它的主題),如果能夠將matplotlib所化的圖形就放在ipython裡面多好,這樣就不會出現多個窗體程序了,我們有幾種方式實現:

(1)通過第三方的相關庫,是完全可以將matplotlib放在ipython裡面的,

(2)通過另一種形式——jupyter qtconsole來實現這樣的目的

02

jupyter qtconsole

jupyter qtconsole的前身叫做ipython qtconsole,同ipython notebook一樣,後面改成了jupyter,至於什麼是jupyter,下一篇文章會專門介紹到jupyter notebook的使用。

jupyter qtconsole 是ipython團隊基於qt框架開發的一個GUI控制檯,但是這個“控制檯”很特殊,它具有富文本編輯功能,既能夠在裡面實現內嵌圖片、多行編輯、語法高亮等這樣的“富文本功能”。關於qtconsole的安裝和啟動這些基礎知識,這裡就不在介紹了。

我們在qtconsole裡面輸入如下代碼:會得到直接的一個結果如下所示:

Python開發者必備,史上最詳細的ipython教程

我們發現,所化的圖像直接就顯示在了qtconsole裡面,不需要我設置什麼其他的,這是多麼的人性化,這樣的功能對於編寫一個大型軟件,使用qtconsole進行小模塊的測試和試驗,是特別有幫助的,這就是qtconsole的簡單強大之處。

現在可以回答什麼是qtconsole了???

它是一個具有菜單的富文本編輯的控制檯,ipython具有的功能(tab自動補全、語法高亮、內省、魔術命令等等),它都有,它是ipython的進一步改進版。

注意:上面的操作是基於新版本的jupyter qtconsole,它默認就已經將matplotlib集成到了qtconsole一起了,但是對於老版本的ipython qtconsole,並沒有,因此不能直接打開ipython qtconsole,而是要在cmd中使用命令ipython qtconsole --pylab=inline 進行打開才行。

03

命令歷史記錄與輸入輸出

1、所謂的命令歷史主要是上一篇文章中已經講到的兩個快捷鍵的使用,即Ctrl+PCtrl+N。還可以使用%hist魔術方法。

2、所謂的輸入與輸出主要是使用 _、__、_X、_iX,這裡的X表示行號,在前面也已經講過,這裡就不重複了。

關於這二者的使用,可以參見上一篇文章:

04

ipython與操作系統的交互

ipython與操作系統的shell是聯繫的非常緊密的,我們可以直接在ipython中就實現在操作系統的shell中所做的事情,包括執行shell命令、更改目錄、為shell提供別名、創建目錄書籤、將shell執行的結果保存在python的對象中 等等操作,下面進行一些常見的實例。

4 ipython與操作系統交互

4.1 ipython與cmd的轉化

在ipython中輸入 :!cmd

在ipython中打開系統的cmd。這就相當於現在ipython已經變成了系統自帶的cmd,若要回到ipython界面,可以再輸入ipython,這就相當於在cmd中啟動ipython

4 ipython與操作系統交互

4.2 ipython中常見的魔術命令

%pwd :返回當前ipython的工作目錄

%cd newdirectory: 進入新的工作目錄

%dhist :打印目錄訪問的歷史

%env :以dict的形式返回系統的環境變量

如下:

In [1]: %pwd

Out[1]: 'D:\\ProgramData\\Anaconda3\\envs\\tensorflow\\Scripts'

In [2]: %cd C:\Users\XinAir\Desktop

C:\Users\XinAir\Desktop

In [3]: %dhist

Directory history (kept in _dh)

0: D:\ProgramData\Anaconda3\envs\tensorflow\Scripts

1: C:\Users\XinAir\Desktop

注意:所謂的ipython與系統自帶的shell是

集成的,主要是體現在兩個方面

(1):我可以在ipython裡面用魔術命令的方式達到在shell中執行系統命令的效果,比如上面的例子,返回當前的工作目錄,進入新的從做目錄等操作,這些操作本來是在shell中完成,但是我在ipython中通過魔術命令依然可以完成。

(2)在ipython中我也可以直接使用系統shell的命令,只不過需要在原來的shell命令前面加上一個感嘆號!,這就是為什麼

!cmd 就會打開系統shell的原因了,比如我可以在ipython中查看本機的IP地址,執行 !ipconfig。因為window系統中查看IP地址的shell命令就是ipconfig,在ipython中只需要在系統shell命令前面加上一個感嘆號!就可以了。

再比如,我們都知道在windows下面,執行shell命令notepad會打開一個記事本,同樣,如果我們在ipython中輸入

!notepad ,發現,也會打開一個記事本。

這兩個方面的區別在於,第一種方法是通過魔術方法完成,但是,並不是所有的系統shell命令都會有一個魔術方法與之對應,魔術方法只定義了一些常見的shell命令,但是第二種方法,只要使用

!shell_command均可以。

4 ipython與操作系統交互

4.3 ipython為系統的shell命令定義別名

根據上面的說法,也就說很多系統shell命令並沒有與之對應的魔術方法,那怎麼辦呢?我們可以給系統shell命令定義一個別名,然後在使用魔術方法實現。定義別名的方法為:

%alias new_name shell_command

%alias是一個魔術方法 ,new_name是人為的起的別名,shell_command是系統的shell命令的名稱,比如我給系統shellnotepad定一個別名abcd,如下:

%alias abcd notepad

然後執行%abcd就可以打開一個記事本了,如下:

In [4]: %alias abcd notepad

In [5]: %abcd

再舉個例子,在windows系統中,輸入shell命令 calc會打開一個計算器應用程序,我們也可以在ipython中給它定義一個別名,如下:

In [8]: %alias xyz calc

In [9]: %xyz

這樣也會打開一個計算器。

總結:ipython與系統shell交互的兩種方式如下所示:

Python開發者必備,史上最詳細的ipython教程

4 ipython與操作系統交互

4.4 ipython的目錄書籤系統

所謂的書籤系統就是,給經常使用的目錄起一個別名,以便實現快速跳轉。格式為:

%bookmark 書籤名 文件目錄

其中%bookmark是魔術命令。

比如,我有一個常見的經常使用的目錄,D:\ProgramData\Anaconda3\envs\tensorflow\Scripts

要在ipython中進入這個目錄我可以這麼辦 %cd D:\ProgramData\Anaconda3\envs\tensorflow\Scripts,但是如果要經常進入這個目錄就很麻煩,因為需要輸入很多字母,現在我給他起一個書籤名,如下:

In [10]: %bookmark mydir D:\ProgramData\Anaconda3\envs\tensorflow\Scripts

In [11]: %cd mydir

(bookmark:mydir) -> D:\ProgramData\Anaconda3\envs\tensorflow\Scripts

D:\ProgramData\Anaconda3\envs\tensorflow\Scripts

給這個目錄起一個書籤名稱mydir,然後通過別名進入到指定的目錄,由此可見這種方式對於經常使用的目錄,非常有幫助。

05

ipython的高級功能

ipython的功能當然遠遠不止於此,他還有更加高級的功能,包括日誌處理、代碼調試、性能分析、自定義主題顯示、甚至是自定義魔術命令等等方面的問題,後面的文章會繼續分析跟進。下一篇會介紹到關於jupyter notebook的詳細使用教程。

Python學習路線和PDF電子書:Python 全系列

第一階段:Python入門第二階段:Python 深入與提高第三階段:Python 網絡與併發編程第四階段:數據庫編程基礎第五階段:Linux 環境編程基礎第六階段:Python 核心特性第七階段:網頁編程基礎第八階段:Python_Django 框架第九階段:Python_Tornado 框架第十階段:Python_大型電商項目第十一階段:Python 爬蟲開發第十二階段:面試和成功求職的秘技第十三階段:入職後快速成長到CTO

Python開發者必備,史上最詳細的ipython教程
Python開發者必備,史上最詳細的ipython教程
Python開發者必備,史上最詳細的ipython教程

只需關注轉發文章私信小編(學習)就可拿到!


分享到:


相關文章: