2017-09-10

學習 Python 不可不知的開發工具 IPython 和 Jupyter Notebook

IPython 和 Jupyter Notebook 是強大的互動式開發環境,有許多非常很好用的功能,讓程式設計的過程更為便利…



讓我們先從IPython開始!






IPython 是一個提供互動運算的命令界面(command shell),所以它是以命令列的方式操作和互動。什麼年代了,還在用命令列?感覺超遜!但它具有以下的特點:

  • 提供強大功能的程式互動界面。
  • 可整合不同的編輯器並執行作業系統命令。
  • 視覺化的運算資料呈現並結合圖形化工具。
  • Python 程式專案管理。
  • 支持平行運算。
  • 並且是 Jupyter Notebook 的核心。

安裝好 Anaconda Distribution (若您尚未安裝 Anaconda Distribution,請看《Python 超強套件包 - Anaconda Distribution》這篇來完成安裝),IPython也同時安裝好了。我們直接從Windows開始功能表中開啟 IPython。

一開啟IPython就會看到Python、Anaconda Distribution、IPython的版本訊息,以及常用的查詢命令提示。本篇使用的Anaconda Distribution版本是4.4.0,IPython是5.3.0。
IPython的功能非常多,我們僅簡單介紹,其他的功能,大家在使用的過程中慢慢學習喔!

我們先輸入兩個簡單的指令,print(),以及數位運算,這和Python IDLE沒什麼不同,都會立即執行並輸出結果,因為這是Python直譯器 (Interpreter)。

大家會看到命令等待字元 In[n] 和 Out[n],n表示是第幾列命令,同時也是歷史指令,可以用In[2]重新執行該列命令。
使用 Tab鍵會自動補字,並提供可能的函數及命令候選。
IPython還提供具強大功能的神奇函數(Magic functions),如 %timeit 會自動計算執行時間(execution time),還會重覆執行取得較佳的執行時間(a better estimate of running time),如下的例子:

In [1]: %timeit range(1000)
100000 loops, best of 3: 7.76 us per loop

In [2]: %%timeit x = range(10000)
...:max(x)
...:
1000 loops, best of 3: 223 us per loop

自動執行了10萬次和1千次取得執行時間。
IPython還能執行作業系統命令,如 !dir 列出目前檔案或 !ping www.google.com.tw


IPython就介紹到這裡,想了解更多IPython的使用可以到這裡 IPython Documentation,接下來要介紹更強大的Jupyter Notebook。







Jupyter Notebook 原名為(IPython Notebook),您可以想成是 IPython + Notebook,實際上Jupyter Notebook包含了以下三個部份:
  • The notebook web application
  • Kernels
  • Notebook documents

各部份的細節不是很重要,Kernel指的就是前述的IPython,它是Jupyter Notebook的核心,換句話說,IPython有的功能,Jupyter Notebook都有。Notebook則是開放原始碼的Web開發環境,它特別的地方在於,可以將程式開發的過程連同程式碼、數學公式、說明文字及圖示、運算結果,甚至是影片都完整的記錄下來,還可以重覆編輯、修改和執行。這些記錄可以用多媒體的方式和不同管道,如email、Dropbox、GitHub,分享給專案成員。
同樣的,安裝好Anaconda Distribution的時候,Jupyter Notebook也安裝好了。一樣從Windows開始功能表中開啟Jupyter Notebook,接下來會看到一個命令視窗被開啟,這是notebook server,並會在瀏覽器中開啟Jupyter Notebook。


接下來使用的第一步為:

1. Creating a new notebook document
開啟一個新的notebook document,從右手邊的【New】 → 【Notebook: Python 3】,會出現一個新的Web執行環境。


2. Code Cell
在這裡就可以執行命令了,您會看到一開始是Code狀態,這是基本的程式碼輸入和執行狀態。 Markdown 和 Raw NBConvert 則是讓您可以進一步編輯和處理程式碼,加上格式或說明。
下圖藍色框的 Untitled2 是您可以為這一次的 Notebook 執行加上名字,並且儲存起來。日後可以再回到上次程式執行的進度。您會發現 Notebook 的概念是幫您記錄程式開發和思考的過程,而非只是一個單純的程式編輯器和開發環境。
中間那一排按鈕則是 Code Cell 工具,由左至右分別是:儲存Notebook、新增一個Cell、剪下選擇的Cell、複製選擇的Cell、貼上Cell、將選擇的Cell向上移動、將選擇的Cell向下移動、執行 (Run) 選擇的Cell (快速鍵是 Shift + Enter)、中斷Kernel、重新啟動Kernel (這個Kernel的用途,我目前的了解是,有時在測試程式時很可能執行到一半需要強迫中斷,比如說不小心寫了個無窮迴圈,或需要立即中斷程式不再執行了,或測試程式時發現按下執行(Run),Notebook 都不動作、不反應了,您就可以用重新啟動 Kernel 按鈕來讓 Notebook 重新恢復正常)。



