Python 程式設計

第 1 章    簡介

(1) 課程目標

∗ 程式之道及問題解決

▸ 本教材主要目標:訓練如何像電腦科學家一樣思考

▸ 這樣的思考方式結合數學、工程學、及自然科學一些最優良的特色

▸ 電腦科學家就像數學家,使用形式語言表達概念 (特別是在計算方面)

▸ 他們也像工程師般設計東西,組合元件成為系統,然後從中評估成本效益

▸ 他們還像自然科學家,觀察複雜系統的變化,提出假說並且測試所預期的結果

▸ 電腦科學家最重要的一項能力就是 「解決問題」(Problem solving),意思是指能夠系統式地闡述問題,並且清楚正確地表解決方法

▸ 結果證明:學習程式設計就是個學習問題解決的技術,這也就是所謂的 「程式之道」(The way of the program)

∗ 課程目標

▸ 學會程式設計技術

▸ 利用程式設計作為工具,達成解決問題的目標

(2) 演算法

∗ 電腦科學的核心:問題解決

▸ 透過問題解決過程所產生的解決方案,即稱為 「演算法」(Algorithm)

▸ 演算法是 「一步一步的指令」,如果照著這些步驟執行指令就會解決問題

▸ 電腦科學的目標:針對某個問題,發展出一個演算法成為解決方案,並且可以利用電腦自動執行

▸ 程式設計 (Programming):將演算法以程式語言實作,可在電腦上執行

(3) 程式語言

∗ 程式語言 (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) 將組合語言翻譯成為機器語言讓電腦執行
✶ 例如從鍵盤輸入 2 個整數,將其相加並輸出到終端機的程式 (同上):
組合語言碼說明
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++ 語言之加總程式:
/* 由鍵盤讀入 2 個整數,加總後印出 */

#include <iostream.h>
using namespace std;
int main (void) {
    int number1, number2, result;
    cin >> number1;
    cin >> number2;
    result = number1 + number2;
    cout << result;
    return 0;
}

∗ 編譯器與直譯器

▸ 高階語言需轉譯成為機器語言 (亦稱為目的程式,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, ...
✶ 依不同實作,有些語言可編譯亦可直譯,例如 BASIC
✶ 直譯語言有時被稱為非常高階語言 (Very high-level language)

(4) Python 簡介

∗ 沿革

▸ 1980~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!')
✶ 在學 Java 的第一個程式時,就需要接觸到 class, public, static, void,String[] 資料型態等複雜觀念,對初學者的確太困難了,因此一般教師都會說「先不用管這些概念,只要知道要這樣寫程式,以後會慢慢解釋」 ;-)

∗ 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.
平舖善於層疊,勻散勝過稠密,簡單易讀才是最重要的。

Special cases aren't special enough to break the rules.
Although practicality beats purity.
特例難免但不可打破原則,務求純淨卻不可不切實際。

Errors should never pass silently.
Unless explicitly silenced.
斷勿使錯誤靜靜流逝,除非有意如此。

In the face of ambiguity, refuse the temptation to guess.
在模擬兩可之間,拒絕猜測的誘惑。

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.
任何問題都應該只有一種方法來解決,即使一開始這個方法並非如此明顯。

Now is better than never.
Although never is often better than *right* now.
凡事雖應三思後行,但坐而言不如起而行。

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.
容易解釋的實作方式,應該就是個好主意。

Namespaces are one honking great idea -- let's do more of those!
命名空間讚,吾人多實用。

∗ 常見的應用

▸ 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/

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

上一章       下一章