Python 程式設計

第 1 章    簡介

(1) 課程目標

∗ 利用電腦解決問題

▸ 電腦科學家最重要的一項能力就是「解決問題」(Problem solving)

✶ 能夠系統化的闡述問題,並且清楚正確地規劃出解決方案與執行步驟
✶ 利用程式作為工具,達成解決問題的目標
✶ 演算法 (Algorithm):在問題解決過程所產生的解決方案,也就是「一步一步的指令」,如果照著這些步驟執行就會解決問題
✶ 程式設計 (Programming):將演算法以程式語言實作,可在電腦上執行

(2) 程式語言

∗ 語言分為兩種:

▸ 自然語言 (Natural language) 與程式語言 (Programming language)

∗ 程式語言

▸ 1940 年代:機器語言 (Machine language),由 0 與 1 組成之指令,電腦可直接執行

✶ 例如從鍵盤輸入 2 個整數,將其相加並輸出到終端機的程式:
16 進制2 進制
1FEF0001111111101111
240F0010010000001111
1FEF0001111111101111
241F0010010000011111
10400001000001000000
11410001000101000001
32010011001000000001
24220010010000100010
1F420001111101000010
2FFF0010111111111111
00000000000000000000

▸ 1950 年代:低階語言 (Low-level language),將每個機器語言指令以較能助憶的文字表示,又稱為組合語言 (Assembly language)

✶ 撰寫低階語言比撰寫機器語言簡單得多
✶ 組合器 (Assembler) 將組合語言翻譯成為機器語言讓電腦執行
✶ 將上述程式轉為組合語言:
組合語言碼說明
LOADRFKeyboard 從鍵盤載入暫存器 F
STORENumber1RF 從暫存器 F 儲存到 Number1 (記憶體位址 0100 0000)
LOADRFKeyboard 從鍵盤載入暫存器 F
STORENumber2RF 從暫存器 F 儲存到 Number2 (記憶體位址 0100 0001)
LOADR0Number1 從 Number1 載入暫存器 0
LOADR1Number2 從 Number2 載入暫存器 1
ADDIR2R0 R1 將暫存器 0 及暫存器 1 相加,結果存到暫存器 2
STOREResultR2 從暫存器 2 儲存到 Result (記憶體位址 0100 0010)
LOADRFResult 從 Result 載入暫存器 F
STOREMonitorRF 從暫存器 F 儲存到螢幕
HALT 停止

▸ 1970 年代:高階語言 (High-level language),較接近自然語言

✶ 撰寫高階語言比撰寫低階語言簡單得多
✶ 程式設計師可專注於應用程式,而非硬體
✶ 高階語言有可攜性 (Portable),通常可以在不同作業平台執行
✶ 將上述程式轉為 C++ 語言:
#include <iostream>

using namespace std;
int main (void) {
    int a, b;
    cin >> a;
    cin >> b;
    cout << a + b;
    return 0;
}

▸ 1990 年代:非常高階語言 (Very high-level language),語法更為簡易

✶ 撰寫程式更為簡單
✶ 將上述程式轉為 Python 語言:
a = int(input())
b = int(input())
print(a + b)

∗ 編譯器與直譯器

▸ 高階語言需轉譯成為機器語言 (亦稱為目的程式,Object code),才能讓電腦執行

✶ 轉譯器依據不同電腦轉譯為不同目的程式,可在不同電腦執行

▸ 編譯 (Compilation):利用編譯器 (Compiler) 將整個原始程式轉譯為目的程式

compile.png
✶ 編譯語言常用來撰寫系統模組,因此常稱為系統語言,執行速度快

▸ 直譯 (Interpretation):利用直譯器 (Interpreter) 一次將一個指令轉譯為目的指令並執行,如此持續指令轉譯及執行直到程式結束或發生錯誤,發生錯誤即中斷並顯示錯誤訊息

✶ 執行速度較慢,但程式開發較為快速,且因一步一步執行程式 (類似互動式模式),偵錯較為容易
interpret.png

▸ 常見高階語言 (High-level language)

✶ 編譯語言:COBOL, Pascal, FORTRAN, Ada, C, C++, Java, ...
✶ 直譯語言:PHP, Perl, Python, Ruby, MATLAB, Octave, JavaScript, ...
✶ 直譯語言有時也稱為非常高階語言 (Very high-level language)

(3) Python 簡介

∗ 沿革

▸ 1990 年代:由荷蘭程式設計師 Guido van Rossum 所研發

▸ 2000 年:Python 2

▸ 2008 年:Python 3 (與 Python 2 並不完全相容!)

∗ 語言特性

▸ 容易學習、功能強大

▸ 高效率的高階資料結構

▸ 簡單且有效的物件導向特性

▸ 優雅的語法及動態變數型態

▸ 適合快速開發應用程式

▸ 自由軟體、開放源碼、跨平台、社群支援完整

▸ 極適合當作第一個學習的程式語言

http://mcsp.wartburg.edu/zelle/python/python-first.html
http://www.cs.ubc.ca/wccce/Program03/papers/Toby.html
http://www.strchr.com/first_language

▸ 程式語言排行榜:

https://www.tiobe.com/tiobe-index/

▸ 語法非常簡單,學習進入障礙低,例如與 Java 與 Python 的 Hello world 程式比較:

JavaPython
class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}
print('Hello, world!')

∗ Python 的禪思 (The Zen of Python) 摘要:

http://www.python.org/dev/peps/pep-0020/

Beautiful is better than ugly.
Explicit is better than implicit.
美麗優於醜陋,明講好過暗諭。

Simple is better than complex.
Complex is better than complicated.
簡潔者為上,複雜者次之,繁澀者為下。

Flat is better than nested.
Sparse is better than dense.
Readability counts.
平舖善於層疊,勻散勝過稠密,簡單易讀才是最重要的。

There should be one -- and preferably only one -- obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
任何問題都應該只有一種方法來解決,即使一開始這個方法並非如此明顯。

If the implementation is hard to explain, it's a bad idea.
難以解釋的實作方式,必定是個壞想法。

If the implementation is easy to explain, it may be a good idea.
容易解釋的實作方式,應該就是個好主意。

∗ 常見的應用

▸ Web 系統框架

✶ Django: http://www.djangoproject.com/
✶ Pyramid: https://trypyramid.com/
✶ Flask: http://flask.pocoo.org/
✶ Bottle: http://bottlepy.org/docs/dev/

▸ 科學、數值運算與資料分析

✶ SciPy: http://www.scipy.org/
✶ NumPy: http://www.numpy.org/
✶ Pandas: http://pandas.pydata.org/

▸ 桌面圖形介面 (GUI)

✶ Tkinter (內建): http://wiki.python.org/moin/TkInter
✶ wxPython: https://www.wxpython.org/
✶ PyGTK: https://pypi.org/project/PyGTK/
✶ PyQT: http://wiki.python.org/moin/PyQt

▸ 跨平台自然圖形介面 (NUI) 程式開發架構

✶ Kivy: http://kivy.org/#home

▸ 網路程式

✶ Twisted Matrix Labs: http://twistedmatrix.com/trac/

▸ 電腦遊戲

✶ PyGame: http://www.pygame.org

▸ 軟體開發

✶ SCons:https://www.scons.org/
✶ Buildbot:http://buildbot.net/

▸ ERP

✶ Odoo:https://www.odoo.com/
✶ ERPNext:https://www.odoo.com/

▸ 最夯:大數據、人工智慧、機器學習、資料分析