開發與維運

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學習站 學習更多內容吧!

Leave a Reply

Your email address will not be published. Required fields are marked *