4. 四、函數(shù)
4.1. 定義
函數(shù)是指將一組語(yǔ)句的集合通過(guò)一個(gè)名字(函數(shù)名)封裝起來(lái),要想執(zhí)行這個(gè)函數(shù),只需要調(diào)用其函數(shù)名即可及舍。
4.2. 特性
- 減少重復(fù)代碼
- 使程序變的可擴(kuò)展
- 使程序易于維護(hù)
4.3. 默認(rèn)參數(shù)
定義函數(shù)時(shí),給形參賦值窟绷,這個(gè)值就是默認(rèn)參數(shù)。在調(diào)用函數(shù)時(shí)咐柜,如果不填寫該參數(shù)兼蜈,表示使用默認(rèn)參數(shù)。定義函數(shù)時(shí)拙友,默認(rèn)參數(shù)應(yīng)該在位置參數(shù)的后面为狸。
4.4. 形參和實(shí)參
顧名思義,形參指形式參數(shù)遗契,實(shí)參指實(shí)際參數(shù)辐棒。形參是定義函數(shù)時(shí),類似于用于占位的參數(shù)牍蜂,它占領(lǐng)的這個(gè)位置用于調(diào)用時(shí)漾根,給實(shí)參放進(jìn)程序里用。
4.5. 位置參數(shù)和關(guān)鍵參數(shù)
定義函數(shù)時(shí)候鲫竞,理論上可以有無(wú)限多個(gè)參數(shù)辐怕。默認(rèn)情況下,這些參數(shù)按0~x從左往右編號(hào)从绘,每個(gè)位置上的參數(shù)都有一個(gè)編號(hào)寄疏,這種通過(guò)編號(hào)確定位置的參數(shù)叫做位置參數(shù)
。因此僵井,調(diào)用函數(shù)時(shí)陕截,每個(gè)位置的參數(shù)是有序的。如果調(diào)用時(shí)批什,想隨意放置參數(shù)农曲,就需要使用關(guān)鍵參數(shù)
。
因?yàn)檎{(diào)用函數(shù)時(shí)渊季,用類似于字典中鍵值對(duì)映射關(guān)系那種方法制定了對(duì)應(yīng)形參的實(shí)參朋蔫,因此程序不會(huì)出錯(cuò)。
del fuc1(name, age, sex, countyr = 'CN'):
return name, age, country, sex
fuc1('Alex', sex = 'man', age = 28)
在上述代碼中却汉,name
驯妄、age
、sex
是位置參數(shù)合砂,三者之間從左往右一次排序青扔,在調(diào)用時(shí),三個(gè)實(shí)參依次表示name、age微猖、sex谈息。比如fuc1('Alex', 21, 'man')
如果使用關(guān)鍵參數(shù),比如第二個(gè)參數(shù)寫sex = 'man'
凛剥,程序輸出時(shí)侠仇,依然會(huì)按照name、age犁珠、country和sex的順序輸出逻炊。
4.6. 可變參數(shù)
定義函數(shù)時(shí),在參數(shù)前面加一個(gè)*
犁享,表示這個(gè)參數(shù)為可變參數(shù)余素。可變參數(shù)炊昆,顧名思義桨吊,這個(gè)參數(shù)代表的參數(shù)個(gè)數(shù)是可變的。事實(shí)上凤巨,函數(shù)是將這些所有參數(shù)打包成一個(gè)元祖?zhèn)鹘o帶星的這個(gè)參數(shù)视乐。
那么問(wèn)題來(lái)了,我們也可以自己打包成一個(gè)列表或者元祖?zhèn)鹘o可變參數(shù)磅甩。但是要注意炊林,如果僅僅是寫一個(gè)列表或者元祖,可變參數(shù)會(huì)將這個(gè)列表或者元祖整體作為一個(gè)參數(shù)卷要。因此渣聚,我們自行打包時(shí),需要加一個(gè)*
僧叉,表示我們將列表或者元祖中的元素打包后傳給可變參數(shù)奕枝。
del fuc1(course, *name)
reture course, name
fuc1('Python3', 'Alex', 'shanshan', 'black girl') # 'Alex'到'black girl'都是可變參數(shù)中的元素。
fuc1('Python3', *['Alex', 'shanshan', 'black girl']) # 自行打包可變參數(shù)
因?yàn)榭勺儏?shù)的參數(shù)可數(shù)是不固定的瓶堕,因此在調(diào)用函數(shù)時(shí)需要注意撰寫其后面的參數(shù)時(shí)需要使用關(guān)鍵參數(shù)
的形式隘道。
del fuc1(course, *name, age)
print('課程為:', course, *name, age)
fuc1('Python3', 'Alex', 21) # 這種寫法會(huì)報(bào)錯(cuò)郎笆,因?yàn)镻ython會(huì)錯(cuò)誤的將`'Alex'`和`21`當(dāng)成可變參數(shù)谭梗,因此缺少一個(gè)參數(shù)`age`。正確的寫法應(yīng)該是:
fuc1('Python3', 'Alex', age = 21)
一個(gè)*
表示元祖宛蚓,兩個(gè)**
表示字典激捏。用于添加未定義的參數(shù)。
del fuc1(name, *args, **kwargs)
print(name, args, kwargs) # 注意凄吏,這里打印參數(shù)時(shí)远舅,不需要添加`*`
fuc1('Alex', 21, '51w', age = 21, school = 'luffy')
4.7. 局部變量和全局變量
函數(shù)中局部變量的作用域只在函數(shù)內(nèi)闰蛔,函數(shù)外的全局變量作用域在整個(gè)程序內(nèi)。因此函數(shù)外不能使用函數(shù)內(nèi)的變量图柏,但是函數(shù)內(nèi)可以使用函數(shù)外的變量序六,但是不能修改函數(shù)外的變量。否則Python會(huì)自動(dòng)在函數(shù)內(nèi)生成一個(gè)與要修改的全局函數(shù)變量相同變量名的局部變量蚤吹。如果確實(shí)像在函數(shù)內(nèi)修改全局變量例诀,需要在函數(shù)內(nèi)對(duì)需要修改的全局變量進(jìn)行生命golbal 函數(shù)變量名
。
4.8. 內(nèi)嵌函數(shù)和閉包
函數(shù)支持嵌套裁着。即定義函數(shù)時(shí)余佃,在定義的函數(shù)內(nèi)部可以再定義函數(shù)。比如:
del fuc1():
print('調(diào)用第一個(gè)函數(shù)')
del fuc2():
print('調(diào)用第二個(gè)函數(shù)')
fuc2()
因?yàn)楹瘮?shù)fuc2
是在fuc1
中定義的跨算,因此,在函數(shù)fuc1
中可以任意調(diào)用函數(shù)fuc2
椭懊,而在函數(shù)fuc1
外诸蚕,則不能調(diào)用函數(shù)fuc2
。
4.9. 返回值
在定義函數(shù)是氧猬,凡是執(zhí)行語(yǔ)句return
背犯,其后面的所有語(yǔ)句將不再執(zhí)行。