當前位置:
首頁 > 最新 > Python基礎知識系列——函數

Python基礎知識系列——函數

寫在前面

各位大大,晚上好!又到了新的一期文章更新之時,希望你仍陪在小編身旁。上期文章中,小編講述了怎麼使用pdvega庫繪製常用的商務辦公圖,了解到了怎麼使用簡便的python予以生成快捷的商務圖表。當然鑒於後期會對此類繪圖進行進一步說明,因此小編只是著重講解了這裡繪圖函數的基本用法,小編會在後期的文章中不斷完善這些函數的進一步說明。說完了上期文章,我們的視線該轉移到本期文章之中了,在本期文章中,小編將繼續Python基礎知識的講解,著重聊聊Python函數的一二事。

第一講:Python函數簡介

函數,相信這個概念各位已經根深蒂固了吧,從小學到現在,我們對此接觸了太多,多到我們有時甚至都會害怕此類概念了。有些人一直認為函數很神秘,似乎它就是一個巨大的黑箱子,每當你輸入一些東西進去,它便相應地輸出一些東西給你。不過對函數深入了解之後,你會發現,它原來就是一些演算法構成,原來是如此的可愛。所謂python函數無非就是將這些演算法過程描述成一條條的語句,然後封裝在一個程序體。所以不要覺得python函數神秘,你只需要把它當作一種可以重複進行使用的語句即可。

既然同樣是Python中的語句,那麼為什麼一定要引入函數概念呢?函數到底存在什麼樣的優勢?小編暫時不直接回答這個問題,小編先來舉一個例子。大家應該都還記得著名的斐波那契數列吧(除了第一個和第二個數之外的任何數都是其前兩個數字之和),例如一個位數為10的斐波那契數列為,現在假設你想用Python來生成一個長度為10的斐波那契數列,你可能會這麼做:

這樣你就生成了一個長度為10的斐波那契數列,現在假設你突然間發現原來那你需要的是一個長度為15的斐波那契數列,這時你會怎麼做,如果依據傳統的方法,你應該會這麼做:

通過以上代碼,你就得到了一個長度為15的斐波那契數列,然後你突然間又想得到一個長度為100的斐波那契數列,那麼你會怎麼做,再一次重複上面的程序並把循環次數增加至98嗎?我想聰明的你肯定不會再這麼做了,你會想是否存在這樣一套體系,一旦你輸入長度,那麼它便能輸出一個此種長度的斐波那契數列,一旦你如此想了,那麼你就正在走入程序的殿堂,沒錯,實現以上步驟僅僅需要一個函數。

上面定義了一個fibs函數,通過輸入相應的參數值num便可以得到相應長度的斐波那契數列,所以你不再需要再不斷重複編寫循環語句來實現斐波那契數列的生成了。下面你可以檢驗一下,通過在命令行中輸入,那麼你很容易地就得到了一個長度為10的斐波那契數列。現在,相信不需要小編再解釋為什麼要引入函數這個對象了吧,函數的引入就是為了處理不斷需要進行重複的事情。至於深層的解釋,還是原來那句話,Python學習手冊絕對是你的不二選擇。

通過以上函數的引入,不難發現,python中的函數就是以關鍵字開頭的一系列語句構成,具體的形式如下所示:

一個函數就是由關鍵字+一個函數名+函數主體構成,其中,函數的參數不是必須的,但是如果可能的話盡量能夠予以指定。所以,Python中的函數是不是比較簡單呀,當然為了能夠使使用的人能夠很方便地知道我們所編寫函數的作用,最後是在編寫函數的同時加入函數文檔,從而便於別人理解。這裡還是以斐波那契序列函數為了來進行說明:

所謂的函數文檔就是那些位於之間的語句,如果想了解此函數的作用,只需要在命令行中輸入即可。既然了解了函數的相關內容,下面讓我們更加深入一步吧。

第二講:Python函數參數

