孤荷淩寒自學python第十九天python函數嵌套與將函數作為返回對象及閉包與遞歸
孤荷淩寒自學python第十九天python函數嵌套與將函數作為返回對象及閉包與遞歸
(完整學習過程屏幕記錄視頻地址在文末,手寫筆記在文末)
Python函數非常的靈活,今天學習了python函數的以下幾個知識點:
一、在函數中可以定義子函數,並且可以將子函數作為函數的返回對象返回給外部
測試:
def myconnecttostring(*args):
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>
二、遞歸
一個函數 體的內部代碼塊中的代碼 再次調用 自己,則稱之為遞歸。
遞歸是一種特殊的循環。
這種循環的終止在於達到設定的條件時就不再調用自己,那麽遞歸循環結束。
測試階乘:
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
孤荷淩寒自學python第十九天python函數嵌套與將函數作為返回對象及閉包與遞歸