重點整理

  • 雖然寫程式可用循序的方法將每個步驟詳細載明,然而缺點是難以有效的重複利用程式碼。函數可使我們將程式切割成一個一個的小單元,藉由函數呼叫可以有效組織程式的執行方式。函數為小單元的方式,另外還有更大單元的組織方式,如自訂資料型態,可自行定義資料的儲存、運作模式,另如模組,亦即是Python組織程式檔案的方法,任一程式都是模組,也都可從其他模組引入變數、函數或自訂資料型態的定義。
  • Python語言提供了廣大的built-ins,即內建變數、內建函數與內建型態等。這些built-ins由於是寫程式經常會利用到的項目,所以語言提供的目的不外讓人可以直接利用,使得利用Python寫程式更為便利與容易。
  • 關鍵字為程式語言保留給語法剖析的字詞,也可稱為保留字,Python的特色與功能可由其看出端倪。
  • Python允許使用英文大小寫字母、底線即數字作為變數名稱,除了數字不可用為變數開頭外,英文大小寫字母與底線皆可。關鍵字不可用作變數名稱,然而雖然built-ins可作為變數名稱,但由於避免自行定義的名稱與內建的名稱互相衝突,所以還是盡量避免使用built-ins為變數名稱。
  • 定義函數時所用的關鍵字為def,形式如下def function_name(parameter_list):
    some statement
    return something
    在關鍵字def後緊接著是函數名稱,這裡用的是function_name,定義函數名稱的規範同變數的命名規則。函數名稱後用小括弧圍起來的是參數列,函數可以是沒有參數或是有一到多個參數,端視函數的需要而定義,小括弧後的冒號,代表其下方為一個程式區塊,須做縮排。
    函數定義內(也就是下方的程式區塊)可由多個陳述組成,函數最後可用return陳述回傳數值,也可以不回傳數值,這時拿掉return陳述即可。
  • 函數內建立的變數稱為區域變數,不可在函數定義外的範圍使用該名稱。
  • 替程式做註解的符號為井字號 #,在井字號後的均會被直譯器所忽略。
  • 遞迴為函數不斷重複呼叫本身的計算方式,如費伯納西數的計算方式def fi_recursion(n):
    if n==1 or n==2:
    return 1
    else:
    return fi_recursion(n-1)+fi_recursion(n-2)
    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。
  • Python有兩個內建讓使用者輸入資料的函數,分別是input()與raw_input(),前者接受的輸入為運算式,後者將所有輸入都轉換為字串。
  • 線性搜尋為一種簡單的搜尋方式,藉由逐步比對每一筆資料是否與所欲搜尋的項目是否相等,來找到該筆資料所在的位置。
  • 使用Unicode編碼可以有效的處理中文字串,因而處理中文前應先將字串轉換為Unicode編碼。除了使用內建函數unicode()轉換外,比較簡單的建立Unicode編碼字串的方式為利用u前綴字串。

術語解釋


術語解釋
介面所謂的介面是泛指兩種東西的交界處,而程式語言中的介面分為好幾種,其中一種是某段程式碼與另一段程式碼之間的交流,如函數呼叫中,呼叫者與函數定義常常是兩段放在不同地方的程式碼,其他比較常見的則有應用程式介面或是使用者介面等。
函數程式中的小單元,優點為可重複利用程式碼,也可依單元的排列來規劃程式的執行順序。函數有許多其他的稱法,如函式、常式、程序或副程式等。
自訂資料型態資料型態是比函數更大的程式單元,可個別設定符合該資料的屬性及方法,屬性為數值,而方法同函數。
模組模組是Python組織檔案的方式,凡儲存成副檔名.py的檔案均為Python的模組。某一模組內可從其他模組引入函數等的定義,藉以增加成是碼的重複利用。
built-insPython直譯器內建函數、型態等的總稱。
關鍵字也可稱為保留字,概括語言所有的功能及特色,同時為程式語言剖析程式語法的字組。
內建型態Python直譯器內建的型態,可於寫程式時直接使用,如整數、浮點數、字串、串列、序對及字典等。
內建函數Python直譯器內建的函數,可於寫程式時直接使用,如license()、 type()、help()、len()、range()、sum()、int()等。
參數函數定義中需要傳入函數計算的數值,因此呼叫函數也需提供適當的參數,不然會發生TypeError。
型態轉換Python的內建型態有相對應的型態轉換函數,使一種型態可以輕易的轉換到另一種,如>>>list(“hello”)
[“h”, “e”, “l”, “l”, “o”]
SyntaxError執行中因發生錯誤中斷而發生的訊息,此指句型錯誤。
周蟒其為針對華文地區,提供以中文寫程式便於程式語言教學的計畫。
費伯納西數列一組數字的總稱,前兩個數字皆為1,其後的數字都為前兩個數字的和,如下
n1=1, n2=1
nn=nn-2+nn-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

