新聞中心
如何在特定的作用域?qū)ython系統(tǒng)函數(shù)替換成自己的函數(shù)
這篇文章主要介紹了Python函數(shù)式編程指南(一):函數(shù)式編程概述,本文講解了什么是函數(shù)式編程概述、什么是函數(shù)式編程、為什么使用函數(shù)式編程、如何辨認(rèn)函數(shù)式風(fēng)格等核心知識(shí),需要的朋友可以參考下1pareTo(o2))相信從這個(gè)小小的例子你也能感受到強(qiáng)大的生產(chǎn)效率:)封裝控制結(jié)構(gòu)的內(nèi)置模板函數(shù)為了避開邊界效應(yīng),函數(shù)式風(fēng)格盡量避免使用變量,而僅僅為了控制流程而定義的循環(huán)變量和流程中產(chǎn)生的臨時(shí)變量無(wú)疑是最需要避免的。假如我們需要對(duì)剛才的數(shù)集進(jìn)行過(guò)濾得到所有的正數(shù),使用指令式風(fēng)格的代碼應(yīng)該像是這樣:代碼如下: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)、取出元素、判斷、添加至新列表的整個(gè)流程完整的展示了出來(lái),儼然把解釋器當(dāng)成了需要手把手指導(dǎo)的傻瓜。然而,“過(guò)濾”這個(gè)動(dòng)作是很常見的,為什么解釋器不能掌握過(guò)濾的流程,而我們只需要告訴它過(guò)濾規(guī)則呢?在Python里,過(guò)濾由一個(gè)名為filter的內(nèi)置函數(shù)實(shí)現(xiàn)。有了這個(gè)函數(shù),解釋器就學(xué)會(huì)了如何“過(guò)濾”,而我們只需要把規(guī)則告訴它:代碼如下:lst2 = filter(lambda n: n 0, lst)這個(gè)函數(shù)帶來(lái)的好處不僅僅是少寫了幾行代碼這么簡(jiǎn)單。封裝控制結(jié)構(gòu)后,代碼中就只需要描述功能而不是做法,這樣的代碼更清晰,更可讀。因?yàn)楸荛_了控制結(jié)構(gòu)的干擾,第二段代碼顯然能讓你更容易了解它的意圖。另外,因?yàn)楸荛_了索引,使得代碼中不太可能觸發(fā)下標(biāo)越界這種異常,除非你手動(dòng)制造一個(gè)。函數(shù)式編程語(yǔ)言通常封裝了數(shù)個(gè)類似“過(guò)濾”這樣的常見動(dòng)作作為模板函數(shù)。唯一的缺點(diǎn)是這些函數(shù)需要少量的學(xué)習(xí)成本,但這絕對(duì)不能掩蓋使用它們帶來(lái)的好處。閉包(closure)閉包是綁定了外部作用域的變量(但不是全局變量)的函數(shù)。大部分情況下外部作用域指的是外部函數(shù)。閉包包含了自身函數(shù)體和所需外部函數(shù)中的“變量名的引用”。引用變量名意味著綁定的是變量名,而不是變量實(shí)際指向的對(duì)象;如果給變量重新賦值,閉包中能訪問(wèn)到的將是新的值。閉包使函數(shù)更加靈活和強(qiáng)大。即使程序運(yùn)行至離開外部函數(shù),如果閉包仍然可見,則被綁定的變量仍然有效;每次運(yùn)行至外部函數(shù),都會(huì)重新創(chuàng)建閉包,綁定的變量是不同的,不需要擔(dān)心在舊的閉包中綁定的變量會(huì)被新的值覆蓋?;氐絼偛胚^(guò)濾數(shù)集的例子。假設(shè)過(guò)濾條件中的 0 這個(gè)邊界值不再是固定的,而是由用戶控制。如果沒(méi)有閉包,那么代碼必須修改為:代碼如下: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)請(qǐng)注意我們現(xiàn)在已經(jīng)為過(guò)濾功能編寫了一個(gè)函數(shù)my_filter。如你所見,我們需要在別的地方(此例中是類greater_than_helper)持有另一個(gè)操作數(shù)minval。如果支持閉包,因?yàn)殚]包可以直接使用外部作用域的變量,我們就不再需要greater_than_helper了:代碼如下:def my_filter(lst, minval):return filter(lambda n: n minval, lst)可見,閉包在不影響可讀性的同時(shí)也省下了不少代碼量。函數(shù)式編程語(yǔ)言都提供了對(duì)閉包的不同程度的支持。在Python 2.x中,閉包無(wú)法修改綁定變量的值,所有修改綁定變量的行為都被看成新建了一個(gè)同名的局部變量并將綁定變量隱藏。Python 3.x中新加入了一個(gè)關(guān)鍵字 nonlocal 以支持修改綁定變量。但不管支持程度如何,你始終可以訪問(wèn)(讀取)綁定變量。內(nèi)置的不可變數(shù)據(jù)結(jié)構(gòu)為了避開邊界效應(yīng),不可變的數(shù)據(jù)結(jié)構(gòu)是函數(shù)式編程中不可或缺的部分。不可變的數(shù)據(jù)結(jié)構(gòu)保證數(shù)據(jù)的一致性,極大地降低了排查問(wèn)題的難度。例如,Python中的元組(tuple)就是不可變的,所有對(duì)元組的操作都不能改變?cè)M的內(nèi)容,所有試圖修改元組內(nèi)容的操作都會(huì)產(chǎn)生一個(gè)異常。函數(shù)式編程語(yǔ)言一般會(huì)提供數(shù)據(jù)結(jié)構(gòu)的兩種版本(可變和不可變),并推薦使用不可變的版本。遞歸遞歸是另一種取代循環(huán)的方法。遞歸其實(shí)是函數(shù)式編程很常見的形式,經(jīng)??梢栽谝恍┧惴ㄖ幸姷?。但之所以放到最后,是因?yàn)閷?shí)際上我們一般很少用到遞歸。如果一個(gè)遞歸無(wú)法被編譯器或解釋器優(yōu)化,很容易就會(huì)產(chǎn)生棧溢出;另一方面復(fù)雜的遞歸往往讓人感覺(jué)迷惑,不如循環(huán)清晰,所以眾多最佳實(shí)踐均指出使用循環(huán)而非遞歸。這一系列短文中都不會(huì)關(guān)注遞歸的使用。第一節(jié)完
創(chuàng)新互聯(lián)專注于揚(yáng)州企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,成都商城網(wǎng)站開發(fā)。揚(yáng)州網(wǎng)站建設(shè)公司,為揚(yáng)州等地區(qū)提供建站服務(wù)。全流程按需網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
Python構(gòu)造函數(shù)
類是對(duì)象的模板,是抽象的。
構(gòu)造函數(shù) init 是Python魔術(shù)方法之一,如圖魔術(shù)方法
我們通過(guò)類模版去創(chuàng)建類的實(shí)例對(duì)象,然后再調(diào)用類定義的功能。
那實(shí)例對(duì)象的屬性是通過(guò)什么來(lái)初始化的?
這時(shí)候Python引入來(lái)構(gòu)造函數(shù) init
構(gòu)造函數(shù),會(huì)在創(chuàng)建實(shí)例對(duì)象之后Python會(huì)自動(dòng)執(zhí)行此方法,把初始化的屬性特點(diǎn)放到實(shí)例對(duì)象里。
通過(guò)前面的學(xué)習(xí),我們知道一個(gè)python對(duì)象包含三個(gè)部分:id(識(shí)別碼),type(對(duì)象類型),value(對(duì)象的值)
那么我們進(jìn)一步深入對(duì)象包含的三部分:
我們通過(guò)類創(chuàng)建實(shí)例對(duì)象后,需要定義構(gòu)造函數(shù) init ()方法。
構(gòu)造方法用于執(zhí)行實(shí)例對(duì)象的初始化工作,即對(duì)象創(chuàng)建之后,初始化當(dāng)前對(duì)象的相關(guān)的屬性,無(wú)返回值
構(gòu)造函數(shù)重點(diǎn) :
我們通過(guò)栗子來(lái)學(xué)習(xí)構(gòu)造函數(shù)的過(guò)程
構(gòu)造函數(shù)初始化實(shí)例對(duì)象過(guò)程如下:
1.Animal類會(huì)通過(guò)默認(rèn)的 new ()方法為實(shí)例對(duì)象在堆內(nèi)存中為開辟一個(gè)空間
敲黑板,重點(diǎn)來(lái)啦~
拓展:
我們今天學(xué)習(xí)了構(gòu)造函數(shù) init (),其在創(chuàng)建對(duì)象之后被Python自動(dòng)調(diào)用初始化實(shí)例對(duì)象屬性數(shù)據(jù)值,無(wú)返回值,并且構(gòu)造函數(shù)不能被顯示調(diào)用。
創(chuàng)建對(duì)象時(shí),如果需要,構(gòu)造函數(shù)可以接受參數(shù)。當(dāng)創(chuàng)建沒(méi)有構(gòu)造函數(shù)的類時(shí),Python會(huì)自動(dòng)創(chuàng)建一個(gè)不執(zhí)行任何操作的默認(rèn)構(gòu)造函數(shù)。
每個(gè)類必須有一個(gè)構(gòu)造函數(shù),即使它只依賴于默認(rèn)構(gòu)造函數(shù)
好啦,以上是本期內(nèi)容,歡迎大佬評(píng)論區(qū)指正~
怎么把下面的Python代碼封裝成函數(shù)
Python:常用函數(shù)封裝:
def is_chinese(uchar):
"""判斷一個(gè)unicode是否是漢字"""
if uchar = u'\u4e00' and uchar=u'\u9fa5':
return True
else:
return False
def is_number(uchar):
"""判斷一個(gè)unicode是否是數(shù)字"""
if uchar = u'\u0030' and uchar=u'\u0039':
return True
else:
return False
def is_alphabet(uchar):
"""判斷一個(gè)unicode是否是英文字母"""
if (uchar = u'\u0041' and uchar=u'\u005a') or (uchar = u'\u0061' and uchar=u'\u007a'):
return True
else:
return False
def is_other(uchar):
"""判斷是否非漢字,數(shù)字和英文字符"""
if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):
return True
else:
return False
def B2Q(uchar):
"""半角轉(zhuǎn)全角"""
inside_code=ord(uchar)
if inside_code0x0020 or inside_code0x7e: #不是半角字符就返回原來(lái)的字符
return uchar
if inside_code==0x0020: #除了空格其他的全角半角的公式為:半角=全角-0xfee0
inside_code=0x3000
else:
inside_code+=0xfee0
return unichr(inside_code)
def Q2B(uchar):
"""全角轉(zhuǎn)半角"""
inside_code=ord(uchar)
if inside_code==0x3000:
inside_code=0x0020
else:
inside_code-=0xfee0
if inside_code0x0020 or inside_code0x7e: #轉(zhuǎn)完之后不是半角字符返回原來(lái)的字符
return uchar
return unichr(inside_code)
def stringQ2B(ustring):
"""把字符串全角轉(zhuǎn)半角"""
return "".join([Q2B(uchar) for uchar in ustring])
def uniform(ustring):
"""格式化字符串,完成全角轉(zhuǎn)半角,大寫轉(zhuǎn)小寫的工作"""
return stringQ2B(ustring).lower()
def string2List(ustring):
"""將ustring按照中文,字母,數(shù)字分開"""
retList=[]
utmp=[]
for uchar in ustring:
if is_other(uchar):
if len(utmp)==0:
continue
else:
retList.append("".join(utmp))
utmp=[]
else:
utmp.append(uchar)
if len(utmp)!=0:
retList.append("".join(utmp))
return retList
當(dāng)前題目:python怎么改成函數(shù),如何在python中定義函數(shù)
文章起源:http://www.dlmjj.cn/article/dsejeie.html