定義函數(shù)
Python中每個函數(shù)都有自己的名字冈绊、自變量和因變量。我們通常把Python中函數(shù)的自變量稱為函數(shù)的參數(shù)埠啃,而因變量稱為函數(shù)的返回值死宣。
在Python中可以使用def
關(guān)鍵字來定義函數(shù),和變量一樣每個函數(shù)也應(yīng)該有一個漂亮的名字碴开,命名規(guī)則跟變量的命名規(guī)則是一致的毅该。在函數(shù)名后面的圓括號中可以放置傳遞給函數(shù)的參數(shù)博秫,就是我們剛才說到的函數(shù)的自變量,而函數(shù)執(zhí)行完成后我們會通過return
關(guān)鍵字來返回函數(shù)的執(zhí)行結(jié)果眶掌,就是我們剛才說的函數(shù)的因變量挡育。一個函數(shù)要執(zhí)行的代碼塊(要做的事情)也是通過縮進(jìn)的方式來表示的,跟之前分支和循環(huán)結(jié)構(gòu)的代碼塊是一樣的朴爬。大家不要忘了def
那一行的最后面還有一個:
即寒,之前提醒過大家,那是在英文輸入法狀態(tài)下輸入的冒號召噩。
參數(shù)的默認(rèn)值
"""
Three_Day-參數(shù)默認(rèn)值
Author: kk
Date: 2022/6/12
"""
def add(a=0, b=0, c=0):
return a + b + c
#調(diào)用add函數(shù)母赵,沒有傳入?yún)?shù),那么a具滴、b凹嘲、c都使用默認(rèn)參數(shù)0
print(add())
#調(diào)用add函數(shù),傳入一個參數(shù)抵蚊,那么該參數(shù)賦值給a施绎,b、c使用默認(rèn)參數(shù)0
print(add(1))
#調(diào)用add函數(shù)贞绳,傳入二個參數(shù)谷醉,那么該參數(shù)賦值給a、b冈闭,c使用默認(rèn)參數(shù)0
print(add(1, 2))
#調(diào)用add函數(shù)俱尼,傳入三個參數(shù),那么該參數(shù)復(fù)制給a萎攒、b遇八、c
print(add(1, 2, 3))
#傳遞參數(shù)時可以不按照設(shè)定的順序進(jìn)行傳遞,但是要用“參數(shù)名=參數(shù)值”的形式
print(add(c=100, b=200, a=300))
注意:帶默認(rèn)值的參數(shù)必須放在不帶默認(rèn)值的參數(shù)之后耍休,否則將產(chǎn)生SyntaxError錯誤刃永,錯誤消息是:non-default argument follows default argument,翻譯成中文的意思是“沒有默認(rèn)值的參數(shù)放在了帶默認(rèn)值的參數(shù)后面”羊精。
可變參數(shù)
接下來斯够,我們還可以實(shí)現(xiàn)一個對任意多個數(shù)求和的add函數(shù),因?yàn)镻ython語言中的函數(shù)可以通過星號表達(dá)式語法來支持可變參數(shù)喧锦。所謂可變參數(shù)指的是在調(diào)用函數(shù)時读规,可以向函數(shù)傳入0個或任意多個參數(shù)。將來我們以團(tuán)隊(duì)協(xié)作的方式開發(fā)商業(yè)項(xiàng)目時燃少,很有可能要設(shè)計(jì)函數(shù)給其他人使用束亏,但有的時候我們并不知道函數(shù)的調(diào)用者會向該函數(shù)傳入多少個參數(shù),這個時候可變參數(shù)就可以派上用場阵具。下面的代碼演示了用可變參數(shù)實(shí)現(xiàn)對任意多個數(shù)求和的add函數(shù)碍遍。
"""
four-可變參數(shù)
Author: kk
Date: 2022/6/12
"""
# 用星號表達(dá)式來表示args可以接收0個或任意多個參數(shù)
def add(*args):
total = 0
for x in args:
total += x
return total
# 在調(diào)用add函數(shù)時可以傳入0個或任意多個參數(shù)
print(add())
print(add(1))
print(add(1, 2, 3, 4))
用模塊管理函數(shù)
不管用什么樣的編程語言來寫代碼定铜,給變量、函數(shù)起名字都是一個讓人頭疼的問題雀久,因?yàn)槲覀儠龅矫麤_突這種尷尬的情況宿稀。最簡單的場景就是在同一個.py文件中定義了兩個同名的函數(shù),如下所示赖捌。
"""
five-
Author: kk
Date: 2022/6/12
"""
def foo():
print("Hello World!")
def foo():
print("Goodbye祝沸,World!")
foo()#打印后者
當(dāng)然上面的這種情況我們很容易就能避免越庇,但是如果項(xiàng)目是團(tuán)隊(duì)協(xié)作多人開發(fā)的時候罩锐,團(tuán)隊(duì)中可能有多個程序員都定義了名為foo的函數(shù),這種情況下怎么解決命名沖突呢卤唉?答案其實(shí)很簡單涩惑,Python中每個文件就代表了一個模塊(module),我們在不同的模塊中可以有同名的函數(shù)桑驱,在使用函數(shù)的時候我們通過import關(guān)鍵字導(dǎo)入指定的模塊再使用完全限定名的調(diào)用方式就可以區(qū)分到底要使用的是哪個模塊中的foo函數(shù)竭恬,代碼如下所示。
"""
five-
Author: kk
Date: 2022/6/12
"""
#module1.py
def foo():
print("Hello World!")
#module2.py
def foo():
print("Goodbye熬的,World痊硕!")
#test.py
import module1
import module2
# 用“模塊名.函數(shù)名”的方式(完全限定名)調(diào)用函數(shù),
module1.foo() # Hello World!
module2.foo() # Goodbye押框,World岔绸!
在導(dǎo)入模塊時,還可以使用as關(guān)鍵字對模塊進(jìn)行別名橡伞,這樣我們可以使用更為簡短的完全限定名盒揉。
#test.py
import module1 as m1
import module2 as m2
m1.foo() # Hello World!
m2.foo() # Goodbye,World兑徘!
上面的代碼我們導(dǎo)入了定義函數(shù)的模塊刚盈,我們也可以使用from...import...語法從模塊中直接導(dǎo)入需要使用的函數(shù),代碼如下所示挂脑。
#test.py
from module1 import foo
foo()# Hello World!
from module2 import foo
foo()# Goodbye扁掸,World!
但是最域,如果我們?nèi)绻麖膬蓚€不同的模塊中導(dǎo)入了同名的函數(shù),后導(dǎo)入的函數(shù)會覆蓋掉先前的導(dǎo)入锈麸,就像下面的代碼中镀脂,調(diào)用foo會輸出hello, world!,因?yàn)槲覀兿葘?dǎo)入了module2的foo忘伞,后導(dǎo)入了module1的foo 薄翅。如果兩個from...import...反過來寫沙兰,就是另外一番光景了。
#test.py
from module2 import foo
from module1 import foo
foo()# # Hello World!
如果想在上面的代碼中同時使用來自兩個模塊中的foo函數(shù)也是有辦法的翘魄,大家可能已經(jīng)猜到了鼎天,還是用as關(guān)鍵字對導(dǎo)入的函數(shù)進(jìn)行別名,代碼如下所示暑竟。
#test.py
from module1 import foo as f1
from module2 import foo as f2
f1()# Hello World!
f2()# Goodbye斋射,World!
標(biāo)準(zhǔn)庫中的模塊和函數(shù)
Python標(biāo)準(zhǔn)庫中提供了大量的模塊和函數(shù)來簡化我們的開發(fā)工作但荤,我們之前用過的random模塊就為我們提供了生成隨機(jī)數(shù)和進(jìn)行隨機(jī)抽樣的函數(shù)罗岖;而time模塊則提供了和時間操作相關(guān)的函數(shù);上面求階乘的函數(shù)在Python標(biāo)準(zhǔn)庫中的math模塊中已經(jīng)有了腹躁,實(shí)際開發(fā)中并不需要我們自己編寫桑包,而math模塊中還包括了計(jì)算正弦、余弦纺非、指數(shù)哑了、對數(shù)等一系列的數(shù)學(xué)函數(shù)。隨著我們進(jìn)一步的學(xué)習(xí)Python編程知識烧颖,我們還會用到更多的模塊和函數(shù)弱左。
Python標(biāo)準(zhǔn)庫中還有一類函數(shù)是不需要import就能夠直接使用的,我們將其稱之為內(nèi)置函數(shù)倒信,這些內(nèi)置函數(shù)都是很有用也是最常用的科贬,下面的表格列出了一部分的內(nèi)置函數(shù)。
簡單的總結(jié)
函數(shù)是功能相對獨(dú)立且會重復(fù)使用的代碼的封裝鳖悠。學(xué)會使用定義和使用函數(shù)榜掌,就能夠?qū)懗龈鼮閮?yōu)質(zhì)的代碼。當(dāng)然乘综,Python語言的標(biāo)準(zhǔn)庫中已經(jīng)為我們提供了大量的模塊和常用的函數(shù)憎账,用好這些模塊和函數(shù)就能夠用更少的代碼做更多的事情。