十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
??遞歸算法常用來(lái)解決結(jié)構(gòu)相似的問(wèn)題。
10余年的南華網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整南華建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“南華網(wǎng)站設(shè)計(jì)”,“南華網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
??所謂結(jié)構(gòu)相似,是指構(gòu)成原問(wèn)題的子問(wèn)題與原問(wèn)題在結(jié)構(gòu)上相似,可以用類似的方法解決。具體地,整個(gè)問(wèn)題的解決,可以分為兩部分:第一部分是一些特殊情況,有直接的解法;第二部分與原問(wèn)題相似,但比原問(wèn)題的規(guī)模小,并且依賴第一部分的結(jié)果。
??本質(zhì)上,遞歸是把一個(gè)不能或不好解決的大問(wèn)題轉(zhuǎn)化成一個(gè)或幾個(gè)小問(wèn)題,再把這些小問(wèn)題進(jìn)一步分解成更小的問(wèn)題,直至每個(gè)小問(wèn)題都可以直接解決。
??實(shí)際上,遞歸會(huì)將前面所有調(diào)用的函數(shù)暫時(shí)掛起,直到遞歸終止條件給出明確的結(jié)果后,才會(huì)將所有掛起的內(nèi)容進(jìn)行反向計(jì)算。其實(shí),遞歸也可以看作是一種反向計(jì)算的過(guò)程,前面調(diào)用遞歸的過(guò)程只是將表達(dá)式羅列出來(lái),待終止條件出現(xiàn)后,才依次從后向前倒序計(jì)算前面掛起的內(nèi)容,最后將所有的結(jié)果一起返回。
將函數(shù)作為參數(shù)傳入,這樣的函數(shù)稱為高階函數(shù)。 函數(shù)式編程就是指這種高度抽象的編程范式。
變量可以指向函數(shù),函數(shù)的參數(shù)能接收變量,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)就稱之為高階函數(shù)。如下所示:
map(fun, lst),將傳入的函數(shù)變量func作用到lst變量的每個(gè)元素中,并將結(jié)果組成新的列表返回。
定義一個(gè)匿名函數(shù)并調(diào)用,定義格式如--lambda arg1,arg2…:表達(dá)式
reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, …]上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算。
filter() 函數(shù)用于過(guò)濾序列,過(guò)濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
閉包的定義?閉包本質(zhì)上就是一個(gè)函數(shù)
如何創(chuàng)建閉包?
如何使用閉包?典型的使用場(chǎng)景是裝飾器的使用。
global與nonlocal的區(qū)別:
簡(jiǎn)單的使用如下:
偏函數(shù)主要輔助原函數(shù),作用其實(shí)和原函數(shù)差不多,不同的是,我們要多次調(diào)用原函數(shù)的時(shí)候,有些參數(shù),我們需要多次手動(dòng)的去提供值。
而偏函數(shù)便可簡(jiǎn)化這些操作,減少函數(shù)調(diào)用,主要是將一個(gè)或多個(gè)參數(shù)預(yù)先賦值,以便函數(shù)能用更少的參數(shù)進(jìn)行調(diào)用。
我們?cè)賮?lái)看一下偏函數(shù)的定義:
類func = functools.partial(func, *args, **keywords)
我們可以看到,partial 一定接受三個(gè)參數(shù),從之前的例子,我們也能大概知道這三個(gè)參數(shù)的作用。簡(jiǎn)單介紹下:
總結(jié)
本文是對(duì)Python 高階函數(shù)相關(guān)知識(shí)的分享,主題內(nèi)容總結(jié)如下:
一、實(shí)例方法,類方法,靜態(tài)方法
我們首先寫(xiě)一個(gè)類,里面包含這三種方法。
可以看到,我們用到了兩個(gè)裝飾器。
我們用類和實(shí)例分別調(diào)用下類方法
我們用類和實(shí)例分別調(diào)用下靜態(tài)方法
靜態(tài)方法其實(shí)就是把一個(gè)普通的函數(shù)寫(xiě)在類里,與直接在外層寫(xiě)一個(gè)函數(shù)是一樣的,本質(zhì)上是一個(gè)函數(shù)。
為了方便理解,我們分別打印下這些方法的類型
通過(guò)type()查看對(duì)象是方法還是函數(shù)
此外,還可以通過(guò)inspect模塊判斷某個(gè)對(duì)象是否是某種類型,返回布爾值。
用法
小Tips:概念理解
直接def定義的,我們叫做函數(shù)
把函數(shù)放到類里,我們叫做方法
方法可以通過(guò)裝飾器staticmethod轉(zhuǎn)為(放在方法里的)函數(shù)
繼承
一個(gè)類繼承另一個(gè)類時(shí),會(huì)自動(dòng)獲得另一個(gè)類的所有屬性和方法,被繼承的類稱之為父類,新類稱為子類。子類擁有父類所有的屬性和方法,并且可以定義自己的屬性和方法
我們以上邊的Rectangle類為父類來(lái)試一下
1)完全繼承
可以看到,子類完全繼承父類后,可以直接調(diào)用父類的所有方法。
2)部分繼承
部分繼承:繼承父類后,修改父類的同名方法
我們?cè)囈幌?,Square繼承Rectangle后,修改__init__()方法
3)拓展父類的方法
在保留父類中某個(gè)方法的代碼同時(shí),對(duì)方法進(jìn)行拓展
可以在方法中加入"super().方法名"來(lái)實(shí)現(xiàn)
4)@property
變量可以指向函數(shù),函數(shù)的參數(shù)可以接收變量,那么函數(shù)可以接收另一個(gè)函數(shù)作為參數(shù),這種函數(shù)稱為高階函數(shù)。
1、把函數(shù)作為實(shí)參;2、把函數(shù)作為返回值。
python高階函數(shù)有哪些?
map函數(shù)
map()是python內(nèi)置的高階函數(shù),它接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是序列,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并且把結(jié)果作為新的列表返回。
filter函數(shù)
filter()同樣也是接收一個(gè)函數(shù)和一個(gè)序列,和map()不同的是,filter函數(shù)把傳入的函數(shù)依次作用于每個(gè)元素,然后返回返回值是True的元素。
reduce函數(shù)
reduce()把一個(gè)函數(shù)作用到一個(gè)序列上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果和序列的下一個(gè)元素做累積計(jì)算。
lambda函數(shù)
lambda()有時(shí)候傳參數(shù)時(shí)不需要顯示自定義的函數(shù),直接傳入匿名函數(shù)更方便;冒號(hào)前面的X,y表示函數(shù)參數(shù),匿名函數(shù)不需要擔(dān)心函數(shù)名的沖突,匿名函數(shù)也是一個(gè)函數(shù)對(duì)象,可以吧匿名函數(shù)賦值給一個(gè)變量,再利用變量來(lái)調(diào)用函數(shù),匿名函數(shù)也可以作為返回值返回。
sorted函數(shù)
sorted()作為python內(nèi)置高階函數(shù)之一,其功能是對(duì)序列(列表、元組、字典、集合、字符串)進(jìn)行排序。
下面是筆者的個(gè)人理解: 把計(jì)算出的值存在函數(shù)內(nèi)部(當(dāng)然不止尾遞歸)是其計(jì)算方法,從而不用在棧中去創(chuàng)建一個(gè)新的,這樣就大大節(jié)省了空間。函數(shù)調(diào)用中最后返回的結(jié)果是單純的遞歸函數(shù)調(diào)用(或返回結(jié)果)就是尾遞歸。
實(shí)例還是和筆者的上一篇文章相同,建議讀者閱讀 Python —— 遞歸
常規(guī)遞歸階乘:
我們來(lái)看一下執(zhí)行過(guò)程:
但是如果把上面的函數(shù)寫(xiě)成如下形式:
我們?cè)倏聪聢?zhí)行過(guò)程:
很直觀的就可以看出,這次的 factorial 函數(shù)在遞歸調(diào)用的時(shí)候不會(huì)產(chǎn)生一系列逐漸增多的中間變量了,而是將狀態(tài)保存在 acc 這個(gè)變量中。而這種形式的遞歸,就叫做尾遞歸。
常規(guī)遞斐波那契數(shù)列:
而尾遞歸:
一下子就充滿了逼格,還高效了許多,何樂(lè)而不為呢!