天天看點

18節視訊課+程式設計源碼揭秘Python的高階程式設計之函數

什麼是函數?

函數:組織好的、可重複使用的、用來實作單一或相關聯功能的代碼段。函數能提高應用的子產品性,和代碼的重複使用率。

接下來通過十八節視訊課和文章的介紹帶你了解Python函數的世界。

第一節:初識函數

函數也是一個對象,在Python中,一切皆對象。

對象是記憶體中專門用來存儲資料的一塊區域。在程式中可以存在很多個對象。

函數與其他對象的差別,我們先來看一個例子。

比如有如下三行代碼,這三行代碼是一個完整的功能。

print('Hello')
print('你好')
print('再見')           

關于這三行代碼假設是一個完整的功能(要麼都執行,要麼都不執行,且需要在程式的不同位置去調用不隻一次)依照現在的能力,我們需要去修改很多次才可以實作,導緻代碼的可複用性差。另外可能我們覺得這些代碼實作的功能很齊全,希望可以再次使用,這些都不友善。

是以,針對這些問題,産生了可以存儲資料的函數對象。函數可以用來儲存一些可執行的代碼,并且可以在需要時,對這些語句進行多次的調用。

檢視更多有關函數的建立、調用、修改等操作>>

點選連結了解更多 第二節:認識參數

在定義函數時,可以在函數名後的()中定義數量不等的形參,多個形參之間使用“,”隔開。

形參(形式參數),定義形參就相當于在函數内部聲明了變量,但是并不指派。

實參(實際參數),如果函數定義時,指定了形參,那麼在調用函數時也必須傳遞實參,實參将會指派給對應的形參,簡單來說,有幾個形參就得傳幾個實參...>>

第三節:參數傳遞的方式

參數分為實參和形參兩種,它們的傳遞方式也是不同的:

形參:指定了預設值以後,如果使用者傳遞了參數則預設值沒有任何作用。如果使用者沒有傳遞,則預設值就會生效。

實參:包括位置參數和關鍵字參數。

位置參數就是将對應位置的實參複制給對應位置的形參;

關鍵字參數,可以不按照形參定義的順序去傳遞,而直接根據參數名去傳遞參數>>

第四節:實參的類型

通過一個實戰源碼案例初步了解實參的類型其實可以是任意的資料類型>>

第五節:不定長參數

定義一個函數,可以求任意個數字的和。

def sum(a,b):
    print(a+b)
#sum(123,456)
sum(123,456,789)           

此時可以發現隻能計算2個數的和,3個數時程式出錯。我們發現,隻有形參數量跟實參數量一緻才能調用函數計算結果,否則程式就會出錯。這樣跟題目原本的意義不符合。

此時我們需要另外一種方式,在定義函數的時候,可以在形參前邊加上一個*,這樣這個形參将會擷取到所有的實參。它将會将所有的實參儲存到一個元組中。

這就引入了求不定長參數的相關操作的概念,具體是怎麼變換的代碼呢?>>

點選連結檢視更多 第六節:參數的解包(拆包)

傳遞實參時,也可以在序列類型的參數前添加星号,這樣他會自動将序列中的元素依次作為參數傳遞。但是需要注意的是,這裡要求序列中元素的個數必須和形參的個數的一緻,否則程式會出錯。源代碼分析可>>

第七節:函數的傳回值問題

在此之前我們會發現一個問題,函數計算出來的結果直接輸出了,我們無法利用這個結果進行其他操作,這是不好的,我們希望這個結果是直接傳回的。此時我們就需要用到傳回值。

傳回值,就是函數執行以後傳回的結果。可以通過 return 來指定函數的傳回值,可以直接使用函數的傳回值,也可以通過一個變量來接收函數的傳回值。

傳回值也可以是一個函數,具體是怎麼操作的請>>

第八節:文檔字元串

在了解文檔字元串之前,我們需要先去知道help()。

help()是Python中的内置函數,通過help()函數可以查詢python中的函數的用法。

文檔字元串(doc str),在定義函數時,可以在函數内部編寫文檔字元串,文檔字元串就是函數的說明。當我們編寫了文檔字元串時,就可以通過help()函數來檢視函數的說明。文檔字元串非常簡單,其實直接在函數的第一行寫一個字元串就是文檔字元串。>>

第九節:什麼是作用域?

作用域指的是變量生效的區域。

在Python中一共有兩種作用域:

  1. 全局作用域
    • 全局作用域在程式執行時建立,在程式執行結束時銷毀
    • 所有函數以外的區域都是全局作用域
    • 在全局作用域中定義的變量,都屬于全局變量,全局變量可以在程式的任意位置被通路
  2. 函數作用域
    • 函數作用域在函數調用時建立,在調用結束時銷毀
    • 函數每調用一次就會産生一個新的函數作用域
    • 在函數作用域中定義的變量,都是局部變量,它隻能在函數内部被通路

