---
# System prepended metadata

title: Ipython常用功能

---

# Ipython常用功能
reference : Python Data Science Handbook
## Ipython常用快捷鍵
Ctrl-a: 把游標移至本列起始位置
Ctrl-e: 把游標移至本列最後位置
Ctrl-k: 把游標後面全部文字剪下
Ctrl-y: 把之前剪下貼上
Ctrl-d: 把游標後面單個刪除(類似delete)
Ctrl-p: 顯示上次輸入內容(類似直接按鍵盤往上的鍵)
Ctrl-c: 中斷目前執行的python
Ctrl-d: 離開ipython

多練習就會記住這些方便的快捷鍵。


## Ipython Magic
以下程式沒有特別使用In[ ],Out[ ]，只有簡單使用>>>
```python=
>>> print(In)       # 先前輸入的
>>> print(Out)      # 先前輸出的
>>> print(Out[2])   # 顯示Out[2]輸出內容，也可以用print(_2)，但只能使用在Out(2)
>>> 3;              # 抑制輸出，會找不到輸出內容
```

Magic還可以用
```python=
>>> len?                   # 用來查詢函式功能
```

### 程式區塊剪下貼上發生錯誤
```python=
>>> def return_num(x):
...     return x
>>> def return_num(x):     # 貼上後
...     ...    return x
>>>
>>>
>>> %paste                 # 用於多個程式輸入，並完成執行
>>> %cpaste                # 相較paste貼上後還可以做修改
>>>
>>> %run "xxx.py"          # 用以執行以已好程式，建議寫絕對路徑，而且需要雙引號
```

### 設定例外內容
%xmode函式: 顯示例外內容，方便除錯
```python=
>>> %xmode plain
>>> %xmode context    #預設
>>> %xmode verbose
```
palin: 顯示內容最少
context: 比palin多顯示函式內部指令
verbose: 比context多顯示變數傳遞內容


### Ipython debug
會進入debug模式，原本輸入>>>換成ipdb>。
```python=
>>> %debug               # 需上行有程式發生例外
>>> %debug func1(a, b)   # 指定哪個函式
>>> %run -d "xxx.py"     # -d: debug，指定要處理的檔案
```
#### 更多命令表
```python=
ipdb> h

Documented commands (type help <topic>):
========================================
EOF    cl         disable  interact  next    psource  rv         unt
a      clear      display  j         p       q        s          until
alias  commands   down     jump      pdef    quit     source     up
args   condition  enable   l         pdoc    r        step       w
b      cont       exit     list      pfile   restart  tbreak     whatis
break  continue   h        ll        pinfo   return   u          where
bt     d          help     longlist  pinfo2  retval   unalias
c      debug      ignore   n         pp      run      undisplay

Miscellaneous help topics:
==========================
exec  pdb

ipdb>
```

## 測量運行時間
在測量時間有time和timeit，time是指運行一次，而timeit是重複運行。有些程式是做資料運算，當第一次資料運算完，第二次就會快很多，用timeit會有判斷時間上的不正確。
```python=
>>> %time L = [n ** 2 for n in range(1000000)]    # 單行使用
>>> %%time                                        # 多行使用
...: L = []
...: for n in range(100):
...:     L = n ** 2
>>> %timeit L = [n ** 2 for n in range(1000000)] 