3. 簡單操作
Code Cell 使用方式和 IPython 相同,前述執行的各項指令、神奇函數、作業系統命令在這裡也都可以使用,我們試一下前面執行的指令。可以看到下圖的 In [1], In [2]一個一個的格子即是 Code Cell,輸出(output)也是,而且每個cell都可以重新編輯、移動順序和執行。



4. 多功能操作環境
Jupyter Notebook 是一個多功能的操作環境,可以處理程式編輯、數學計算、繪圖、數學公式、甚至是影片。來操作看看吧!
4-1. 程式編輯
我們將《程式邏輯思考與虛擬碼(Pseudo Code)》中的Python程式碼拿來試試。您可以在Cell中完成所有程式的輸入後再執行 (RUN, Shift + Enter),也可以像在 IPython 一行一行執行。如果想把這個過程存下來,先到上方的 Title 給這篇 Notebook 新名字,比如今天的日期,然後按下儲存Notebook。接著我們回到 Home 頁面,您就會看到以新 Title 為名的資料被存起來了。下次要繼續使用,在 Home 頁面點這個 Title 就可以叫出來繼續了。



4-2. 數學計算
可以在Notebook裡直接作數學計算,也可以設定變數用程式作運算,請注意 Python 是 case-sensitive,大小寫是不同的喔。乘號是1顆星(*),次方是2顆星(**)。



4-3. 圖形輸出
套件 Matplotlib 提供了類似 Matlab 的圖形輸出功能,可以繪製極為漂亮的2D, 3D圖形。我們用 Matplotlib 提供的範例 2dcollections3d_demo.py 呈現它強大的繪圖能力。

# =======================
# Plot 2D data on 3D plot
# Example code from "mplot3d example code: 2dcollections3d_demo.py"
# https://matplotlib.org/examples/mplot3d/2dcollections3d_demo.html
# =======================

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.gca(projection='3d')

# Plot a sin curve using the x and y axes.
x = np.linspace(0, 1, 100)
y = np.sin(x * 2 * np.pi) / 2 + 0.5
ax.plot(x, y, zs=0, zdir='z', label='curve in (x,y)')

# Plot scatterplot data (20 2D points per colour) on the x and z axes.
colors = ('r', 'g', 'b', 'k')
x = np.random.sample(20*len(colors))
y = np.random.sample(20*len(colors))
c_list = []
for c in colors:
    c_list.append([c]*20)
# By using zdir='y', the y value of these points is fixed to the zs value 0
# and the (x,y) points are plotted on the x and z axes.
ax.scatter(x, y, zs=0, zdir='y', c=c_list, label='points in (x,z)')

# Make legend, set axes limits and labels
ax.legend()
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_zlim(0, 1)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# Customize the view angle so it's easier to see that the scatter points lie
# on the plane y=0
ax.view_init(elev=20., azim=-35)

plt.show()


4-4. 數學公式編輯
用 IPython.display Math 套件可以製作很漂亮的數學公式。

# Example code from "Mastering Python for Finance"-James Weiming (Packt 2015)
from IPython.display import Math
Math(r'N(x) = \frac{1}{\sqrt{2\pi}}\int_{-\infty}^{x} e^{-\frac{z^2}{2}}\, dz')


4-5. 多媒體呈現
還可以顯示圖片、HTML、甚至是 YouTube影片喔!

# Example code from "Mastering Python for Finance"-James Weiming (Packt 2015)
from IPython.display import Image
Image(url='http://python.org/images/python-logo.gif')


# Example code from "Mastering Python for Finance"-James Weiming (Packt 2015)
from IPython.lib.display import YouTubeVideo
# An introduction to Python by Google.
YouTubeVideo('tKTZoB2Vjuk')


# Example code from "Mastering Python for Finance"-James Weiming (Packt 2015)
from IPython.display import HTML
table = """<table>
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
<tr>
<td>(1,1)</td>
<td>(1,2)</td>
</tr>
<tr>
<td>(2,1)</td>
<td>(2,2)</td>
</tr>
</table>"""
HTML(table)


Jupyter Notebook 初步的使用簡單介紹到此,別忘了只要按下儲存Notebook就可以把過程都存下來喔。若想多了解Jupyter Notebook可以到 Jupyter Notebook Tutorial in Python 有更詳細的介紹。


參考資料: