python基礎之函式的使用
一 引入
基於前一部分的學習,我們已經能開發一些功能簡單的小程式了,但隨著程式功能的增多,程式碼量隨之增大,此時仍不加區分地把所有功能的實現程式碼放到一起,將會使得程式的組織結構不清晰,可讀性變差,且程式中需要頻繁使用同一功能時,只能重複編寫該功能的實現程式碼,日積月累,程式將變得冗長,並且當某一功能需要修改時,又不得不找出所有定義及使用這段功能的地方修改之,管理維護的難度極大,好吧,裝了半天逼,到底該如何解決提出的這些問題呢?
我們完全可以從現實生活中找到簡化程式設計的方案:比如一個修理工會事先準備好螺絲刀、錘子等工具,這樣在進行修理的過程中,需要用到擰螺絲的功能時就直接拿來螺絲刀使用,需要用到錘擊物體的功能時就直接拿來錘子使用,而無需臨時製造。這個例子的核心在於’事先準備好工具’,遇到應用場景時’拿來就用’,。
在程式中,具備某一功能的‘工具’指的就是函式,‘事先準備工具’的過程即函式的定義,‘拿來就用’即函式的呼叫。
二 定義函式
函式的使用必須遵循’先定義,後呼叫’的原則。函式的定義就相當於事先將函式體程式碼儲存起來,然後將記憶體地址賦值給函式名,函式名就是對這段程式碼的引用,這和變數的定義是相似的。沒有事先定義函式而直接呼叫,就相當於在引用一個不存在的’變數名’。
定義函式的語法
def 函式名(引數1,引數2,...):
"""文件描述"""
函式體
return 值
- def: 定義函式的關鍵字;
- 函式名:函式名指向函式記憶體地址,是對函式體程式碼的引用。函式的命名應該反映出函式的功能;
- 括號:括號內定義引數,引數是可有可無的,且無需指定引數的型別;
- 冒號:括號後要加冒號,然後在下一行開始縮排編寫函式體的程式碼;
- """文件描述""": 描述函式功能,引數介紹等資訊的文件,非必要,但是建議加上,從而增強函式的可讀性;
- 函式體:由語句和表示式組成;
- return 值:定義函式的返回值,return是可有可無的。
引數是函式的呼叫者向函式體傳值的媒介,若函式體程式碼邏輯依賴外部傳來的引數時則需要定義為參函式,
def my_min(x,y):
res=x if x < y else y
return res
否則定義為無參函式
def interactive(): user=input('user>>: ').strip() pwd=input('password>>: ').strip() return (user,pwd)
函式體為pass代表什麼都不做,稱之為空函式。定義空函式通常是有用的,因為在程式設計的開始,往往是先想好程式都需要完成什麼功能,然後把所有功能都列舉出來用pass充當函式體“佔位符”,這將使得程式的體系結構立見,清晰且可讀性強。例如要編寫一個ftp程式,我們可能想到的功能有使用者認證,下載,上傳,瀏覽,切換目錄等功能,可以先做出如下定義:
def auth_user():
"""user authentication function"""
pass
def download_file():
"""download file function"""
pass
def upload_file():
"""upload file function"""
pass
def ls():
"""list contents function"""
pass
def cd():
"""change directory"""
pass
之後我們便可以統籌安排程式設計任務,有選擇性的去實現上述功能來替換掉pass,從而提高開發效率。
三 呼叫函式與函式返回值
函式的使用分為定義階段與呼叫階段,定義函式時只檢測語法,不執行函式體程式碼,函式名加括號即函式呼叫,只有呼叫函式時才會執行函式體程式碼
#定義階段
def foo():
print('in the foo')
bar()
def bar():
print('in the bar')
#呼叫階段
foo()
執行結果:
in the foo
in the bar
定義階段函式foo與bar均無語法錯誤,而在呼叫階段呼叫foo()時,函式foo與bar都早已經存在於記憶體中了,所以不會有任何問題。
按照在程式出現的形式和位置,可將函式的呼叫形式分為三種:
#1、語句形式:
foo()
#2、表示式形式:
m=my_min(1,2) #將呼叫函式的返回值賦值給x
n=10*my_min(1,2) #將呼叫函式的返回值乘以10的結果賦值給n
#3、函式呼叫作為引數的形式:
# my_min(2,3)作為函式my_min的第二個引數,實現了取1,2,3中的較小者賦值給m
m=my_min(1,my_min(2,3))
若需要將函式體程式碼執行的結果返回給呼叫者,則需要用到return。return後無值或直接省略return,則預設返回None,return的返回值無型別限制,且可以將多個返回值放到一個元組內。
>>> def test(x,y,z):
... return x,y,z #等同於return (x,y,z)
...
>>> res=test(1,2,3)
>>> print(res)
(1, 2, 3)
return是一個函式結束的標誌,函式內可以有多個return,但只執行一次函式就結束了,並把return後定義的值作為本次呼叫的結果返回。