» 第三章補充資料
重點整理
- 雖然寫程式可用循序的方法將每個步驟詳細載明,然而缺點是難以有效的重複利用程式碼。函數可使我們將程式切割成一個一個的小單元,藉由函數呼叫可以有效組織程式的執行方式。函數為小單元的方式,另外還有更大單元的組織方式,如自訂資料型態,可自行定義資料的儲存、運作模式,另如模組,亦即是Python組織程式檔案的方法,任一程式都是模組,也都可從其他模組引入變數、函數或自訂資料型態的定義。
- Python語言提供了廣大的built-ins,即內建變數、內建函數與內建型態等。這些built-ins由於是寫程式經常會利用到的項目,所以語言提供的目的不外讓人可以直接利用,使得利用Python寫程式更為便利與容易。
- 關鍵字為程式語言保留給語法剖析的字詞,也可稱為保留字,Python的特色與功能可由其看出端倪。
- Python允許使用英文大小寫字母、底線即數字作為變數名稱,除了數字不可用為變數開頭外,英文大小寫字母與底線皆可。關鍵字不可用作變數名稱,然而雖然built-ins可作為變數名稱,但由於避免自行定義的名稱與內建的名稱互相衝突,所以還是盡量避免使用built-ins為變數名稱。
- 定義函數時所用的關鍵字為def,形式如下
def function_name(parameter_list):
在關鍵字def後緊接著是函數名稱,這裡用的是function_name,定義函數名稱的規範同變數的命名規則。函數名稱後用小括弧圍起來的是參數列,函數可以是沒有參數或是有一到多個參數,端視函數的需要而定義,小括弧後的冒號,代表其下方為一個程式區塊,須做縮排。
some statement
return something
函數定義內(也就是下方的程式區塊)可由多個陳述組成,函數最後可用return陳述回傳數值,也可以不回傳數值,這時拿掉return陳述即可。 - 函數內建立的變數稱為區域變數,不可在函數定義外的範圍使用該名稱。
- 替程式做註解的符號為井字號 #,在井字號後的均會被直譯器所忽略。
- 遞迴為函數不斷重複呼叫本身的計算方式,如費伯納西數的計算方式
def fi_recursion(n):
fi_recursion(4)呼叫得到fi_recursion(3)+fi_recursion(2),由於fi_recursion(2)得到1,這部份不會再做計算,但是fi_recursion(3)還沒得到結果,於是fi_recursion(3)呼叫得到fi_recursion(2)+fi_recursion(1),fi_recursion(2)與fi_recursion(2)都得到1,於是fi_recursion(4) = fi_recursion(3)+fi_recursion(2) = [fi_recursion(2)+fi_recursion(1)]+fi_recursion(2) = 3。
if n==1 or n==2:
return 1
else:
return fi_recursion(n-1)+fi_recursion(n-2) - Python有兩個內建讓使用者輸入資料的函數,分別是input()與raw_input(),前者接受的輸入為運算式,後者將所有輸入都轉換為字串。
- 線性搜尋為一種簡單的搜尋方式,藉由逐步比對每一筆資料是否與所欲搜尋的項目是否相等,來找到該筆資料所在的位置。
- 使用Unicode編碼可以有效的處理中文字串,因而處理中文前應先將字串轉換為Unicode編碼。除了使用內建函數unicode()轉換外,比較簡單的建立Unicode編碼字串的方式為利用u前綴字串。
術語解釋
術語 | 解釋 |
---|---|
介面 | 所謂的介面是泛指兩種東西的交界處,而程式語言中的介面分為好幾種,其中一種是某段程式碼與另一段程式碼之間的交流,如函數呼叫中,呼叫者與函數定義常常是兩段放在不同地方的程式碼,其他比較常見的則有應用程式介面或是使用者介面等。 |
函數 | 程式中的小單元,優點為可重複利用程式碼,也可依單元的排列來規劃程式的執行順序。函數有許多其他的稱法,如函式、常式、程序或副程式等。 | 自訂資料型態 | 資料型態是比函數更大的程式單元,可個別設定符合該資料的屬性及方法,屬性為數值,而方法同函數。 |
模組 | 模組是Python組織檔案的方式,凡儲存成副檔名.py的檔案均為Python的模組。某一模組內可從其他模組引入函數等的定義,藉以增加成是碼的重複利用。 |
built-ins | Python直譯器內建函數、型態等的總稱。 |
關鍵字 | 也可稱為保留字,概括語言所有的功能及特色,同時為程式語言剖析程式語法的字組。 |
內建型態 | Python直譯器內建的型態,可於寫程式時直接使用,如整數、浮點數、字串、串列、序對及字典等。 |
內建函數 | Python直譯器內建的函數,可於寫程式時直接使用,如license()、 type()、help()、len()、range()、sum()、int()等。 |
參數 | 函數定義中需要傳入函數計算的數值,因此呼叫函數也需提供適當的參數,不然會發生TypeError。 |
型態轉換 | Python的內建型態有相對應的型態轉換函數,使一種型態可以輕易的轉換到另一種,如>>>list(“hello”) |
SyntaxError | 執行中因發生錯誤中斷而發生的訊息,此指句型錯誤。 |
周蟒 | 其為針對華文地區,提供以中文寫程式便於程式語言教學的計畫。 |
費伯納西數列 | 一組數字的總稱,前兩個數字皆為1,其後的數字都為前兩個數字的和,如下n1=1, n2=1 |
def | 定義函數所使用的關鍵字。 |
return 陳述 | 函數可傳數值,也可不回傳數值,return陳述用為函數中最後回傳數值的陳述。return為Python的關鍵字之一。 |
函數呼叫 | 程式中使用函數的方法,如n=range(10) 即呼叫內建函數range()建立一個含有整數0到9的串列。 |
區域變數 | 函數內定義的變數,其無法在定義區域外使用該變數名稱。 |
global 陳述 | 將區域變數宣告為全域變數的陳述,global為Python的關鍵字之一。 |
註解 | 程式中的說明文字,不限於程式語言的語法,以井字號 # 起始的文字都會被Python直譯器所忽略。 |
遞迴 | 這是對特定的正整數數列而言,藉由初始狀態的設定,如費伯那西數列中頭兩個數字皆為1,然後可由某種計算方式找到下一個數, 費伯那西數列中頭兩個數字之後的數字,皆為前兩個數字的合,如此這個數列為1, 1, 2, 3, 5, 8, 13, 21, 34……… |
提示字元 | 內建函數input()與raw_input()以字串作為參數,這會在輸入的游標前顯示出來,因故稱之為提示字元。 |
線性搜尋 | 搜尋演算法之一,其依序逐一比對資料項目,直到找到符合目標為止。 |
Unicode 編碼 | 採取16位元編碼方式,將世界上大多數的語言文字納入其編碼系統,支援包含絕大多數的中文常用字。 |
中英文術語對照
中文 | 英文 |
---|---|
介面 | interface |
函數 | function |
自訂資料型態 | user defined data type |
模組 | module |
關鍵字 | keyword |
內建型態 | built-in type |
內建函數 | built-in function |
參數 | parameter |
型態轉換 | type conversion |
費伯納西數列 | Fibonacci sequence |
return 陳述 | return statement |
函數呼叫 | function call |
區域變數 | local variable |
global 陳述 | global statement |
註解 | comment |
遞迴 | recursion |
提示字元 | prompt |
線性搜尋 | linear search |
複習問題
- 請把到目前為止學過的關鍵字歸類,例如and、or、not、in為邏輯運算子用來進行邏輯運算,while、for都用為迴圈,if…elif…else用為條件檢查等,並放入上一章由運算子整理出的表。觀察你整理出的表,你有什麼心得呢?
- 為什麼Python要有大量的built-ins?程式需要的功能都由自己寫出來不好嗎?說說你的看法,built-ins對於開發程式有什麼明顯的幫助呢?
- 為什麼變數只能限定由英文大小寫字母、底線與數字命名呢?而且數字還不能放在變數的開頭?試看看其它的符號如@、&、\、?等,如果出現在變數名稱中,直譯器會顯出什麼訊息呢?
- 我們說費伯納西數列是由遞迴定義出來的,數學上還有哪些數列也是由遞迴來定義的呢?利用遞迴的方法寫程式容易理解嗎?又有什麼好處呢?
- 為什麼變數要有區域變數與全域變數之分呢?這樣限制效力範圍有什麼好處?試看看下面的程式,呼叫count()函數,你會得到什麼訊息呢?
i=10
def count():
while i>0:
print i
i = i - 1 - 將某些程式碼開頭加上井字號稱為註解化,試看看註解化某些程式碼,這樣一來程式會如何進行運作呢?如
a=3
你會得到什麼樣的結果?最後變數a的值會與變數b相等嗎?
b=5
while a<b:
#print a
a=a+1 - 註解的文字除了說明某段程式碼如何運作外,還可以提供哪些資訊呢?想看看,程式應該要加入怎麼樣的註解,既不會顯得太繁瑣,也不會沒有註解到該做說明的的地方?
- 搜尋和排序是資訊領域中兩種基本的演算法,譬如我們常用Google或其他搜尋引擎找資料,許多網站同樣利用搜尋的方式讓使用者找該網站內的資料。搜尋方面除了線性搜尋外,還有什麼搜尋演算法呢?排序跟搜尋有什麼關係呢?如果資料已經做過排序,能否加快搜尋的速度呢?
- 利用Unicode編碼處理中文有什麼好處呢?除了我們見過的ASCII、Big5與Unicode編碼系統外,電腦世界還存在哪些編碼方式呢?上網搜尋有關電腦編碼的文章,說說你得到的心得如何呢?
練習
- 寫一個計算機的程式,至少可以進行加減乘除的四則運算。想一想,要用input()函數直接接受使用者輸入運算式,還是利用raw_input()函數將使用者的輸入都讀為字串呢?前者會有什麼問題?如果使用者輸入的是字母而非運算式,那會發生什麼事情?
- 將上一章倒數計時的迴圈寫進函數中,並以倒數的次數為參數。
- 利用if…elif…else…陳述寫一個執行不同選項的程式,例如使用者輸入的是字串“a”,就印出“您輸入了a…”,這樣的程式應該要怎麼寫呢?你能否把選項的選擇寫成一個單獨的函數,然後進入該選項所要進行的任務也寫在不同的函數中呢?
- 寫一個能夠判斷輸入的整數是否為奇數的函數,若使用者輸入的是奇數,就會印出“您輸入的是奇數…”的字串。
- 寫一個比較兩個整數大小的函數,請印出較大的數字,若是兩者相等,也請印出“兩數相等”。
- 請用遞迴的方法寫計算階乘的程式,階乘就是正整數的連續乘積,如2!=1*2,3!=1*2*3,4!=1*2*3*4,5! =1*2*3*4*5等。
主要參考資料
- Jeffrey Elkner等,How to think like a Computer Scientist: Learning with Python 2nd Edition Chapter 3、5、11,2008,Open Book Project
- Mark Lutz,Learning Python 3rd Edition,2008,Part 4,O’REILLY
- Magnus Lie Hetland,Beginning Python: From Novice to Professional,Chapter 6,Apress
- Wesley J. Chun,Core Python Programming Second Edition,Part 1,Prentice Hall