函數(shù)
目的就是函數(shù)(function)。function這個單詞鸟召,有功能的含義胆绊,所以函數(shù)其實是實現(xiàn)了一種功能。
python語句構成函數(shù)欧募。函數(shù)的一個功能在于封裝和復用压状。
封裝:通過函數(shù)的語法,我們把好多的語句放在一起跟继,并且給他們起了名字(函數(shù)名)种冬,從而把語句封裝成函數(shù)。
#func1對line3-line5進行了封裝
def func1(a,b,c):
print(a)
print(b)
print(c)
復用:也就是反復使用舔糖。
如果你要反復使用一個代碼片段娱两,沒有函數(shù)的話,你要不斷復制粘貼金吗,工作量很大十兢,更嚴重的問題趣竣,在于,如果你對這個代碼片段做出修改的話旱物,那么每一個你粘貼的地方都需要修改遥缕,要是你忘了一處怎么辦?宵呛!
這個就叫做可維護性極差通砍。
而有了函數(shù),你不是封裝了代碼片段嗎烤蜕,你只需要在封裝處進行修改封孙,那么各個地方就可以正確使用啦。是不是很神奇呢讽营!
所以說虎忌,封裝是復用的基礎。
黑盒子(函數(shù))
當我們提到函數(shù)時候橱鹏,你應該首先在腦海中浮現(xiàn)出一個黑盒子膜蠢。因為是黑盒子,所以它里面的東西你是看不到的莉兰。這個盒子就是函數(shù)挑围,盒子的名字,就是函數(shù)名糖荒。盒子里面杉辙,就是就是代碼片段。
下面捶朵,我們引入函數(shù)的正式定義:
函數(shù):一段可以直接被另一段程序引用的程序蜘矢。也叫做子程序、(OOP中)方法综看。
一段:意味著是代碼片段品腹,具體代碼片段是什么,我們在黑盒子階段并不關心红碑。
引用:也就是函數(shù)調(diào)用舞吭,后面我們將會給大家介紹。一個函數(shù)內(nèi)部的代碼片段可以調(diào)用其它函數(shù)析珊,被調(diào)用的函數(shù)就叫做子函數(shù)羡鸥,這個形式類似于條件嵌套。
方法:當一個函數(shù)在類中聲明時唾琼,它就成為了這個類的方法(method)兄春。類的概念后面會詳細跟大家講澎剥。
OOP中方法:面向?qū)ο蟪绦蛟O計(Object Oriented Programming)的一種方法锡溯,我們后面在講解類的知識點時會體會到赶舆。
如果可以,請你用自己的語句說下你對函數(shù)的理解祭饭。
制造一個黑盒子(聲明函數(shù))
怎么制造一個黑盒子呢芜茵?也就是怎么聲明或者說怎么定義一個函數(shù)呢?
我來舉個例子:
def greet(name):
print(name+'早上好')
return
line1:def關鍵字表示開始定義函數(shù)倡蝙,greet是函數(shù)名九串,name叫做函數(shù)的參數(shù)
line2和line3是函數(shù)內(nèi)部的代碼片段。其中l(wèi)ine2輸出了一句話寺鸥,
line3 return表示函數(shù)返回猪钮,也就是函數(shù)結束的意思。
從黑盒子角度來看胆建,我們知道了這個盒子叫做greet烤低,盒子期待著一個參數(shù),參數(shù)名稱是name笆载,盒子沒有返回數(shù)據(jù)(即return后面沒內(nèi)容)扑馁,用行話講,叫做函數(shù)返回了None凉驻。
到這里腻要,你就得到了一個黑盒子。
函數(shù)名:最好是取體現(xiàn)函數(shù)功能的名字涝登,一般用小寫字母和單下劃線雄家、數(shù)字等組合
def greet(name):
參數(shù):根據(jù)函數(shù)功能,括號里可以有多個參數(shù)胀滚,也可以不帶參數(shù)咳短,命名規(guī)則與函數(shù)名相同
規(guī)范:括號是英文括號,后面的冒號不能丟
print(name+'早上好')
函數(shù)體:函數(shù)體就是體現(xiàn)函數(shù)功能的語句蛛淋,要縮進咙好,一般是四個空格
函數(shù)的參數(shù)可以有一個,也可以有兩個褐荷,也可以有很多個勾效。也可以沒有。
def pika1():
print('我最喜愛的神奇寶貝是皮卡丘')
比如pika1這個函數(shù)就是沒有參數(shù)的叛甫,但是它依然是一個函數(shù)层宫。
怎么使用黑盒子(調(diào)用函數(shù))
聲明一個函數(shù)后,如果使用它其监,也就是怎么調(diào)用它呢萌腿?
如果你聲明函數(shù)而不調(diào)用函數(shù),那相等于掙了很多錢抖苦,但是不花錢一樣毁菱。
python里面調(diào)用函數(shù)很簡單米死,輸入函數(shù)名和參數(shù)的值就可以:
函數(shù)名.()
看以下實例:
#我們把name叫做形參,形式參數(shù)
def pika2(name):
print('我最喜愛的神奇寶貝是'+name)
#我們把'皮卡丘',噴火龍叫做實參贮庞,實際參數(shù)
pika2('皮卡丘') #調(diào)用函數(shù)峦筒,輸入函數(shù)名pika()并輸入?yún)?shù)'皮卡丘'
pika2('噴火龍') #調(diào)用函數(shù),輸入函數(shù)名pika()并輸入?yún)?shù)'噴火龍'
這個例子想和大家講的是:調(diào)用函數(shù)最關鍵的是窗慎,弄清楚函數(shù)有多少個參數(shù)物喷,如何給參數(shù)賦值。這個過程遮斥,用行話講峦失,叫“傳參”。
形參是變量名术吗,聲明函數(shù)時使用宠进,實參是變量值,調(diào)用函數(shù)時使用藐翎。請嚴格區(qū)分這兩個概念材蹬。
舉個復雜一些的例子:
def process_response(request, response, spider):
# Called with the response returned from the downloader.
# Must either;
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest
return response
process_response(123,456,789)
這個函數(shù)process_response有3個參數(shù),分別是request,response,spider吝镣。
傳參時候就需要按照順序把這3個參數(shù)傳遞進去堤器,從而調(diào)用函數(shù)。
所以末贾,你只要把函數(shù)想象成黑盒子闸溃,把黑盒子叫什么名字,期待什么輸入搞明白拱撵,再復雜的函數(shù)也難不倒你辉川!
關于參數(shù)
無參數(shù)函數(shù)
def a(): #定義一個函數(shù),無任何參數(shù)
print(123)#函數(shù)體拴测,執(zhí)行函數(shù)內(nèi)的語句
a() #調(diào)用函數(shù)乓旗,只有調(diào)用后程序才會去運行函數(shù)
有形式參數(shù)函數(shù)
def a(c): #定義一個函數(shù),有一個形式參數(shù)
print(c)#函數(shù)體集索,執(zhí)行函數(shù)內(nèi)的語句屿愚,記得要縮進
a(99) #調(diào)用函數(shù)一定要寫入實際參數(shù),這里寫入了99
如果函數(shù)里有形式參數(shù)务荆,那么調(diào)用時一定要寫上參數(shù)妆距,否則會報錯。
帶有默認參數(shù)
def a(c,d=100): #定義一個函數(shù)函匕,有一個形式參數(shù)娱据,一個默認參數(shù)
print(c+d)#函數(shù)體,執(zhí)行函數(shù)內(nèi)的語句
a(99) #調(diào)用函數(shù)盅惜,只有調(diào)用程序才會運行函數(shù)
注意中剩,默認參數(shù)一定要放在最后忌穿。
def a(c,d=100): #定義一個函數(shù),有一個形式參數(shù)咽安,一個默認參數(shù)
print(c+d)#函數(shù)體伴网,執(zhí)行函數(shù)內(nèi)的語句
a(99蓬推,1) #調(diào)用函數(shù)妆棒,只有調(diào)用程序才會運行函數(shù)
注意,當輸入了兩個參數(shù)時沸伏,第二個參數(shù)會覆蓋默認參數(shù)糕珊。
不定參數(shù)
def a(*e): #定義一個函數(shù),有一個形式參數(shù)
print(e)#函數(shù)體毅糟,執(zhí)行函數(shù)內(nèi)的語句
a(99,1,100,200) #調(diào)用函數(shù)红选,只有調(diào)用程序才會運行函數(shù)
打印出 (99, 1, 100, 200)