那麼他們都是如何起作用的呢>>

第十節:函數的命名空間

命名空間(namespace)就是變量存儲的位置。每一個變量都需要存儲到指定的命名空間當中。

每一個作用域都會有一個它對應的命名空間:全局命名空間,用來儲存全局變量。函數命名空間用來儲存函數中的變量。

命名空間實際上就是一個字典,是一個專門用來存儲變量的字典>>

第十一節:函數的遞歸

遞歸就是一個遞歸式的函數,而且遞歸不是Python獨有的,其他語言裡面也會有。

小故事:

從前有座山,山裡有座廟,廟裡有個老和尚講故事,講的什麼故事呢?

從前有座山,山裡有座廟,廟裡有個老和尚講故事,講的什麼故事呢?....

這個故事就可以無限的循環下去了。。這就是遞歸的一種形式。

那麼遞歸簡單了解就是自己去引用自己!

遞歸式函數,就是在函數中自己調用自己!

它和循環很像,它的整體思想是,将一個大問題分解為一個個的小問題,直到問題無法分解時,再去解決問題。那麼如何用Python去描述遞歸呢>>

第十二節:遞歸的練習

上節課裡面講了遞歸就是“自己去引用自己”,同時也用代碼給大家解釋了遞歸是如何進行工作的,那麼這節課就跟着老師一起來實戰演練一下吧~>>

第十三節:高階函數

Python支援函數式程式設計,當然也是支援高階函數的。

函數式程式設計:在Python中,函數是一等對象

一等對象一般都會具有如下特點:

① 對象是在運作時建立的
    ② 能指派給變量或作為資料結構中的元素
    ③ 能作為參數傳遞
    ④ 能作為傳回值傳回
           

高階函數:

接收函數作為參數,或者将函數作為傳回值的函數是高階函數;

當我們使用一個函數作為參數時,實際上是将指定的代碼傳遞進了目标函數。

高階函數至少要符合以下兩個特點中的一個:

① 接收一個或多個函數作為參數
      ② 将函數作為傳回值傳回     
           

接下來将用一個實際的案例展示什麼是高階函數>>

第十四節:匿名函數

匿名函數一般都是作為參數使用,其他地方一般不會使用。用于簡單的函數,複雜的不建議使用。

本文介紹了三種匿名函數,并結合代碼展示了這三種匿名函數的用法:

filter:filter就是一個過濾器的意思。filter()可以從序列中過濾出符合條件的元素,儲存到一個新的序列中。

lambda函數:lambda函數表達式專門用來建立一些簡單的函數,他是函數建立的又一種方式。

文法:lambda 參數清單 : 傳回值

map函數:可周遊可疊代對象的所有元素做指定的操作,然後将其添加到一個新的清單中傳回。>>

第十五節:初識sort函數

該函數用于對清單中的元素進行排序。sort()方法預設是直接比較清單中的元素的大小。

如果是比較其他内容,比如字元串的長度,可以通過關鍵字key來操作:

在sort()可以接收一個關鍵字參數 : key;key需要一個函數作為參數,當設定了函數作為參數,每次都會以清單中的一個元素作為參數來調用函數,并且使用函數的傳回值來比較元素的大小...>>

第十六節:閉包

将函數作為傳回值傳回,也是一種高階函數。這種高階函數我們也稱為叫做閉包,通過閉包可以建立一些隻有目前函數能通路的變量。可以将一些私有的資料藏到的閉包中。

形成閉包的要件:

① 函數嵌套

② 将内部函數作為傳回值傳回

③ 内部函數必須要使用到外部函數的變量

如何在實際代碼中應用>>

點選連結了解詳情 第十七節:裝飾器的引入

如果有一個新需求:希望函數可以在計算兩數之和前,列印開始計算,計算結束後列印計算完畢;

我們可以直接通過修改求和函數中的代碼來完成這個需求,但是會産生以下一些問題:

① 如果要修改的函數過多,修改起來會比較麻煩

② 并且不友善後期的維護

③ 并且這樣做會違反開閉原則(OCP)【OCP:程式的設計,要求開放對程式的擴充,要關閉對程式的修改】

此時隻需要根據現有的函數,來建立一個新的函數>>

第十八節:裝飾器的使用

上節課我們說了:每擴充一個函數就可以手動建立一個新的函數,但是這個方式實在是太麻煩了。

為了解決這個問題,我們可以建立一個函數,讓這個函數可以自動的幫助我們生産函數。

因為我們在擴充的時候,不同的函數可能攜帶的參數不同,類型不同或者數量不同導緻每次都要修改新函數的類型,是以這裡介紹一下

*args

這種通用的用法解決該問題。>>

Python的函數部分到這裡就介紹結束啦,小夥伴們了解了多少呢,快來訂閱

Python學習站

學習更多内容吧!