1. 程式人生 > >遞迴函式,匿名函式使用注意事項

遞迴函式,匿名函式使用注意事項

<1>什麼是遞迴函式
通過前面的學習知道一個函式可以呼叫其他函式。

如果一個函式在內部不呼叫其它的函式,而是自己本身的話,這個函式就是遞迴函式。

<2>遞迴函式的作用
舉個例子,我們來計算階乘 n! = 1 * 2 * 3 * … * n

解決辦法1:
在這裡插入圖片描述

看階乘的規律
1! = 1
2! = 2 × 1 = 2 × 1!
3! = 3 × 2 × 1 = 3 × 2!
4! = 4 × 3 × 2 × 1 = 4 × 3!

n! = n × (n-1)!
解決辦法2:
在這裡插入圖片描述

原理

在這裡插入圖片描述

匿名函式
用lambda關鍵詞能建立小型匿名函式。這種函式得名於省略了用def宣告函式的標準步驟。

lambda函式的語法只包含一個語句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

如下例項:

sum = lambda arg1, arg2: arg1 + arg2

#呼叫sum函式
print "Value of total : ", sum( 10, 20 )
print "Value of total : ", sum( 20, 20 )

以上例項輸出結果:

Value of total :  30
Value of total :  40

Lambda函式能接收任何數量的引數但只能返回一個表示式的值

匿名函式不能直接呼叫print,因為lambda需要一個表示式

應用場合
函式作為引數傳遞
自己定義函式

def fun(a, b, opt):
… print “a =”, a
… print “b =”, b
… print “result =”, opt(a, b)

fun(1, 2, lambda x,y:x+y)
a = 1
b = 2
result = 3
作為內建函式的引數
想一想,下面的資料如何指定按age或name排序?
stus = [
{“name”:“zhangsan”, “age”:18},
{“name”:“lisi”, “age”:19},
{“name”:“wangwu”, “age”:17}
]
按name排序:

stus.sort(key = lambda x:x[‘name’])
stus
[{‘age’: 19, ‘name’: ‘lisi’}, {‘age’: 17, ‘name’: ‘wangwu’}, {‘age’: 18, ‘name’: ‘zhangsan’}]
按age排序:

stus.sort(key = lambda x:x[‘age’])
stus
[{‘age’: 17, ‘name’: ‘wangwu’}, {‘age’: 18, ‘name’: ‘zhangsan’}, {‘age’: 19, ‘name’: ‘lisi’}]

  1. 自定義函式
    <1>無引數、無返回值
    def 函式名():
    語句
    <2> 無引數、有返回值
    def 函式名():
    語句
    return 需要返回的數值
    注意:

一個函式到底有沒有返回值,就看有沒有return,因為只有return才可以返回資料
在開發中往往根據需求來設計函式需不需要返回值
函式中,可以有多個return語句,但是隻要執行到一個return語句,那麼就意味著這個函式的呼叫完成
<3>有引數、無返回值
def 函式名(形參列表):
語句
注意:

在呼叫函式時,如果需要把一些資料一起傳遞過去,被呼叫函式就需要用引數來接收
引數列表中變數的個數根據實際傳遞的資料的多少來確定
<4>有引數、有返回值
def 函式名(形參列表):
語句
return 需要返回的數值
<5>函式名不能重複
在這裡插入圖片描述

  1. 呼叫函式
    <1>呼叫的方式為:
    函式名([實參列表])
    <2>呼叫時,到底寫不寫 實參
    如果呼叫的函式 在定義時有形參,那麼在呼叫的時候就應該傳遞引數
    <3>呼叫時,實參的個數和先後順序應該和定義函式中要求的一致
    <4>如果呼叫的函式有返回值,那麼就可以用一個變數來進行儲存這個值
  2. 作用域
    <1>在一個函式中定義的變數,只能在本函式中用(區域性變數)
    在這裡插入圖片描述

<2>在函式外定義的變數,可以在所有的函式中使用(全域性變數)