詳細(xì)請(qǐng)參考:https://www.cnblogs.com/Neeo/articles/11261365.html
函數(shù)是通用程序的組件(部件)讨便,在別的語(yǔ)言中或稱為過(guò)程或子例程崖疤。函數(shù)也是工具邻奠。
通俗的說(shuō),我們可以把函數(shù)想象為一個(gè)黑匣子,將數(shù)據(jù)(1+1)傳遞進(jìn)去,經(jīng)過(guò)內(nèi)部一番如此這般之后,然后得到了想要的結(jié)果
1泄私、 函數(shù)的定義和調(diào)用
def <function_name>([arg1,agr2,…argn]):
''' functional annotation '''
pass
return
通過(guò)def
關(guān)鍵字來(lái)定義函數(shù),空格之后的function_name
為函數(shù)名(必須有)备闲,函數(shù)的命名規(guī)則參考變量的命名晌端。括號(hào)(必須有)內(nèi)的參數(shù)是可選的,括號(hào)后面的冒號(hào):
也是必須的恬砂。注釋部分為可選的(但強(qiáng)烈建議有注釋咧纠,就像產(chǎn)品的說(shuō)明書(shū)一樣),pass部分為函數(shù)的具體功能實(shí)現(xiàn)代碼泻骤。執(zhí)行結(jié)果視情況可以選擇用return返回漆羔,如果沒(méi)有顯式的return具體內(nèi)容的話,默認(rèn)返回None狱掂。
雖然def為關(guān)鍵字演痒,但def也是可執(zhí)行的語(yǔ)句,就是說(shuō)當(dāng)定義完函數(shù)之前趋惨,這個(gè)函數(shù)此時(shí)是不存在的:
print(dir()) # ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
def foo():
pass
print(dir()) # ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'foo']
由第一個(gè)打印結(jié)果顯示鸟顺,當(dāng)程序執(zhí)行到def語(yǔ)句之前,foo
函數(shù)還不存在器虾,而當(dāng)def執(zhí)行完畢诊沪,第二個(gè)打印結(jié)果告訴我們养筒,在當(dāng)前的名稱空間內(nèi)已經(jīng)存在了foo
函數(shù)。
注意:dir()函數(shù)返回綁定在當(dāng)前名稱空間內(nèi)(如果參數(shù)為空)的變量端姚。
當(dāng)Python解釋器執(zhí)行到def語(yǔ)句時(shí),def語(yǔ)句創(chuàng)建一個(gè)函數(shù)對(duì)象并將這個(gè)對(duì)象賦值給def后面function_name
變量挤悉。然后這個(gè)變量指向這個(gè)函數(shù)渐裸,或者說(shuō)這個(gè)函數(shù)名(變量名)成為了這個(gè)函數(shù)的引用。
def foo():
print("foo function")
def bar():
print("bar function")
if 1:
foo()
else:
bar()
for i in range(10):
if i == 2:
foo()
else:
bar()
通過(guò)上面的例子装悲,也可以看到昏鹃, foo()和bar()函數(shù)一處定義,多處調(diào)用诀诊。這也是函數(shù)的特點(diǎn):
- 最大化的減少代碼冗余和代碼重用洞渤。
- 程序的結(jié)構(gòu)分解,也就是解耦合属瓣。
- 打包打代碼载迄,使功能更加獨(dú)立。
`切記:函數(shù)一定要先定義抡蛙,后調(diào)用
def foo():
return 'hello'
print(foo) # <function foo at 0x000001FFCE7FC1E0>
print(foo()) # hello
通過(guò)上面的例子我們發(fā)現(xiàn):
- 打印函數(shù)名不加括號(hào)护昧,打印的是函數(shù)在內(nèi)存中的地址
- 打印函數(shù)名加上括號(hào),打印的是函數(shù)執(zhí)行的結(jié)果
注:一定要養(yǎng)成良好的習(xí)慣粗截,寫(xiě)注釋
2惋耙、 函數(shù)的返回值
1>函數(shù)沒(méi)有return,也就是沒(méi)有返回值
def foo():
pass
f = foo()
print(f) # None
如上例所示熊昌,如果函數(shù)沒(méi)有顯式的寫(xiě)return绽榛,那么默認(rèn)返回None。我們可以理解為當(dāng)我們沒(méi)有寫(xiě)return時(shí)婿屹,該函數(shù)默認(rèn)return None灭美。
2>返回一個(gè)值
def foo():
# return 'wwj' # wwj
# return len('wwj') # 3
# return [1, 2, 3] # [1, 2, 3]
# return ('aa', 'bb', 'cc')
# return {'wwj', 'age', 'apple'}
return {'name': 'wwj', 'age': '20'}
f = foo()
# print(f, type(f)) # wwj <class 'str'>
# print(f, type(f)) # 3 <class 'int'>
# print(f[1], type(f)) # 2 <class 'list'>
# print(f[0], type(f)) # aa <class 'tuple'>
# print(list(f)[0],type(f)) # apple <class 'set'>
print(f["age"], type(f)) # 20 <class 'dict'>
可以看到return返回的值可以是任意類型,不同類型不同的取值方法
3>返回多個(gè)值
當(dāng)返回多個(gè)值的時(shí)候选泻,值之間需要用逗號(hào)隔開(kāi)冲粤,最后多個(gè)值以元組的方式返回。
def foo():
return 1, 2, {'a': 'b'}, [3, 4]
print(res) # 該打印語(yǔ)句沒(méi)有執(zhí)行
result = foo()
print(result) # 結(jié)果為:(1, 2, {'a': 'b'}, [3, 4])
print(result[2]) # 結(jié)果為:{'a': 'b'}
可以看到页眯,return之后的print語(yǔ)句并沒(méi)有執(zhí)行梯捕。這也是return的另個(gè)一個(gè)特點(diǎn),那就是終止函數(shù)的執(zhí)行窝撵。