您好,登錄后才能下訂單哦!
函數(shù)式編程
面向過程的程序設(shè)計(jì)
基本單元,函數(shù)
函數(shù)時編程:允許把函數(shù)本身作為參數(shù)傳入另一個函數(shù),還允許返回一個函數(shù)!
高階函數(shù)
abs(-10)是函數(shù)調(diào)用,abs是函數(shù)本身
要獲得調(diào)用結(jié)果,我們可以把結(jié)果賦值給變量
也可以把函數(shù)本身賦給變量,即變量指向函數(shù),這樣可以實(shí)現(xiàn)通過變量來調(diào)用函數(shù)
>>> abs
>>> f=abs
>>> f(-10)
10
說明變量f現(xiàn)在已經(jīng)指向了abs函數(shù)本身,直接調(diào)用abs()函數(shù)和調(diào)用f()完全相同
函數(shù)名也是變量
函數(shù)名就是指向函數(shù)的變量,
如果把a(bǔ)bs指向其他對象呢?
>>> abs(-2)
Traceback (most recent call last):
File "", line 1, in
TypeError: 'int' object is not callable
指向其他對象后,就暫時沒有原來功能了
傳入函數(shù)
高階函數(shù),在一個函數(shù)中能調(diào)用另一個函數(shù)
map/reduce
map
>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
map()傳入的第一個參數(shù)是函數(shù)對象f,
L = []
for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:
L.append(f(n))
print(L)
reduce 看官網(wǎng)吧
filter
正確實(shí)現(xiàn)篩選功能
用于過濾序列,例如刪掉偶數(shù)只保留奇數(shù),把一個序列的空字符串去掉
def not_empty(s):
return s and s,strip()
list(filter(not_empty,['A','','B',None ,'c','d']))
#結(jié)果是 ['A','b','c']
sorted(排序算法)
內(nèi)置sorted()函數(shù)可以對list排序
>>> sorted([1,2,7,6,5,4])
[1, 2, 4, 5, 6, 7]
sorted()函數(shù)也是一個高階函數(shù),他還可以接收一個key函數(shù)來實(shí)現(xiàn)自定義的排序,例如按照絕對值大小排序
>>> sorted([3,5,-1,-2],key=abs)
[-1, -2, 3, 5]
key指定的函數(shù)將作用在list的每一個元素上,并根據(jù)key函數(shù)返回的結(jié)果進(jìn)行排序,對比原來的list和經(jīng)過key=abs處理過的lsit:
>>> sorted([3,5,-1,-2],key=abs)
[-1, -2, 3, 5]
然后按照key進(jìn)行排序
sort也可以給字符串排序
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
按照accii碼值來排序的
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
要進(jìn)行反向排序,不必改動key,可以傳入的三個參數(shù)reverse=Ture
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
高階函數(shù)的抽象能力是非常強(qiáng)大的,而且核心代碼可以保持非常簡潔
函數(shù)作為返回值
寫完一個求和函數(shù)后,不需要立刻求和,而是在后面的代碼中根據(jù)需要再計(jì)算怎么辦,可以不返回求和的結(jié)果,而是返回求和的函數(shù)
返回函數(shù)沒有立刻執(zhí)行,而是在主函數(shù)中調(diào)用了才被執(zhí)行
閉包無錫看婦科的醫(yī)院 http://www.ytsgfk120.com/
在IDLE中寫程序的時候要在最后加上print(),因?yàn)樗皇墙换キh(huán)境!!!
def count():
fs = []
for i in range(1, 4):
def f():
return i*i
fs.append(f)
return fs
f1,f2,f3= count()#借用count來調(diào)用函數(shù)!!!
print(f1())
print(f2())
print(f3())
牢記:
返回函數(shù)不要引用任何的循環(huán)變量,或者后續(xù)會發(fā)生變化的變量
如果一定要引用循環(huán)變量,需要再創(chuàng)建一個函數(shù),用該函數(shù)的參數(shù)綁定循環(huán)變量的值
def count():
def f(j):
def g():
return j*j
return g
fs=[]
for i in range(1,4):
fs.append(f(i))#f立刻被執(zhí)行,因此i的當(dāng)前值被傳入f()
return fs
f1,f2,f3 = count()
print(f1())
print(f2())
缺點(diǎn):代碼較長,可利用lambda函數(shù)縮短代碼
小結(jié):
一個函數(shù)可以返回一個計(jì)算結(jié)果,也可以返回一個函數(shù)。
返回一個函數(shù)時,牢記該函數(shù)并未執(zhí)行,返回函數(shù)中不要引用任何可能會變化的量。
匿名函數(shù)
好處:因?yàn)楹瘮?shù)沒有名字,不必?fù)?dān)心函數(shù)名沖突
沒有return語句
s=list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9]))
print(s)
實(shí)際上就是
def f(x):
return x*x
關(guān)鍵字lambda表示匿名函數(shù),冒號前面的x表示函數(shù)參數(shù)
匿名函數(shù)有個限制,就是只能有一個表達(dá)式,不用寫return語句,返回值就是該表達(dá)式的結(jié)果
匿名函數(shù)也是一個函數(shù)對象,可以把匿名函數(shù)賦給一個變量,再利用變量+參數(shù) 來調(diào)用函數(shù),
f=lambda x:x*x
print(f(4))
可以把匿名函數(shù)作為返回值返回
裝飾器
在代碼運(yùn)行期間動態(tài)增加功能的方式,稱之為“裝飾器”decoator
偏函數(shù)
int轉(zhuǎn)換其他類型的時候,默認(rèn)按十進(jìn)制轉(zhuǎn)換
要想轉(zhuǎn)化為二進(jìn)制 int(x,base=2)
如果嫌一直寫太麻煩,可以定義一個函數(shù)啊
def int2(x,base=2):
return int(x,base)
偏函數(shù)
functools.partial幫助我們創(chuàng)建一個偏函數(shù),不需要我們自己定義int2(),可以直接使用下面的代碼創(chuàng)建一個新的函數(shù)
import functools
int2=functools.partial(int base=2)
int2('100000')
64
funtools.partial的作用就是,把一個函數(shù)的某些參數(shù)給固定住(也就是設(shè)置默認(rèn)值),返回一個新的函數(shù),調(diào)用這個新函數(shù)會更簡單。
小結(jié):
當(dāng)函數(shù)的參數(shù)過多,需要簡化時,使用functools.partial可以創(chuàng)建一個新的函數(shù),這個新函數(shù)可以固定住原函數(shù)的部分參數(shù),從而在調(diào)用的時候更簡單。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。