在上一篇文章中,我們介紹了 Python 的控制結構,現在我們介紹 Python 函數和模塊。
查看上一篇文章請點擊:https://www.cnblogs.com/dustman/p/9976234.html
函數和模塊
代碼重用
代碼重用是編程語言里一個非常重要的概念,增加代碼的大小會使維護變得更加困難。
在軟件工程里,必須遵守不要編寫同一代碼的原則,英文 "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 的解析器里。
“程序員有三種美德:懶惰,急躁和傲慢...”
