注意項:定義默認(rèn)參數(shù)時,默認(rèn)參數(shù)必須指向不可變對象哥遮。
異于其它語言的:函數(shù)可以返回多個值贷揽。例如:在游戲中位移和坐標(biāo);(第一次正式接觸函數(shù)返回多個值)
def move(x, y, step, angle=0):
nx = x + step * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
函數(shù)作為返回值:
def lazy_sum(*args):
def sum():
s = 0
for m in args:
s += m
return s
return sum
f = lazy_sum(1, 3, 5, 7)
print(f())#16
print(f)#<function lazy_sum.<locals>.sum at 0x1022a1488>
注意項:1.return sum與sum()函數(shù)對齊容劳;2.返回閉包時:返回函數(shù)不要引用任何循環(huán)變量喘沿,或者后續(xù)會發(fā)生變化的變量。(不可變對象)
在函數(shù)lazy_sum中又定義了函數(shù)sum竭贩,并且在內(nèi)部函數(shù)sum可以引用外部函數(shù)lazy_sum的參數(shù)和局部變量蚜印,當(dāng)lazy_sum返回函數(shù)sum時,相關(guān)參數(shù)和變量都保存在返回的函數(shù)中留量,這種稱為“閉包(Closure)”的程序結(jié)構(gòu)擁有極大的威力窄赋。
匿名函數(shù):關(guān)鍵字lambda表示匿名函數(shù),理解:冒號前面的x表示函數(shù)參數(shù)楼熄,冒號后面是返回結(jié)果寝凌。
- num = list(map(lambda x : x ** 2, range(1, 10)))
2.匿名函數(shù)當(dāng)返回值
def point(x, y):
return lambda : x ** 2 + y ** 2 #閉包
point1 = point(1, 4)
print(point1())
print(point(1, 4))
偏函數(shù):Python的functools模塊提供了很多函數(shù)有用的功能,方便我們更靈活孝赫、方便的使用函數(shù)较木,其中一個就是騙函數(shù)。
例如:int() 我們可以把 '1234' 轉(zhuǎn)變成正數(shù)青柄,int('1234') = 1234,默認(rèn)是轉(zhuǎn)變?yōu)槭M制伐债,int() 還可以設(shè)置base參數(shù),我們還可以設(shè)置成其它進制致开,int('1234', base = 8) = 668
我們可以通過functools.partial就是幫助我們創(chuàng)建一個偏函數(shù)的峰锁,更方便這種操作:
import functools
int2 = functools.partial(int, base=2)//創(chuàng)建偏函數(shù)
int2('1000000')//使用偏函數(shù),我們可以更方便的調(diào)用函數(shù)
64