遞迴函式,匿名函式使用注意事項
<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>無引數、無返回值
def 函式名():
語句
<2> 無引數、有返回值
def 函式名():
語句
return 需要返回的數值
注意:
一個函式到底有沒有返回值,就看有沒有return,因為只有return才可以返回資料
在開發中往往根據需求來設計函式需不需要返回值
函式中,可以有多個return語句,但是隻要執行到一個return語句,那麼就意味著這個函式的呼叫完成
<3>有引數、無返回值
def 函式名(形參列表):
語句
注意:
在呼叫函式時,如果需要把一些資料一起傳遞過去,被呼叫函式就需要用引數來接收
引數列表中變數的個數根據實際傳遞的資料的多少來確定
<4>有引數、有返回值
def 函式名(形參列表):
語句
return 需要返回的數值
<5>函式名不能重複
- 呼叫函式
<1>呼叫的方式為:
函式名([實參列表])
<2>呼叫時,到底寫不寫 實參
如果呼叫的函式 在定義時有形參,那麼在呼叫的時候就應該傳遞引數
<3>呼叫時,實參的個數和先後順序應該和定義函式中要求的一致
<4>如果呼叫的函式有返回值,那麼就可以用一個變數來進行儲存這個值 - 作用域
<1>在一個函式中定義的變數,只能在本函式中用(區域性變數)
<2>在函式外定義的變數,可以在所有的函式中使用(全域性變數)