- Python網絡爬蟲與數據分析從入門到實踐
- 馬國俊
- 1177字
- 2024-12-28 12:00:34
1.4 函數的特殊操作
在前一節定義的函數中,函數的參數和返回值都是變量,實際項目中定義和調用的大多數函數都是如此。不過在實現一些特殊的功能時,需要在定義和調用函數時,把函數作為參數傳入或者把函數作為結果返回,或者以匿名的方式來定義和調用函數。
1.4.1 參數是函數
函數的參數不僅可以是數值,也可以是Python內置或編程者自定義的函數。下面的FuncAsParam.py范例程序演示了如何把函數作為參數傳入。

本范例程序第1行代碼定義的add函數中,它的第3個參數func不是變量,而是一個函數,在add函數第2行的函數主體代碼中,先后調用func函數,并將兩次調用得到的值求和,然后把加總的結果通過return語句返回給add()函數的調用者。
在第3行調用add()函數時(在第3個參數位置),傳入了求絕對值的abs函數,所以它的返回值是abs(2)+abs(5),結果是7。
除了可以傳入Python自帶的函數作為參數之外,還可以傳入編程者自定義的函數作為參數。比如在第6行,傳入的參數是第4行定義的求平方的square()函數,所以該用法的返回值是4的平方加5的平方,結果是41。
1.4.2 返回結果是函數
函數除了可以作為參數傳入外,還可以作為函數的返回值,下面的FuncAsReturn.py范例程序演示了這一用法。

本范例程序第1行代碼定義的getCalFunc函數,它是在第9行把自定義函數calSum返回給getCalFunc函數的調用者。請注意,這里的calSum不是變量,而是函數,該函數的定義在第2行到第8行。
在這種用法中,入參maxNum是由最外層的getCalFunc函數傳入到內部的calSum函數里,所以calSum函數內能用到這個值。
在定義完成后,通過第10行的代碼調用了getCalFunc函數,并把實現計算求和功能的calSum函數作為返回值賦值給func對象。對于此類把函數作為返回值的程序編寫方式,在調用時,需要像第11行那樣帶括號。如果像第13行那樣不帶括號,則程序的運行會出現異常。
1.4.3 匿名函數(Lambda表達式)
在定義一些功能比較簡單的函數時,可以不必拘泥于定義函數名、函數體和返回值這樣的形式,而可以用匿名函數的方式來簡化代碼。
由于在定義匿名函數時會使用lambda關鍵字,因此匿名函數也叫Lambda表達式。下面的LambdaDemo.py范例程序演示了如何定義和調用匿名函數。

本范例程序第1行的代碼中,通過lambda關鍵字定義了實現求平方和功能的匿名函數,由于該函數沒有函數名,因此叫匿名函數。該函數返回x的平方加y的平方的數值。
相比于定義函數的常規方法,這種定義函數的方法看上去簡潔易懂,能很好地提升代碼的可讀性。在定義匿名函數后,一般會像第1行那樣,用變量來接收該匿名函數,比如這里使用calSquareSum變量接收匿名函數。
通過第2行代碼能看到調用匿名函數的方式,即calSquareSum(3,4),該函數調用執行的結果是25。第3行代碼是定義匿名函數的另一個例子,是求x1、x2和x3的和,并用calSum變量來接收匿名函數。第4行代碼調用了第3行定義的匿名函數,執行的結果是12。
注意
在定義和使用匿名函數時需要注意的是,匿名函數只適用于函數功能比較簡單的情況,比如上例中函數體只有一句程序代碼。如果函數體比較復雜,不建議使用匿名函數。