剛剛介紹函數的時候,位於函數名後面括弧中的內容就是函數參數,但是函數的參數可不僅僅是那麼簡單的,python中函數的參數主要有四種,你可能最經常用的就是前兩種函數參數,下面一一進行介紹。

位置參數

這裡先說明一下函數中參數引用形式,位於函數名後面的參數也被稱之為形式參數,為此賦值時,所賦的值就是實際參數,函數進行計算就是依賴於實際參數。所以位置參數就是指參數的引用就是一句形參的位置進行賦值。例如:

上面所介紹的求和函數add中的參數x和y就是剛剛所說到的形式參數,而add(1,2)中的1,2就是函數add的實際參數。這裡之所以說這種參數是位置參數,是因為實際參數的引用順序和形參的位置順序一一對應,即1被賦值給了x,而2被賦值給了y。所以,很通俗的稱之為位置參數(position parameter)。

默認參數

上面介紹了位置參數的概念,現在試想一下,如果在進行參數引用時,你少些了一個參數值,即在引用函數add時,你輸入的方式是add(2),那麼此時你肯定會被python告知參數引用錯誤,因此無法進行計算。但是,人不可能一直都能完整輸入,為了解決這種不全的參數引用,默認參數就登上了歷史舞台。

看到了吧,這種參數定義在你缺少參數值時,會把參數值按照順序賦給未被指定默認值的參數,而默認參數則使用其默認值,從而避免了參數引用不全時形成的窘迫。當然,一定要記得一點,默認參數值只有在默認參數未被賦值時才使用,而一旦默認參數被指定了實際參數值,那麼默認參數值就採用新賦予的實際參數值。

可變參數

上面介紹了參數輸入少時的情形,自然也存在你輸入的函數值超過了形參個數的情況,那麼這種情況又該如何解決呢?Python不會真的令你陷入這種尷尬境地,它通過引用了一種可變參數就解決了這種問題。所謂可變參數就是在參數中被寫在*號後面的形參。

引用中1被賦值給了x,2被賦值給了y,而3和4則被統一賦給了lst,並組成了一個元組,所以最終的計算結果為10.

可變關鍵字參數

上面三種函數參數可能就是你最常用的函數形式了,不過在進行登錄名等的輸入時,可變關鍵字參數就成為了一種你喜歡的參數形式。所謂可變關鍵字參數,相信你在這個名稱中就能獲知一二,可變關鍵字參數就是可變參數+關鍵字參數,所以它的引用方式就有點類似與這兩種參數的綜合。可變關鍵字參數就是指位於**號後的參數形式。

現在可以看出這種參數的典型特徵了吧。這種參數具有三種特徵:第一,輸入的參數值並不是惟一的,輸入的值都能被當作其參數;第二,必須要為其參數進行命名;第三,這種參數的輸出形式是一種字典形式。關於可變關鍵字參數的更多內容請自行搜索。這裡既然介紹了這四種參數形式,那麼明白這四種參數的引用順序就很有意義。位置參數和默認參數沒有明確的順序之分,可變參數必須位於這兩種參數之後,而可變關鍵字參數必須位於最後。

第三講:Python中的遞歸函數

上面對於函數的基本內容進行了介紹,下面筆者進行一點高級的話題,即函數中的航空母艦遞歸函數。遞歸函數的明確定義至今沒有達成一致,不過你完全可以理解為遞歸函數就是自身調用自身的過程。不過遞歸函數必須要包含兩大部分,不然就容易陷入無限遞歸的死循環。這兩個條件就是:

基線條件(針對最小的問題):滿足這種條件時函數將直接返回一個值

遞歸條件:包含一個或多個調用,這些調用旨在解決問題的一部分。

所以使用遞歸就是要確定你的基準問題,而後予以條件引用即可。本部分以兩個例子來予以說明:階乘和冪,以及二分法。

3.1 階乘和冪

相信階乘大家都有接觸過,就是計算n(n-1)……*1的積,如果在python中計算這種階乘,你會選擇怎麼解決?很多人第一想法就是使用循環,假設你要計算某個數的階乘,那麼你可能就會使用以下的循環:

通過以上函數,如果你想計算5的階乘,你只需要在命令行中輸入便會得到相應的輸出值為120。不過不知各位可否還記得筆者先前的告誡,在程序中,如果存在能夠不適用循環的時候就盡量不要使用循環,剛好對於階乘的計算,存在著一種更加變數的方法,那就是遞歸,通過遞歸函數可以更加可觀以及更加快捷地計算出階乘。

是不是比循環語句更加直觀,當然計算速度也是比循環快很多(前提是你要計算的階乘書較大,如果你只是計算5的階乘,兩者基本沒區別,不過你應該不會用程序去計算5的階乘吧,畢竟120這個數太容易得到了)。除了階乘,再給大家看一下冪計算的例子。冪的概念我希望此刻大家還記得,這裡就不再介紹怎麼使用循環去實現冪計算了,僅僅介紹怎麼使用遞歸進行冪計算。

有興趣的朋友可以自己嘗試編寫一下相關的循環程序,然後比較一下兩者的計算時間,相信從此你會愛上遞歸。

3.2 二分查找

不知道各位有沒有玩過猜數遊戲(如果沒有玩過的話建議看一下綜藝節目,這個遊戲常常常在綜藝中出現過,比如某馬桶衛視),規則很簡單,主持人指定一個範圍的數,然後讓你猜測這個數字是多少。你會怎麼猜這個數字,如果你告訴我你將從小到大一個個猜或者從大到小一個個猜,那小編真的要佩服你的勇氣和堅持了。其實這種遊戲最快捷的猜測方式就是先猜中間數,以後依據大小在猜一半的一半,比如主持人指定了一個100以內的數字,那麼你應該最先猜50,如果大了,那就猜25,如果還大,那就猜13,如果還大,那就猜7,如果還大,那就猜4,如果還大,那就猜2,如果還大,只有1了。所以最多需要七次你肯定可以猜出這個100以內的數字是多少,一般來說,給定任意一個數字n,如果讓你猜1-n之間的某個數,你採用這種方式都可以在log2(n)步之後猜出(記住這裡的計算計算向上取正)。那麼我們應該在python中怎麼實現這種猜數遊戲呢,沒錯,的確可以用循環,但是筆者不準備使用循環,有興趣的朋友可以可以自己編寫,這裡筆者還是準備使用遞歸函數進行這一演算法的實現。

一旦你沒有輸入錯誤,那麼你通過輸入一個數列,便可以很快計算出你能夠在第幾次猜出對方指定的數。例如:

不錯,只需要兩次你就能夠猜到這個結果,現在是不是被遞歸的簡單任性徵服了,那就趕快掌握遞歸吧,說實話,一旦掌握了遞歸,你真的具有了一定程度的裝X能力,和別人吹水也會覺得高大上了。

後記

本期文章對於函數的介紹就講到這裡,總覽本期文章,筆者先後介紹了函數的基本概念和創建、函數的參數形式以及函數中的絕對王者遞歸函數,總體說來對函數有了一個概括式介紹。當然,對於函數中的作用域、函數中的lambda函數以及其它的一些函數高級話題,本文沒有進行講解,這屬於本文的缺憾,但是只有夾雜一些缺憾才能造就成美的藝術,所以筆者對此雖有遺憾但也不至失望,有需要的朋友可以聯繫筆者,或者可以參考相關的python手冊。下一期文章中,筆者將和大家講一下機器學習系列中的另外一種高頻引用演算法——決策樹,敬請期待。最後再一次感謝你們的支持,你們的支持使我奮力前行!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

搭建Python數據分析環境的7個步驟,你會嗎?
Python大神利用PyQt

TAG:Python |