孤荷凌寒自學python第十九天python函數嵌套與將函數做爲返回對象及閉包與遞歸

孤荷凌寒自學python第十九天python函數嵌套與將函數做爲返回對象及閉包與遞歸python

 

(完整學習過程屏幕記錄視頻地址在文末,手寫筆記在文末)編程

Python函數很是的靈活,今天學習了python函數的如下幾個知識點:網絡

1、在函數中能夠定義子函數,而且能夠將子函數做爲函數的返回對象返回給外部閉包

測試:編程語言

def myconnecttostring(*args):ide

    def fin():函數

        strResult=''學習

        for strA in args:  #這兒函數fin使用的是它的父函數myconnecttostring的形式參數(也就是myconnecttostring的局部變量),那麼fin這個函數是閉包的。測試

            strResult+=strA設計

        return strResult

    return fin

 

lstA=list('孤荷凌寒的QQ號是:578652607')

print(lstA)

f=myconnecttostring(*lstA)

print(f)   #打印此做爲函數返回對象的函數f在內存中的地址,下面重複執行一次,將發現每次返回的函數對象並非同一個

strA=f()  #f既然是一個函數,那麼就能夠執行它

print(strA)

f=myconnecttostring(*lstA) #徹底相同地再調用一次函數myconnecttostring,但做爲對象返回的函數f與以前不是同一個對象!!

print(f)  #再看看這個新的函數f在內存中的地址與前一個是不同的。

運行結果 :

['孤', '荷', '凌', '寒', '的', 'Q', 'Q', '號', '是', ':', '5', '7', '8', '6', '5', '2', '6', '0', '7']

<function myconnecttostring.<locals>.fin at 0x00000290DC75A2F0>

孤荷凌寒的QQ號是:578652607

<function myconnecttostring.<locals>.fin at 0x00000290DC77D400>

2、遞歸

一個函數 體的內部代碼塊中的代碼 再次調用 本身,則稱之爲遞歸。

遞歸是一種特殊的循環。

這種循環的終止在於達到設定的條件時就再也不調用本身,那麼遞歸循環結束。

測試階乘:

def jiecheng(intMax):

    if intMax==1:

        return 1

    return intMax * jiecheng(intMax-1)

 

intM=10

intResult=jiecheng(intM)

print(intResult)

運行結果:

3628800

測試函數jiecheng的核心語句是:

intMax * jiecheng(intMax-1)

也就是說不斷遞歸調用函數jiecheng本身來作intMax-1的階乘

最後一個遞歸調用函數jiecheng時實際上是一次性完成了:

10x9x8x7x6x5x4x3x2x1

的計算。

若是 intMax的值設置得很是大,那麼讓cpu一次執行這樣的運算,可能會形成系統算力崩潰。

因而這種把全部計算所有堆到最後一次調用遞歸函數 時才一次計算的方法是不可取的,咱們應當使用

尾遞歸

測試:

def jiecheng(intMax):

    if intMax==1:

        return 1

    return jiechengsub(intMax,1)  #函數 jiechengsub 纔是真正的遞歸調用的函數,給jiechengsub的形參intLastResult傳遞的實參爲1,是由於,第一次調用jiechengsub時,以前的遞歸計算結果尚未,就是1,由於1乘以任何數還等於任何數。

 

#函數 jiechengsub 的第一個形參intCurBig表示當前階乘計算到最大值的哪個數來了;第二個形參intLastResult表示在本次調用以前已經計算過的階乘的積

def jiechengsub(intCurBig,intLastResult):

    intCur=intCurBig * intLastResult #先計算當前最大數intCurBig與以前已經取得的部分階乘結果intLastResult相乘,這兒就把計算分解到每次遞歸都計算一次

    if intCurBig!=1:

        intSub=jiechengsub(intCurBig-1,intCur) #而後再次遞歸調用的時候,已經將本次調用的計算結果 intCur做爲形參intLastResult的實參傳遞給下次調用了

        return intSub

    else:

        return intCur #若是intCurBig已經爲1,則遞歸過程已經結束,再也不遞歸調用,返回最終結果 。

intM=10

intResult=jiecheng(intM)

print(intResult)

運算結果:

3628800

尾遞歸將龐大的計算分解到每次計算中都計算一點,這樣分散的計算纔不會對電腦CPU形成太重的負擔,是比較科學的遞歸設計方案。

 

——————————

今天整理的學習筆記完成,最後例行說明下個人自學思路:

根據過去多年我自學各類編程語言的經歷,認爲只有真正體驗式,解決實際問題式的學習纔會有真正的效果,即讓學習實際發生。在2004年的時候我開始在一個鄉村小學自學電腦 並學習vb6編程語言,沒有學習同伴,也沒有高師在上,甚至電腦都是孤島(鄉村那時尚未網絡),有的只是一本舊書,在痛苦的自學摸索中,我找到適應本身零基礎的學習方法:首先是每讀書的一小節就做相應的手寫筆記,第二步就是上機測試每個筆記內容是否實現,其中會發現書中講的其實有出入或錯誤,第三步就是在上機測試以後,將筆記改成電子版,造成最終的修訂好的正確無誤的學習筆記 。

經過反覆嘗試錯誤,在那個沒有分享與交流的黑暗時期我摸黑學會了VB6,爾後接觸了其它語言,也曾聽過付費視頻課程,結果發現也許本身學歷果真過低,就算是零基礎的入門課程,其實也難以跟上進度,講師的教學多數出現對初學者的實際狀況並不瞭解的狀況,何況學習者的個體也存在差別呢?固然更可怕的是收費課程的價格每每是本身難以承受的。

因而個人全部編程學習都改成了自學,繼續本身的三步學習筆記法的學習之路。

固然自學的最大問題是會走那麼多的彎路,沒有導師直接輸入式的教學來得直接,好在網絡給咱們帶來無限搜索的機會,你們在網絡上的學習日誌帶給咱們共享交流的機會,而QQ羣等交流平臺、網絡社區的成立,咱們能夠一塊兒自學,互相批評交流,也能夠得到更有效,更自主的自學成果。

因而我以人生已過半的年齡,決定繼續個人編程自學之路,開始學習python,只但願與你們共同交流,一我的的獨行是可怕的,只有一羣人的共同前進纔是有但願的。

誠摯期待您的交流分享批評指點!歡迎聯繫我加入從零開始的自學聯盟。

這個時代互聯網成爲了一種基礎設施的存在,因而原本在孤獨學習之路上的咱們變得再也不孤獨,由於網絡就是一個新的客廳,咱們時刻均可以進行沙龍活動。

很是樂意能與你們一塊兒交流本身自學心得和發現,更但願你們可以對我學習過程當中的錯誤給予指點——是的,這樣我就能有許多免費的高師了——這也是分享時代,社區時代帶來的好福利,我相信你們會的,是吧!

 

根據徹底共享的精神,開源互助的理念,個人我的自學錄製過程是所有按4K高清視頻錄製的,從手寫筆記到驗證手寫筆記的上機操做過程全程錄製,但由於4K高清文件太大均超過5G以上,因此沒法上傳至網絡,若有須要可聯繫我QQ578652607對傳,樂意分享。上傳分享到百度網盤的只是壓縮後的720P的視頻。

 

個人學習過程錄像百度盤地址分享以下:(清晰度:1280x720)

連接:https://pan.baidu.com/s/1RRaZNetFkH5MlEx8c6Mnvw  密碼:5j4c

 

Bilibili:

https://www.bilibili.com/video/av35845811/

 

喜馬拉雅語音筆記:

https://www.ximalaya.com/keji/19103006/139702269

相關文章
相關標籤/搜索