調(diào)用函數(shù)
1.max()
max()可以接收任意多個(gè)參數(shù),并返回最大的那個(gè)
>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3
定義函數(shù)
1.空函數(shù)
pass語句什么都不做,用來作為占位符,比如現(xiàn)在還沒想好怎么寫函數(shù)的代碼,就可以先放一個(gè)pass,讓代碼能運(yùn)行起來。
def nop():
pass
2.return
函數(shù)執(zhí)行完畢也沒有return語句時(shí),自動(dòng)return None。
3.函數(shù)返回值
函數(shù)可以同時(shí)返回多個(gè)值,但其實(shí)就是一個(gè)tuple。
函數(shù)的參數(shù)
1.默認(rèn)參數(shù)
一是必選參數(shù)在前,默認(rèn)參數(shù)在后,否則Python的解釋器會報(bào)錯(cuò)(思考一下為什么默認(rèn)參數(shù)不能放在必選參數(shù)前面);
二是如何設(shè)置默認(rèn)參數(shù)。當(dāng)函數(shù)有多個(gè)參數(shù)時(shí),把變化大的參數(shù)放前面,變化小的參數(shù)放后面。變化小的參數(shù)就可以作為默認(rèn)參數(shù)。
2.可變參數(shù)
可變參數(shù)接收的是一個(gè)tuple,把函數(shù)的參數(shù)改為可變參數(shù),在參數(shù)前面加一個(gè)*號:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
調(diào)用:
>>> nums = [1, 2, 3]
>>> calc(nums[0], nums[1], nums[2])
14
>>> calc(*nums) #更常用
14
3.關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
調(diào)用
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
4.命名關(guān)鍵字參數(shù)
命名關(guān)鍵字參數(shù)需要一個(gè)特殊分隔符*,*后面的參數(shù)被視為命名關(guān)鍵字參數(shù)。
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
如果函數(shù)定義中已經(jīng)有了一個(gè)可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個(gè)特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,這和位置參數(shù)不同。如果沒有傳入?yún)?shù)名,調(diào)用將報(bào)錯(cuò)。
5.參數(shù)組合
在Python中定義函數(shù),可以用必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù),這5種參數(shù)都可以組合使用。但是請注意,參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
遞歸函數(shù)
使用遞歸函數(shù)的優(yōu)點(diǎn)是邏輯簡單清晰,缺點(diǎn)是過深的調(diào)用會導(dǎo)致棧溢出。
針對尾遞歸優(yōu)化的語言可以通過尾遞歸防止棧溢出。尾遞歸事實(shí)上和循環(huán)是等價(jià)的,沒有循環(huán)語句的編程語言只能通過尾遞歸實(shí)現(xiàn)循環(huán)。
Python標(biāo)準(zhǔn)的解釋器沒有針對尾遞歸做優(yōu)化,任何遞歸函數(shù)都存在棧溢出的問題。