函數(shù)式編程
公司專注于為企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站建設、微信公眾號開發(fā)、商城網(wǎng)站開發(fā),成都微信小程序,軟件定制網(wǎng)站設計等一站式互聯(lián)網(wǎng)企業(yè)服務。憑借多年豐富的經(jīng)驗,我們會仔細了解各客戶的需求而做出多方面的分析、設計、整合,為客戶設計出具風格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)公司更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務。
面向過程的程序設計
基本單元,函數(shù)
函數(shù)時編程:允許把函數(shù)本身作為參數(shù)傳入另一個函數(shù),還允許返回一個函數(shù)!
高階函數(shù)
abs(-10)是函數(shù)調(diào)用,abs是函數(shù)本身
要獲得調(diào)用結(jié)果,我們可以把結(jié)果賦值給變量
也可以把函數(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ù)的變量,
如果把abs指向其他對象呢?
>>> 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
正確實現(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ù)來實現(xiàn)自定義的排序,例如按照絕對值大小排序
>>> sorted([3,5,-1,-2],key=abs)
[-1, -2, 3, 5]
key指定的函數(shù)將作用在list的每一個元素上,并根據(jù)key函數(shù)返回的結(jié)果進行排序,對比原來的list和經(jīng)過key=abs處理過的lsit:
>>> sorted([3,5,-1,-2],key=abs)
[-1, -2, 3, 5]
然后按照key進行排序
sort也可以給字符串排序
>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
按照accii碼值來排序的
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']
要進行反向排序,不必改動key,可以傳入的三個參數(shù)reverse=Ture
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']
高階函數(shù)的抽象能力是非常強大的,而且核心代碼可以保持非常簡潔
函數(shù)作為返回值
寫完一個求和函數(shù)后,不需要立刻求和,而是在后面的代碼中根據(jù)需要再計算怎么辦,可以不返回求和的結(jié)果,而是返回求和的函數(shù)
返回函數(shù)沒有立刻執(zhí)行,而是在主函數(shù)中調(diào)用了才被執(zhí)行
閉包無錫看婦科的醫(yī)院 http://www.ytsgfk120.com/
在IDLE中寫程序的時候要在最后加上print(),因為他不是交互環(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的當前值被傳入f()
return fs
f1,f2,f3 = count()
print(f1())
print(f2())
缺點:代碼較長,可利用lambda函數(shù)縮短代碼
小結(jié):
一個函數(shù)可以返回一個計算結(jié)果,也可以返回一個函數(shù)。
返回一個函數(shù)時,牢記該函數(shù)并未執(zhí)行,返回函數(shù)中不要引用任何可能會變化的量。
匿名函數(shù)
好處:因為函數(shù)沒有名字,不必擔心函數(shù)名沖突
沒有return語句
s=list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9]))
print(s)
實際上就是
def f(x):
return x*x
關鍵字lambda表示匿名函數(shù),冒號前面的x表示函數(shù)參數(shù)
匿名函數(shù)有個限制,就是只能有一個表達式,不用寫return語句,返回值就是該表達式的結(jié)果
匿名函數(shù)也是一個函數(shù)對象,可以把匿名函數(shù)賦給一個變量,再利用變量+參數(shù) 來調(diào)用函數(shù),
f=lambda x:x*x
print(f(4))
可以把匿名函數(shù)作為返回值返回
裝飾器
在代碼運行期間動態(tài)增加功能的方式,稱之為“裝飾器”decoator
偏函數(shù)
int轉(zhuǎn)換其他類型的時候,默認按十進制轉(zhuǎn)換
要想轉(zhuǎ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ù),調(diào)用這個新函數(shù)會更簡單。
小結(jié):
當函數(shù)的參數(shù)過多,需要簡化時,使用functools.partial可以創(chuàng)建一個新的函數(shù),這個新函數(shù)可以固定住原函數(shù)的部分參數(shù),從而在調(diào)用的時候更簡單。
文章標題:Pyhton學習之函數(shù)式編程
鏈接分享:http://chinadenli.net/article42/ihojec.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、定制網(wǎng)站、網(wǎng)站營銷、搜索引擎優(yōu)化、軟件開發(fā)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)