2015年6月4日 星期四

[ Python 文章收集 ] Python 快速開發: 使用 ipython 撰寫 python 程式

Source From Here
Preface
一但習慣某個東西的好處後, 久了就會忘了它的重要性。今天重操舊業寫了久違的 python, 覺得能用 python 寫程式已很爽了, 還能用 ipython 寫 python, 更是爽上加爽!特此記錄一下, 分享給還未試過的人。底下是 iPython 的簡介:
IPython provides a rich architecture for interactive computing with:
* Powerful interactive shells (terminal and Qt-based).
* A browser-based notebook with support for code, rich text, mathematical expressions, inline plots and other rich media.
* Support for interactive data visualization and use of GUI toolkits.
* Flexible, embeddable interpreters to load into your own projects.
* Easy to use, high performance tools for parallel computing.

ipython 是 python 的互動式 shell, 功能相當強大, 而且預設設定就相當好用。如今 ipython 已發展到 令人難以想像的地步, 以下只是基本的使用情境。

試用別人的模組
如果還沒有安裝 ipython, 可以使用 pip install ipython 進行安裝:
# ipython
Python 2.7.5 (default, Jun 17 2014, 18:11:42)
Type "copyright", "credits" or "license" for more information.

IPython 3.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.


In [1]: import os

In [2]: os.path.join? # 檢視 os.path.join 說明
Signature: os.path.join(a, *p)
Docstring:
Join two or more pathname components, inserting '/' as needed.
If any component is an absolute path, all previous path components
will be discarded. An empty last part will result in a path that
ends with a separator.

File: /usr/lib64/python2.7/posixpath.py
Type: function

In [3]: os.pa<Tab> # 透過 Tab 鍵 可以進行提示
os.pardir os.path os.pathconf os.pathconf_names os.pathsep

In [3]: os.path.join('a','b')
Out[3]: 'a/b'

如果你使用 os.path.join?? 則可以帶出該函數的代碼:


有了 <TAB>、? 和 ?? 後, 不太需要從外部找參考手冊, 直接在 ipython 裡試比較快.

開發片段小程式
試了一些片段小程式, 了解怎麼使用別人的模組後, 再來會想拼湊一些小程式。這時可用 edit 進入編輯器 (會選用環境變數 EDITOR 設的值):
In [1]: edit
IPython will make a temporary file named: /tmp/ipython_edit_bAOgl9.py
Editing... done. Executing edited code...

Out[1]: 'class Rect(object):\n def __init__(self, x, y, w, h):\n self.x = x\n self.y = y\n self.w = w\n self.h = h\n'

In [2]: r = Rect(0, 0, 100, 50)

In [3]: r.w
Out[3]: 100

In [4]: r.area()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
in ()
----> 1 r.area()

AttributeError: 'Rect' object has no attribute 'area'



In [5]: edit -p
IPython will make a temporary file named: /tmp/ipython_edit_stFwGi.py
Editing... done. Executing edited code...
Out[5]: 'class Rect(object):\n def __init__(self, x, y, w, h):\n self.x = x\n self.y = y\n self.w = w\n self.h = h\n\n def area(self):\n return self.w * self.h\n'


In [6]: r2 = Rect(0, 0, 100, 50)

In [7]: r2.area()
Out[7]: 5000

在第一行按 edit 後, 畫面會切到編輯器, 寫好內容存檔離開後, ipython 會載入剛才打的內容到 ipython 裡, 也就是第一行輸出 'class Rect(object):\n def __init__ ...' 那一串。這裡我定義了 class Rect, 然後試一下 Rect 看看有沒有寫錯。接著第五行 edit -p 表示回去編輯上一次的內容, 執行後一樣會進入編輯器, 不過內容會先有上一次打過的東西。這回我多補了 area() 函式, 於是新增的 Rect 物件就有這函式了。

拼湊差不多後, 可用 edit -p 取得內容, 另外存到檔案, 或是打 hist 看打過的內容, 手動剪貼到檔案裡。

開發完整程式
想法明確時, 直接用編輯器編寫, 再輔以 ipython 測試更有效率。首先, 終端機A的編輯器畫面如下所示, 寫了一個階乘函數:
  1. # foo.py  
  2. def factorial(n):  
  3.     s = 1  
  4.     for i in range(n):  
  5.         s *= i  
  6.     return s  
然後在終端機B的 ipython 測試:
In [1]: import foo

In [2]: foo.factorial(3)
Out[2]: 0 # 結果不如預期, 回到原代碼進行修改並使用 reload 重新載入模組

In [3]: reload(foo)
Out[3]: 

In [4]: foo.factorial(3)
Out[4]: 6

第二行測完發覺結果不對, 於是回終端機 A 修改, 將 range(n) 改為 range(1, n + 1), 再回來終端機 B 執行 reload(foo) 重新載入 foo。接著第四行重測就得到正確的結果了。 當然, 發覺結果不對時, 也可以在 ipython 測測 range() 的用法, 或用 range? 看看說明, 很快就會找到答案。

Supplement
Introducing IPython
You don’t need to know anything beyond Python to start using IPython – just type commands as you would at the standard Python prompt. But IPython can do much more than the standard prompt. Some key features are described here. For more information, check the tips page, or look at examples in theIPython cookbook.

If you’ve never used Python before, you might want to look at the official tutorial or an alternative, Dive into Python.


沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...