這篇文章主要介紹了Python函數(shù)式編程指南(一):函數(shù)式編程概述,本文講解了什么是函數(shù)式編程概述、什么是函數(shù)式編程、為什么使用函數(shù)式編程、如何辨認函數(shù)式風格等核心知識,需要的朋友可以參考下1pareTo(o2))相信從這個小小的例子你也能感受到強大的生產(chǎn)效率:)封裝控制結(jié)構(gòu)的內(nèi)置模板函數(shù)為了避開邊界效應,函數(shù)式風格盡量避免使用變量,而僅僅為了控制流程而定義的循環(huán)變量和流程中產(chǎn)生的臨時變量無疑是最需要避免的。假如我們需要對剛才的數(shù)集進行過濾得到所有的正數(shù),使用指令式風格的代碼應該像是這樣:代碼如下:lst2 = list()for i in range(len(lst)): #模擬經(jīng)典for循環(huán)if lst[i] 0:lst2.append(lst[i])這段代碼把從創(chuàng)建新列表、循環(huán)、取出元素、判斷、添加至新列表的整個流程完整的展示了出來,儼然把解釋器當成了需要手把手指導的傻瓜。然而,“過濾”這個動作是很常見的,為什么解釋器不能掌握過濾的流程,而我們只需要告訴它過濾規(guī)則呢?在Python里,過濾由一個名為filter的內(nèi)置函數(shù)實現(xiàn)。有了這個函數(shù),解釋器就學會了如何“過濾”,而我們只需要把規(guī)則告訴它:代碼如下:lst2 = filter(lambda n: n 0, lst)這個函數(shù)帶來的好處不僅僅是少寫了幾行代碼這么簡單。封裝控制結(jié)構(gòu)后,代碼中就只需要描述功能而不是做法,這樣的代碼更清晰,更可讀。因為避開了控制結(jié)構(gòu)的干擾,第二段代碼顯然能讓你更容易了解它的意圖。另外,因為避開了索引,使得代碼中不太可能觸發(fā)下標越界這種異常,除非你手動制造一個。函數(shù)式編程語言通常封裝了數(shù)個類似“過濾”這樣的常見動作作為模板函數(shù)。唯一的缺點是這些函數(shù)需要少量的學習成本,但這絕對不能掩蓋使用它們帶來的好處。閉包(closure)閉包是綁定了外部作用域的變量(但不是全局變量)的函數(shù)。大部分情況下外部作用域指的是外部函數(shù)。閉包包含了自身函數(shù)體和所需外部函數(shù)中的“變量名的引用”。引用變量名意味著綁定的是變量名,而不是變量實際指向的對象;如果給變量重新賦值,閉包中能訪問到的將是新的值。閉包使函數(shù)更加靈活和強大。即使程序運行至離開外部函數(shù),如果閉包仍然可見,則被綁定的變量仍然有效;每次運行至外部函數(shù),都會重新創(chuàng)建閉包,綁定的變量是不同的,不需要擔心在舊的閉包中綁定的變量會被新的值覆蓋?;氐絼偛胚^濾數(shù)集的例子。假設(shè)過濾條件中的 0 這個邊界值不再是固定的,而是由用戶控制。如果沒有閉包,那么代碼必須修改為:代碼如下:class greater_than_helper:def __init__(self, minval):self.minval = minvaldef is_greater_than(self, val):return val self.minvaldef my_filter(lst, minval):helper = greater_than_helper(minval)return filter(helper.is_greater_than, lst)請注意我們現(xiàn)在已經(jīng)為過濾功能編寫了一個函數(shù)my_filter。如你所見,我們需要在別的地方(此例中是類greater_than_helper)持有另一個操作數(shù)minval。如果支持閉包,因為閉包可以直接使用外部作用域的變量,我們就不再需要greater_than_helper了:代碼如下:def my_filter(lst, minval):return filter(lambda n: n minval, lst)可見,閉包在不影響可讀性的同時也省下了不少代碼量。函數(shù)式編程語言都提供了對閉包的不同程度的支持。在Python 2.x中,閉包無法修改綁定變量的值,所有修改綁定變量的行為都被看成新建了一個同名的局部變量并將綁定變量隱藏。Python 3.x中新加入了一個關(guān)鍵字 nonlocal 以支持修改綁定變量。但不管支持程度如何,你始終可以訪問(讀取)綁定變量。內(nèi)置的不可變數(shù)據(jù)結(jié)構(gòu)為了避開邊界效應,不可變的數(shù)據(jù)結(jié)構(gòu)是函數(shù)式編程中不可或缺的部分。不可變的數(shù)據(jù)結(jié)構(gòu)保證數(shù)據(jù)的一致性,極大地降低了排查問題的難度。例如,Python中的元組(tuple)就是不可變的,所有對元組的操作都不能改變元組的內(nèi)容,所有試圖修改元組內(nèi)容的操作都會產(chǎn)生一個異常。函數(shù)式編程語言一般會提供數(shù)據(jù)結(jié)構(gòu)的兩種版本(可變和不可變),并推薦使用不可變的版本。遞歸遞歸是另一種取代循環(huán)的方法。遞歸其實是函數(shù)式編程很常見的形式,經(jīng)常可以在一些算法中見到。但之所以放到最后,是因為實際上我們一般很少用到遞歸。如果一個遞歸無法被編譯器或解釋器優(yōu)化,很容易就會產(chǎn)生棧溢出;另一方面復雜的遞歸往往讓人感覺迷惑,不如循環(huán)清晰,所以眾多最佳實踐均指出使用循環(huán)而非遞歸。這一系列短文中都不會關(guān)注遞歸的使用。第一節(jié)完
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:空間域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、瓊海網(wǎng)站維護、網(wǎng)站推廣。
1、說明
可以使用find或者index來查詢字符串,可以使用replace函數(shù)來替換字符串。
2、示例
1)查詢
'abcdefg'.find('cde')
結(jié)果為2
'abcdefg'.find('acde')
結(jié)果為-1
'abcdefg'.index('cde')
結(jié)果為2
2)替換
'abcdefg'.replace('abc','cde')
結(jié)果為'cdedefg'
3、函數(shù)說明
1)find(...)
S.find(sub[, start[, end]]) - int
返回S中找到substring sub的最低索引,使得sub包含在S [start:end]中。 可選的 參數(shù)start和end解釋為切片表示法。
失敗時返回-1。
2)index(...)
S.index(sub[, start[, end]]) - int
與find函數(shù)類似,但是當未找到子字符串時引發(fā)ValueError。
3)replace(...)
S.replace(old, new[, count]) - str
返回S的所有出現(xiàn)的子串的副本舊換新。 如果可選參數(shù)計數(shù)為給定,只有第一個計數(shù)出現(xiàn)被替換。
作用就是把合理的數(shù)據(jù)轉(zhuǎn)換為需要的類型。int()整數(shù),float()浮點數(shù),str()字符串,list()列表,tuple()元組,set()集合……
比如a='12'這個是字符串類型,用int函數(shù)a=int(a)這時變量a就是整型,字符串'12'變?yōu)榱苏麛?shù)12。Python沒有變量聲明的要求,變量的屬性在賦值時確定,這樣變量的類型就很靈活。
有一種題目判斷一個整數(shù)是否回文數(shù),用字符串來處理就很簡單
a=1234321#整數(shù)
if str(a)==str(a)[::-1]:#借助字符串反轉(zhuǎn)比較就可以確定是否回文數(shù)。
還比如元組b=(1,3,2,4),元組是不可以更新刪除排序成員的,但是列表是可以的,通過列表函數(shù)進行轉(zhuǎn)換來實現(xiàn)元組的更新刪除和排序。
b=(1,3,2,4)
b=list(b)
b.sort()
b=tuple(b)
這時得到的元組b就是一個升序的元組(1,2,3,4)
再比如你要輸入創(chuàng)建整數(shù)列表或者整數(shù)元組基本上寫法相同,就是用對應的函數(shù)來最后處理。
ls=list(map(int,input().split()))#這個就是列表
tup=tuple(map(int,input().split()))#這個就是元組
再比如有個叫集合的,集合有唯一性,可以方便用來去重。
ls=[1,2,3,1,2,3,1,2,3]
ls=list(set(ls))#通過set()去重后,現(xiàn)在的ls里就是[1,2,3]去重后的列表。
這可以分兩種情況分析:
1
如果直接丟棄小數(shù)部分,只保留整數(shù)部分的話,可以使用int函數(shù)。
2
如果要求小數(shù)部分對整數(shù)部分有進位,可以使用round函數(shù)。
下面是一個例子:
print(int(12.3),int(12.4))
print(int(12.5),int(12.6))
print(int(12.7),int(12.8))
print(round(12.3))
print(round(12.4))
print(round(12.5))
print(round(12.6))
print(round(12.7))
print(round(12.8))
python中try...except函數(shù)可以用if..else函數(shù)代替。在while循環(huán)內(nèi)部,fast指針每次向前走兩步,這時候我們就要判斷fast的next指針是否為None,不然對fast.next再調(diào)用next指針的時候就會報異常,這個異常出現(xiàn)也反過來說明鏈表不存在環(huán),就可以returnFalse。所以可以把while代碼放到一個try…except中,一旦出現(xiàn)異常就return。這是一個比較好的思路,在以后寫代碼的時候可以考慮替換某些if…else語句減少不必要的判斷,也使得代碼變的更簡潔。
import?re
num=raw_input('please?input?a?number?:\r\n')
num_re=re.search('(\d*)\.(\d)(\d*)',num)
if?num_re:
if?int(num_re.group(2))5:
print?num_re.group(1)
else:
print?int(num_re.group(1))+1