Python 快速入門(三)

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- Python 快速入門(三) (http://www.webasp.net/article/8/7720.htm)
-- 作者:未知
-- 發佈日期: 2003-09-13
原作者:xina

程式流程、函數與模組


Fllow control



1 if a <= b:
2 if c == d:
3 foo()
4 aoo()
5 else:
6 boo()



上面一個 if 的使用範例,在行 1,如果 a 小於等於 b 行 2~4 會被執行,否則行 6 會被執行。 python 並沒有像 Pascal 使用 begin ... end 定義 block,也沒有像 C 使用 { ... } 定義 block, python 直接使用縮排決定statement 是否屬於同一個 block。如 行1-4 因為縮排而成為一個 block, 而行 2-3 也因為縮排而成為一個 block,每一個 block 則成為一個 compound statement。if statement 的語法規式為 :


if : .....
elif : ......
elif : ....
else: .......



如其它語言,elif 和 else 為選擇性功能,elif => else if


1 while a >= b:
2 foo()
3 boo()
4 if c != d: break
5 if c >= d: continue
6 coo()
7 else:
8 doo()
9 eoo()



上面是 while loop 的使用範例,當 a >= b 時,行 2-6會不斷的一再執行,直到 a >= b 不成立時(false), 則執行行 8,然後繼續往下執行 eoo()。但,如果執行行 4 的 break,則會無條件直接跳離 while loop, 不再執行 while loop 的任何內容(包含 else 的部分),直接執行行 9。若 while loop 中,continue 被執行, 則程式會直接跳過後面的指令回到行 1,進行條件判斷。


1 for i in 1, 7, 3, 9:
2 print i,

結果顯示 : 1 7 3 9



上面為 for loop 的使用法,for in : ....in 後面可為任何 sequence type object。


1 for i in range(3):
2 print i,
3 print range(3)

結果顯示 : 0 1 2 [0, 1, 2]



range(x) 會產生一個包含 0 ~ x-1 的 list。

Function



1 def foo(a, b):
2 return a+b
3 print foo(3, 4)

結果顯示 : 7



上面為 function 的定義方式,def (, ....): ....return 可回傳 function 的執行結果。 當行 3 執行 foo(3, 4),function foo 會被執行,然後傳回 3+4 (a+b) 的結果。


1 def foo(a, b=2):
2 return a+b
3 print foo(3), foo(3,4)

結果顯示 : 5 7



function 的參數可以定義預設值,設立預設值的參數如果呼叫時不給予,那麼會使用預設值。


1 def foo(a = []):
2 a.append(7)
3 return a
4 print foo(),
5 print foo()

結果顯示 : [7] [7, 7]



預設值只會在 function 定義指令第一次被執行時進行計算,因此上例的 a 參數在第一次執行定義指令時, 就將預設值 bind 到一個 list object,之後使用預設值時就會 bind 到同一個 object,因而產生記憶的現象, 使第二次執行 foo() 所得到的結果受第一次執行的影向。

Module
Python 的 source file 為 *.py 這樣的形式,如: foo.py boo.py。Python 定義每一個 source file 為一個 Module。

下面兩個 module :


--- a.py ----
def foo():
return action+1
action = 9
--- a.py end ---
--- b.py ---
import a
print a.foo(), a.action
--- b.py ---



執行 'python b.py',結果顯示 :


10 9



當需要使用到其它 module 時,可以使用 import 指今,將該 module import 到你的 name space 裡。 上例 b modlue 就 import a 這個 modlue,當 b 執行 import 指令時,在 b 的 name space 裡, a 這個 name 就會 bind 到一個 module object。module 一但 load 進 memory 時, 就以 module object 代表,以供進一部的使用。所有 module 裡定義的 name(function,object 或後面會介紹的 class)都會成為 module object 的 attribute。透過使用 module object attribute, 我們可以 access module 內所定義之 name。module attribute 的使用方式如上例, module 的 name 接著 '.' 接著 attribute 的 name。每個 module 都有自己的 name space, 透過 module attribute,我們可以 access 到其它 module 的 name space。

當 module 頭一次被 load 進 memory 時,module 會被從頭到尾執行一次。 其執行的結果則定義了 module 的 name space,使 name 和 object bind 在一起。 如上例執行 a.py 中的 def foo(): .... 這個指令時,定義一個 function object, 並使之和 foo 這個 name 進行 binding。


--- a.py ----
def foo():
return action+1
action = 9
--- a.py end ---
--- b.py ---
from a import *
print foo(), action
--- b.py ---



上例和前一個例子是相同的,但使用 from import *,這個指令的作用是, 把 module name space 裡所有的 name,import 到目前的 name space 裡。'*' 是指所有的 name, 如果只是要 import 特定的 name,那麼你可以指定 name 替代 '*',如 from a import foo。

webasp.net