94 學年度第二學期資訊專題研究社課程
指導老師:戴伶娟 說明: 本階段的課程,設定同學能夠學習到程式設計 入門概念,參與軟體文件創作,軟體測試回報,訊息 中文化等流程。講義教材由胡崇偉帶領陳晏瑨、陳炯 廷、紀博文完成。安排的內容包括「開放源碼軟體基 本概念」 「程式語言基本概念」 「視窗軟體介紹」 、 、 、 「開放源碼開發參與」「開發成果交流及心得分享」 、 。 第一天的講義內容可至
http://wiki.sign9.twbbs.org/doku.php?id=python:tutorial:0.10:1_overview
網址閱讀線上版本。
1
Overview: Python 的簡單介紹 什麼是 Python
Python 是在 90 年代, 由 Guido van Rossum 在荷蘭所創造的, 它是一個直譯式 (interpreted)、互動式(interactive)、物件導向(object-oriented)的語言。你可能會想, 為 什麼要叫做 Python? 難道是 Rossum 在雨林時遇到大蟒蛇而突然想到的語言嗎? 其實並不是這樣的。雖然每一個語言的產生, 背後都有一個故事, 例如說那個和 咖啡相關的, 但是 Python 的故事並非和蟒蛇有關。在 70 年代有一個很有名的英 國電視喜劇叫做 Monty Python’s Flying Circus, 簡稱 Monty Python 或 The Pythons, 它紅遍各地, 對於喜劇的影響力猶如披頭四在音樂上的影響一般。由於 Rossum 是這個節目的忠實觀眾, 因此將名稱訂為 Python。好玩的部份是, 這個電視喜劇 和蟒蛇也完全沒有關係, 它會叫做 Python 純粹只是因為它的發音聽起來很好 玩。 Python 是一個直譯式的語言, 因此它不需要在寫完程式之後, 再多加一個編譯的 動作, 只要直接執行就可以了。而它互動式的特性在於, 它有一個互動介面 (interpreter), 有點類似 UNIX-like 作業系統的 shell, 或者是 Windows 底下的命 令提示字元(command line)。因此使用者可以透過這個互動介面執行程式, 對於測 詴預言特性有很大的幫助, 你甚至可以拿來當作計算機來使用 (前幾個禮拜我的 。 通識課程的作業就是用 Python 的互動介面算出來的) 在這一個單元會做一個概觀的介紹, 對於已經有程式語言經驗的人, 可以很快就 抓住 Python 的一些語法與特性; 對於沒有程式經驗的人來說, 看不懂沒有關係, 只要大略抓住概況, 詳細的東西會在未來的幾個單元提到。
使用 Python: 互動介面 vs. 直接執行
執行 Python 程式的方式有兩種, 一種是使用互動介面, 另外一種是直接執行, 由於 Windows 和 UNIX-like 作業系統有些微的差距, 可以參考下表: 作業系 種類 統
執行方法
寫程式的方法 直接將程式的句法 鍵入提示字元後面 (> > >)
互動 開始 → 程式集 → Python2.4 → IDLE Windows 介面 (Python GUI), 將互動介面程式開啟
2
執行 直接執行副檔名為 py 的檔案 檔案
用記事本之類的文 字編輯器一行一行 輸入
直接將程式的句法 互動 在 shell 底下執行 python 這支程式, 開啟互 鍵入提示字元後面 介面 動式介面 (> > >) UN*X 在 shell 底下執行 python [filename] 執行 或是寫成 script 檔, 在第一行寫下 檔案 #!/path/to/python 然後將檔案變為可執行檔, 直接執行 用 vi 之類的文字編 輯器一行一行輸入
本文件的編排方式
上述兩種使用 Python 的方式都是可以的, 讀者可以依照自己的喜好使用。通常 來說, 簡單的程式如一兩行的數學運算或是語法測詴, 會用互動介面來執行, 而 比較有結構的程式, 例如有用到流程控制或函式的程式就會用直接執行的方 式。為了避免讀者的混淆, 本文件會有兩種程式碼的編排方式, 一種是互動介面 的編排方式, 如下: >>> print "This is the interactive mode" This is the interactive mode 另外一種則是檔案的編排方式, 如下: 1 def execmode(): 2 print "This is the execution mode" 3 4 execmode() 上面的 1 2 3 4 是行號, 不用打上去, 只要將行號之外的內容貼到檔案上, 並且 存成 filename.py, 按照上面的方式執行, 畫面將會如下所示: This is the execution mode
3
哈囉, 世界
學程式語言的老梗, 就是在第一個程式介紹如何寫 Hello, World。既然如此, 就讓 它繼續下去吧, 下面的程式就可以將 Hello, World 印在螢幕上 >>> print "Hello, world!" Hello, world! 在這個範例當中, 是使用上述的互動介面, 你需要把 > > > 後面的字打進去, 就 會秀出下面的那一行。 print 後面的雙引號代表字串, 請記得要加上, 否則你就會得到一個 SyntaxError (語法錯誤)。 接著我們就來很快的掃過一下這個語言的特色, 它的型態, 流程控制... 等
Good afternoon, good evening, and good night
在電影「楚門的世界」裡頭有一個很經典的台詞 3): Jim Carrey, "Good morning!" Lady, "Good morning." Jim Carrey, "Oh, and in case I don't see ya, good afternoon, good evening, and good night." 不過我想現在的人一天到晚都掛在電腦網路上, 因此並不會讓電腦有 the case that I don’t see you 的狀況。電腦通常都會依據現在的時間來做判斷, 並且向你問 好。下面這是一個簡單的範例, 由電腦的時間來判斷早晚, 然後秀出一句問好的 句子, 從這個範例可以很簡略的看出一些 Python 的語法與特性。 1 2 3 4 5 6 import datetime hr = datetime.datetime.today().hour if hr >= 3 and hr <= 11: greet = "morning" elif hr >= 12 and hr <= 16: greet = "afternoon"
7 elif hr >= 17 and hr <= 19: 8 greet = "evening" 9 elif (hr >= 19 and hr <= 23) or (hr >= 0 and hr <= 2):
4
10 greet = "night" 11 12 print "Good %s." % greet 行 數 1
解說 將 datetime 這個模組(module)給載入, 以供後面的程式呼叫使用 每一行代表 。 一個 statement, 它並不像 C 語言由分號(;)結尾。 hr 是一個變數, 將 datetime.datetime.today().hour 指派給它。其中第一個 datetime 是模組的名稱, 第二個 datetime 是類別(class)的名稱。 這一行的意思是使用 datetime 模組的 datetime 類別, 這個類別裡頭 today() 的這個函式, 而抓取這個函式傳回變數當中的 hour 這個變數, 放到 hr 裡 頭。 這是 Python 中流程的語法, 將判斷式夾在 if 與冒號(:)中間。其中大部分的 運算子與 C 相同, 但是邏輯運算則是用 and, or, not 這三個英文字。 這一行算是在 if 底下的區間 (block), 在 Python 之中, 這種區間不像 C 使 用大括弧 { } 包住, 而是用 [TAB]或是一定量的空白做為區間, 因此這個 [TAB] 或空白是必要的! 這是 Python 之中印到螢幕的方式, 和 C 有點類似, 但是中間用 % 來區隔 前面秀出來的字串, 以及要取代的變數
2
3
4
12
以筆者現在編輯的時間 18:10 來說, 執行上述程式的結果為: Good evening.
5
Data Types: 基本的資料型態
Python 這個語言提供了許多不同的資料型態(Data Types),在這一個單元會介紹幾 個常用的型態:數字(Numbers)、字串(String)以及名單(Lists)。其中數字又分為很 多種,其中有 大家熟悉的整數(Integer)與浮點數(Float)等。
數字型態
Numbers, 顧名思義就是數字了, 這個是在我們小學的時候就常常接觸的東西。當 你看到一堆數字的時候你會想到什麼呢? 錢? 數學? 電腦? 統計? 討厭的東西?? 眼花撩亂的符號? 其實這堆東西和下面要提到的東西沒有太大的關連, 但還是 有那麼一點點關係。是的, 由於 Python 它有互動介面的關係, 你可以直接拿 Python 當做一個多功能的電子計算機。我想加(+)減(-)乘(*)除(/)大家都應該會, 然 後再運用括弧()來結合先後次序, 它儼然就成為一個可以做四則運算的計算機 了。自己來詴詴看吧: >>> 2+2 4 >>> (1+3+5)*4 36 若是有一些計算的結果或是數字你會常常用到, 不妨把這樣的數字變為一個變 數, 就可以方便我們來使用 >>> height = 1.75 >>> weight = 70 >>> weight / (height * height) 22.857142857142858 上面這個例子就是將 height 定義為 1.75 (單位是公尺), weight 定義為 70 (當然 是公斤啦), 這樣在第三個指令就可以利用 height 和 weight 來做計算, 看起來 比一堆數字還有好看很多。大家一定想到這個式子是什麼了吧? 它就是你的體質 指數 - BMI, 如果你算出來介於 18.5-22.9 之間, 則代表你的體重很標準喔 1) :)
更多數學的運算
有時候你會發現上面的計算只能算出一些比較簡單的東西, 現在就來介紹一個 好用的模組: math。透過這個模組, 我們可以來做很多的數學運算, 例如一個數字
的三角函數, 它的指數運算, 或者是你想要無條件進位、捨去。 使用這個模組的 方式很簡單, 只要打下這一行 >>> import math 然後在接下來的部份打上 math.function() 就可以呼叫了, 舉一個例子: 1GB 的空 間其實是 230 個 Bytes, 如果我們想要看 230, 就在互動介面打下 >>> math.power(2, 30) 1073741824.0 這就代表著 230 = 1073741824.0。下面列著一張表格, 舉出幾個 math 模組中簡單 的函式, 可以詴詴看: 函式名稱 pow(x, y) sqrt(x) ceil(x) floor(x) fabs(x) 意義 傳回 xy 範例 math.power(2, 30) 結果 1073741824.0 9.0 2.0 1.0 5.0 10.0
傳回 x 的平方根 math.sqrt(81) 將 x 無條件進位 math.ceil(1.57) 將 x 無條件捨去 math.floor(1.57) 傳回 x 的絕對值 math.fabs(-5) math.log(1024, 2)
log(x[, base]) 傳回 logbasex pi
代表圓周率的值 math.pi * math.pow(10, 2) 314.15926535897933
字串
字串和數字可以說是截然不同的東西, 我們通常會用數字來做數學的運算, 然而 字串的話則通常是用在顯示資訊在螢幕上, 或是來抓取使用者輸入資料。 字串的使用方式就是用引號包住一堆字母, 不論是單引號或者是雙引號都可以 >>> 'This is a string' 'This is a string' >>> "Another string" 'Another string' >>> "It's a beautiful day, isn't it?"
7
"It's a beautiful day, isn't it?" >>> 'I\'d like to have a cup of coffee.' "I'd like to have a cup of coffee." 上面的組合都算是字串, 任何一種都可以, 我想其中的規則想必大家看了一下就 可以了解了吧 :) 接著我們可以像數字一樣, 將字串存在一個變數裡頭, 還記得楚門的世界的範例 吧? 現在來一個簡單的版本: >>> greeting = "Good morning!" >>> print greeting Good morning! 很簡單吧?!~ 如果你想要在字串裡頭換行, 只要像大部分的語言一樣, 加上 \n 就可以了 >>> str = "Why is smile the longest word?\nBecause there is a mile between the first and the last letters." >>> print str Why is smile the longest word? Because there is a mile between the first and the last letters.
字串的運算
數字的運算看起來是很普通的事情, 不過字串也是可以做運算的! 做哪些運算呢? 看看下面的例子吧: >>> word = "http://" + "www.openfoundry.org" + "/" >>> print word http://www.openfoundry.org/ 我們可以用 + 把幾個字串合併成一個字串, 那是不是可以用 * 的符號把一個 字串變成好多個呢? 詴詴看下面的例子: >>> print "Orz... " * 5 Orz... Orz... Orz... Orz... Orz... 除了上面的這種運算之外, 甚至可以用下面的方法把字串分開, 還記得剛剛 word 的例子吧? 下面這個例子是沿用剛剛的 word:
8
>>> print h >>> print http >>> print // >>> print http:// >>> print
word[0] word[0:4] word[5:7] word[:7] word[7:]
www.openfoundry.org/ 這個用法在下面的名單(Lists)還會看到, 不過這邊先做一下介紹。在 word 後面 中括弧的數字, 代表字串 word 的 index, 也就是第幾個字元, 而這個數字是從 0 開始算起的。你也許已經注意到, 若是 word[a:b], 則 a 會被包含在裡頭, b 則 不包含在裡頭。 如果 a 或者是 b 是一個負的數字的話, 那會發生什麼樣的狀況呢? 這個就由你 自己來詴詴看囉.
名單
名單這一個形態, 很像其他語言中的陣列(Arrays), 也挺像數學當中的集合(Sets), 使用名單這樣的型態, 可以將一堆資料放在同一個地方。譬如說你打算要舉辦一 個 party, 你將所有想要邀請的人都放在一個名單裡頭: >>> names = ['Keroro', 'Tamama', 'Giroro', 'Kururu'] >>> print names ['Keroro', 'Tamama', 'Giroro', 'Kururu'] 此時你就可以做一些運算了, 譬如你想要找出擺在你名單裡頭的一些人: >>> print names[0] Keroro >>> print names[:2] ['Keroro', 'Tamama'] >>> print names[2:4] ['Giroro', 'Kururu']
9
或是你想要更動一下名單的人, 你想要取代, 增加, 或者是刪除一些人, 可以用 下面的方式: >>> names[0:2] = ['Sumomo', '556'] >>> print names ['Sumomo', '556', 'Giroro', 'Kururu'] >>> names[0:2] = [] >>> print names ['Giroro', 'Kururu'] >>> names[0:0] = ['Keroro', 'Tamama'] >>> print names ['Keroro', 'Tamama', 'Giroro', 'Kururu'] >>> names.append('Dororo') >>> print names ['Keroro', 'Tamama', 'Giroro', 'Kururu', 'Dororo'] 上面操作的第一個, 是將前面兩個名單替換成 Sumomo 和 556 第二個是將前面兩個名單的成員刪除 第三個在最前面的位置把 Keroro 和 Tamama 插入至名單 最後一個則是把永遠都被遺忘的 Dororo 放置到最後一個位置 還有一個很常用的東西, 就是計算這個名單有多少人, 只要打下 >>> len(names) 5 它就會顯示 names 這個名單有多少個成員。這一個例子舉的就是一個名單, 但 是名單的用法並不限制人名, 字串或者是數字都可以放到名單裡頭, 甚至名單自 己本身也可以當作另一個名單的一個成員, 這些東西就請你自己詴詴看囉。 這些都只是一些很簡單的介紹, Python 的型態還有很多種, 如果你想要更徹底了 解的話, 就要靠你自己做功課了。
10
Operation: 運算方式
在上一個單元已經提過簡單的運算方式, 因此相信「運算」對你來說並不是很陌 生。在這個單元當中, 我們會介紹更多與更詳細的運算方式。
布林與比較運算
布林運算與比較大部分都是用在條件句裡頭(if), 用以判斷各種不同的狀況, 例 如在 「楚門的世界」 例子裡, 現在的時間大於 3:00, 或是小於 11:00, 則將 morning 存入 greet 裡頭。下面列著一張表, 說明各種不同的運算元以及他的意義。 運算 x or y x 或是 y, 其中一個為真則為真 意義
x and y x 以及 y, 其中一個為假則為假 not x xy 將 x 的真假反過來 x 小於 y x 小於等於 y (由於本 wiki 軟體會自動將它變為另外一個字, 請將 < 和 = 中間的空白拿掉) x 大於 y
x >= y x 大於等於 y x == y x 等於 y (x 和 y 的值相等) x != y x is y x 不等於 y x 和 y 是同一個物件
x is not x 和 y 是不同的物件 y
上表中前面三個為布林運算, 剩下的都是比較運算, 看表的方式稍稍不同。舉 x < y 的例子來說, 就是若是 x 真的小於 y 的話, 則這個式子為真。這個地方算 是比較死板的定義, 待你看到後面關於流程控制之後(或是回頭看「楚門的世界」 的範例), 你就會了解這個部份其實是很容易懂的。
數學運算
11
這個部份前面在講計算機的時候, 已經提到過了, 現在來看看較仔細的表格說 明。 運算 意義
x + y x 加上 y x - y x 減去 y x * y x 乘上 y x/y x 除以 y
x % y x 除以 y 的餘數 -x +x 負的 x 正的 x
x ** y x 的 y 次方
其他運算
除了布林運算、比較運算以及數學運算, 我們還會常常用到一些其他的運算, 例 如名單的部份, 常常會要確定某個成員是否在名單裡頭、取出某一個名單的成員 或是取出名單的某一個部份等等。下面的表格說明一些這種類型的運算 運算 x in s x 是否在 s 裡頭 1) 意義
x not in s x 是否不在 s 裡頭 s+t 將名單 s 和名單 t 的成員全部結合起來變成一個新的名單
s * n, n * s 將名單 s 的成員重複 n 次變成一個新的名單 s[i] s[i:j] len(s) min(s) max(s) 名單 s 的第 i 個成員 (i 是從 0 開始數起) 將名單 s 的第 i 個成員到第 j 個成員取出, 成為另一個新的名單 名單 s 的長度 名單 s 裡頭最小的成員 名單 s 裡頭最大的成員
我們現再已經有一些最最基本的功夫了, 到下一個單元就可以寫一個比較像樣 的程式了!
12
Control Flow: 流程控制
在這裡, 我們會介紹流程的控制, 簡單的來說就是 if/else、while 以及 for 迴圈的 用法, 這些都是程式當中很基本的元素, 用來控制整個程式流動。透過 if/else 來 判斷是否執行否個動作, 而 while 以及 for 來重複一些具有相同特性的動作。
由你來輸入
在介紹流程之前, 要先介紹一個東西, 就是讓使用者可以輸入東西給程式的方 法。之前我們的程式大部分都是寫得死死的, 顯示的字串都是固定的, 若是我們 可以給程式一些東西, 那就更有趣了。 >>> number = input("Enter a number: ") Enter a number: 此時你就可以在冒號後面隨便輸入一個數字, 它就會存到 number 這個變數裡頭, 假設我輸入 2, 接著我們可以把 number print 出來看看: >>> print number 2 很簡單吧! 不過若是我們要輸入的是字串的話, 我們則要把 input 改成 raw_input, 否則會出錯。 >>> name = raw_input("Please enter your name: ") Please enter your name: Anderson >>> print "Mr. " + name + "! Surprised to see me?" Mr. Anderson! Surprised to see me? 用 raw_input 將輸入的東西儲存成字串到 name 裡頭, 並且依照前面所提到的字 串運算, 將這些東西一起運用。
13
方便好用的 range
除了 input、raw_input 之外, 還有一個是在流程控制中很常見的, 就是 range(x)。 用這個函式可以產生出一個名單(list), 成員分別為 0, 1, 2, 3, ..., x-1。 輸入下列指 令可以很簡單的看出來他的功用: >>> ran = range(10) >>> print ran [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 這個在之後的 for 迴圈會大量的使用到.
如果...
if 是一個非常常見的用法, 主要用來判斷在某種條件下, 要執行哪一些東西, 我 們由下面的例子來說明 >>> if name == "Anderson": ... print "follow the white rabbit" ... elif name == "Morpheus": ... print "The great Morpheus. We meet at last." ... else: ... print "Welcome to the desert of the real." 從上面可以看出, 在 if 以及 elif 的後面, 都是緊接著一個判斷句, 如果判斷為 真, 則執行下面縮排的區段, 若是判斷不成立, 則跳到下一個。如果沒有一個符 合, 就執行 else 裡頭的式子, 若是連 else 都沒有的話, 則代表什麼都不動。 在 Python 之中, 由於沒有分號、括弧來做為區隔, 因此區段裡頭的縮排是必要 的! 上面是一個簡單的判斷式, 如果看不懂內容是什麼, 可以重新回味一下 「駭 客任務」這部電影 :)
for 迴圈
有時候我們想要處理一些重複的事情, 例如我想要算出 1 + 2 + 3 + ... + 1000 這 個式子的答案, 當然你可以告訴我有一個很簡單的式子馬上就可以算出答案, 不 過就先假裝不知道有這個式子的存在 :P 如果要算這樣子的東西, 該要怎麼辦呢? 直接看下面的範例它是如何做到的:
14
>>> result = 0 >>> for x in range(1001): ... result = result + x ... >>> print result 500500 行 數 1 意義 result = 0 主要的目的是初始化 result 這個變數, 讓 Python 知道 result 會是 一個整數, 並且一開始為 0 range(1001) 代表產生一個 list, 成員從 0, 1, 2, 一直到 1000, 而我們用 for 迴圈, 讓 x 分別代表這個 list 裡頭的每一個成員, 從 0, 1, 2, 開始一直跑道 1000 每跑一次 x, 我們就將 x 和 result 的值相加, 並且又再加到 result 這個變 數, 換句話說就是每跑一次 x, 就把 x 加到 result 這個變數 把結果秀出來
2
3 5
看完這個結果, 和自己所知道的公式驗證一番, 是不是一樣呢?
15
習題一 詴著在編輯器裡,輸入下列的程式碼,然後執行,並觀察其結果。你能猜出這段 程式在做什麼嗎? for i in range(65, 91): print chr(i), if (i-64) % 13 == 0: print
習題二 撰寫程式能夠計算及顯示出九九乘法表,類似下列的結果。 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 6 6 12 18 24 30 36 42 48 54 7 7 14 21 28 35 42 49 56 63 8 8 16 24 32 40 48 56 64 72 9 9 18 27 36 45 54 63 72 81
1 2 3 4 5 6 7 8 9
16
參考資料 http://www.chinesepython.org/pythonfoundry/marrpydoc/python1.htm http://www.chinesepython.org/pythonfoundry/marrpydoc/python2.htm http://www.chinesepython.org/pythonfoundry/marrpydoc/python3.htm http://www.chinesepython.org/pythonfoundry/marrpydoc/python4.htm http://www.chinesepython.org/pythonfoundry/marrpydoc/python5.htm http://www.chinesepython.org/pythonfoundry/marrpydoc/python6.htm http://larc.ee.nthu.edu.tw/~jcyeh/python/cdoc/tut/tut.html http://awaretek.com/tutorials.html
17