複習問題

  1. 請把到目前為止學過的關鍵字歸類,例如and、or、not、in為邏輯運算子用來進行邏輯運算,while、for都用為迴圈,if…elif…else用為條件檢查等,並放入上一章由運算子整理出的表。觀察你整理出的表,你有什麼心得呢?
  2. 為什麼Python要有大量的built-ins?程式需要的功能都由自己寫出來不好嗎?說說你的看法,built-ins對於開發程式有什麼明顯的幫助呢?
  3. 為什麼變數只能限定由英文大小寫字母、底線與數字命名呢?而且數字還不能放在變數的開頭?試看看其它的符號如@、&、\、?等,如果出現在變數名稱中,直譯器會顯出什麼訊息呢?
  4. 我們說費伯納西數列是由遞迴定義出來的,數學上還有哪些數列也是由遞迴來定義的呢?利用遞迴的方法寫程式容易理解嗎?又有什麼好處呢?
  5. 為什麼變數要有區域變數與全域變數之分呢?這樣限制效力範圍有什麼好處?試看看下面的程式,呼叫count()函數,你會得到什麼訊息呢?i=10
    def count():
    while i>0:
    print i
    i = i - 1

  6. 將某些程式碼開頭加上井字號稱為註解化,試看看註解化某些程式碼,這樣一來程式會如何進行運作呢?如a=3
    b=5
    while a<b:
    #print a
    a=a+1
    你會得到什麼樣的結果?最後變數a的值會與變數b相等嗎?
  7. 註解的文字除了說明某段程式碼如何運作外,還可以提供哪些資訊呢?想看看,程式應該要加入怎麼樣的註解,既不會顯得太繁瑣,也不會沒有註解到該做說明的的地方?
  8. 搜尋和排序是資訊領域中兩種基本的演算法,譬如我們常用Google或其他搜尋引擎找資料,許多網站同樣利用搜尋的方式讓使用者找該網站內的資料。搜尋方面除了線性搜尋外,還有什麼搜尋演算法呢?排序跟搜尋有什麼關係呢?如果資料已經做過排序,能否加快搜尋的速度呢?
  9. 利用Unicode編碼處理中文有什麼好處呢?除了我們見過的ASCII、Big5與Unicode編碼系統外,電腦世界還存在哪些編碼方式呢?上網搜尋有關電腦編碼的文章,說說你得到的心得如何呢?

練習

  1. 寫一個計算機的程式,至少可以進行加減乘除的四則運算。想一想,要用input()函數直接接受使用者輸入運算式,還是利用raw_input()函數將使用者的輸入都讀為字串呢?前者會有什麼問題?如果使用者輸入的是字母而非運算式,那會發生什麼事情?
  2. 將上一章倒數計時的迴圈寫進函數中,並以倒數的次數為參數。
  3. 利用if…elif…else…陳述寫一個執行不同選項的程式,例如使用者輸入的是字串“a”,就印出“您輸入了a…”,這樣的程式應該要怎麼寫呢?你能否把選項的選擇寫成一個單獨的函數,然後進入該選項所要進行的任務也寫在不同的函數中呢?
  4. 寫一個能夠判斷輸入的整數是否為奇數的函數,若使用者輸入的是奇數,就會印出“您輸入的是奇數…”的字串。
  5. 寫一個比較兩個整數大小的函數,請印出較大的數字,若是兩者相等,也請印出“兩數相等”。
  6. 請用遞迴的方法寫計算階乘的程式,階乘就是正整數的連續乘積,如2!=1*2,3!=1*2*3,4!=1*2*3*4,5! =1*2*3*4*5等。

主要參考資料

  1. Jeffrey Elkner等,How to think like a Computer Scientist: Learning with Python 2nd Edition Chapter 3、5、11,2008,Open Book Project
  2. Mark Lutz,Learning Python 3rd Edition,2008,Part 4,O’REILLY
  3. Magnus Lie Hetland,Beginning Python: From Novice to Professional,Chapter 6,Apress
  4. Wesley J. Chun,Core Python Programming Second Edition,Part 1,Prentice Hall


※ 本文同時登載於 OSSF 網站的下載中心 - PDF ※ 回 - 目錄