Python學習手冊之函式和模組
函式和模組
程式碼重用
程式碼重用是程式語言裡一個非常重要的概念,增加程式碼的大小會使維護變得更加困難。
在軟體工程裡,必須遵守不要編寫同一程式碼的原則,英文"Don't Repeat Yourself" ,簡稱:DRY 原則。
我們已經學習過一種方法通過使用迴圈來保證程式碼重用。在本節中我們將進一步探索兩個模組:函式和
模組。
重複的程式碼被認為是遵循 WET 原則,即表示英語 Write Everything Twice 的縮寫,或者 We Enjoy Typing 的簡寫。
函式
到目前我們已經使用了不少的系統內建函式,函式呼叫就是左邊是需要呼叫的函式名稱,後面跟著圓括
號。
print("I like Python!") range(0,10) range(10,20,4) str(12)
括號前面的單詞是函式名,括號內以逗號分隔的值是函式引數。
函式可以通過關鍵字def 來定義。關鍵字後跟一個函式的識別符號,接下來是一對圓括號,圓括號裡可以
包括一些變數的名稱,再以冒號結尾結束這一行後面縮排的語句塊就是函式的一部分。
下面程式碼聲明瞭一個 叫func 的函式。當呼叫這個函式時列印 “Hello” 三次。
def func(): print("Hello") print("Hello") print("Hello") func()
執行結果:
>>> Hello Hello Hello >>>
所有函式的程式碼塊都是通過縮排來定義的,函式名後面要跟隨冒號。
函式呼叫必須在函式宣告之後。如果呼叫在宣告前,程式會發生異常。
func() def func(): print("Hello")
執行結果:
>>> NameError: name 'func' is not defined >>>
函式引數
引數
函式名後面的括號是空的,意思是這個函式不需要引數。實際上,大多數函式都是有引數的。
def func(name): print(name + "!") func("xmg") func("dustman") func("python")
執行結果:
>>> xmg! dustman! python! >>>
引數定義在圓括號裡面。
同樣,我們可以定義一個包含多個引數的函式,引數用逗號分隔開。
def func(x,y): print(x + y) print(x * y) func(2,7)
執行結果:
>>> 9 14 >>>
函式引數可以用作函式塊定義中的變數,僅在函式體內部存在,不能在函式定義之外引用它們,同樣這
也適用於在函式中建立的其他變數。
def func(x): x += 1 print(x) func(5) print(x)
執行結果;
>>> 6 NameError: name 'x' is not defined >>>
從技術上講,引數是函式定義中的變數,引數的值在呼叫時被函式複製了。
函式返回值
我們見到一些內建函式比如float 都返回一個值。要返回一個值,在函式體內部可以用return 隨時返
回函數結果。
def min(x,y): if x <= y: return x else: return y print(min(5,1)) z = min(5,8) print(z)
執行結果:
>>> 1 5 >>>
return 語句不能在函式外面使用,函式執行完畢沒有 return 語句時,函式自動產生 return None。
定義一個函式,比較它的兩個字串引數的長度,返回長度長的那個引數。
def longer_string(x,y): if len(x) >= len(y): return x else: return y ret = longer_string('abcde','123456789') print(ret)
執行結果:
>>> 123456789 >>>
當從函式返回一個值,程式立即停止執行並返回,return 下面的程式碼不會執行。
def add(x,y): sum = x + y return sum print("I won't be printed!") print(add(1,4))
執行結果:
>>> 5 >>>
備註和文件註釋
備註
註釋是程式碼的註解,用於是程式碼更容易理解,它們不影響程式碼的執行方式。
在 Python 中,註釋是通過插入雜湊符號# 來實現的。該行在# 之後的所有文字都被程式忽略。
x = 123 y = 456 # This is an annotation print(x + y) # addition # print(x * y) # another comment
執行結果:
>>> 579 >>>
Python 沒有多行註釋,其他程式語言有多行註釋功能,使用 /* */ 語法。
文件註釋
文件註釋有點和註釋相同,因為它們是用來解釋程式碼的。
但是文件註釋說明更具體些,並且有不同於註釋的語法。它們是通過在函式或類的第一行下面放置一個
包含多行字串方式來建立的。
def main(word): """ this function is print a string """ print(word + "!") main("Hello world")
執行結果:
>>> Hello world! >>>
文件註釋是字串的另一種表現,執行時會被保留在程式或類裡並能被用 __doc__ 變數讀到。 文件註釋一般給類和函式做註釋,而單行註釋一般用來說明某一行的功能。
函式即物件
函式
雖然它們建立與普通變數不同,但函式就像任何其他型別的值一樣。可以將它們重新分配給變數,然後對引用呼叫。
def add(a,b): return a + b x = 9 y = 9 obj = add print(obj(x,y))
執行結果:
>>> 18 >>>
上面的例子將加法函式重新指派了一個變數名,現在我們可以用變數名來呼叫函式。
函式還可以被當做引數來呼叫
def multiply(a,b): return a * b def more_again(func,a,b): return func(func(a,b),func(x,y)) x = 9 y = 9 print(more_again(multiply,x,y))
執行結果:
>>> 6561 >>>
如上面例子所示,函式 multiply 函式被 more_again 當做引數並在函式體裡面呼叫。
讓函式 "square" 被函式 "my_func" 當作引數呼叫。
def square(a): return a * a def my_func(func,x): print(func(x)) my_func(square,67)
執行結果:
>>> 4489 >>>
模組
模組(Modules)是為完成常見任務而編寫的程式碼,例如生成隨機數、執行數字操作等。
模組最大的好處是大大提高了程式碼的可維護性。其次,編寫程式碼不必從零開始。當一個模組編寫完畢,就可以被其他地方引用。使用模組還可以避免函式名和變數名衝突。
使用模組的基本方式是在程式碼的頂部新增import module_name 程式碼,然後使用模組 module_name.var 訪問模組中的變數名稱的函式和值。
下面程式碼示例如何使用random 模組生成亂數。
import random for i in range(6): num = random.randint(1,7) print(num)
執行結果;
>>> 5 3 5 2 7 4 >>>
上面程式碼使用 random 模組中定義的 randint 函式在 1 到 7 的範圍內列印 6 個隨機數。
如果您只需要模組中的某些函式,可以使用另一種匯入模組的方法。
採用from module_name import var 的方式匯入函式 var 後你就可以使用var ,就好像它是在程式碼中 定義的一樣。
下面程式碼示例程式僅需要math 模組的pi 常量。
from math import pi print(pi)
執行結果:
>>> 3.141592653589793 >>>
使用逗號分隔列表可以匯入多個函式。
from math import pi,cos
* 表示從模組裡匯入所有的函式,比如:from math import * 通常不鼓勵這麼做,因為它混淆了程式碼中的變數和外部模組中的變數。
匯入不存在的模組名會導致importError 錯誤。
import my_module
執行結果:
>>> ModuleNotFoundError: No module named 'my_module' >>>
可以使用as 關鍵字以不同的命名來匯入模組或物件,這可以用在模組或物件有一個長的或令人困惑的 名稱時。
from math import cos as my_cos from math import pi print(my_cos(pi))
執行結果:
>>> -1.0 >>>
標準庫和 pip
模組
Python 中有三種主要型別的模組:你自己編寫的模組、從外部源安裝的模組以及與 Python 一起預裝的
模組。
預裝的模組叫做標準庫,包含一些常用的模組。標準庫裡包含的模組包括: random,json,os,pdb,sys,re,string,math,subprocess,socket,email 和 doctest 等。
標準庫可以完成的任務包括字串解析、資料序列化、測試、除錯和操作日期、電子郵件、命令列引數等等。
Python 的標準庫擁有大量模組,這是它的主要優勢之一。
標準庫
一些標準庫用Python 寫的,另外一些是使用 C 語言寫的。
大多數的庫在任何平臺通用,但是一些庫只能在 Windows 或 Unix 環境裡才能使用。
我們的文章中不會覆蓋到所有的標準庫,因為標準庫太龐大了。完整的標準庫文件可以訪問 www.python.org,上面有英語,法語和日語等各種版本。
在 Python 中安裝第三方模組是通過pip 這個工具完成的,此工具隨著 Python 安裝程式安裝到你的機 器。要安裝的一個庫,轉到命令列(對於 Windows,它將是命令提示符),輸入pip install library_name 。安裝完成後就可以匯入library_name 這個模組並使用了。
使用pip 這個工具是在大多數作業系統上安裝第三方庫的標準方法,有些庫已經為 Windows 預先構建了二進位制檔案。這些是普通的可執行檔案,也可以使用 GUI 安裝庫,就像安裝其他程式一樣。
注:請在命令列下輸入 pip,不要在 Python 的解析器裡。
“程式設計師有三種美 德:懶惰,急躁和傲慢...”