3遞迴函式
在python中,定義乙個函式要使用def語句,依次寫出函式名、括號、括號中的引數和冒號:,然後,在縮排塊中編寫函式體,函式的返回值用return語句返回。
def my_abs(x):
if x >= 0:
return x
else:
return -x
函式可以同時返回多個值,但其實就是乙個tuple。
空函式
如果想定義乙個什麼事也不做的空函式,可以用pass語句:
def nop():
pass
在函式宣告時賦值可以當做引數的預設值,如果沒有賦值,則採用該預設值,如果呼叫時已賦值,則採用新的值。
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
必選引數在前,預設引數在後,否則python的直譯器會報錯
預設引數最大的好處是能降低呼叫函式的難度。
定義預設引數要牢記一點:預設引數必須指向不變物件
可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為乙個tuple。
定義可變引數和定義乙個list或tuple引數相比,僅僅在引數前面加了乙個*號。在函式內部,引數numbers接收到的是乙個tuple,因此,函式**完全不變。但是,呼叫該函式時,可以傳入任意個引數,包括0個引數:
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
*nums表示把nums這個list的所有元素作為可變引數傳進去。
關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為乙個dict。
def person(name, age, **kw):
小結部分
要注意定義可變引數和關鍵字引數的語法:
*args是可變引數,args接收的是乙個tuple;
**kw是關鍵字引數,kw接收的是乙個dict。
以及呼叫函式時如何傳入可變引數和關鍵字引數的語法:
可變引數既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過args傳入:func((1, 2, 3));
關鍵字引數既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過kw傳入:func()。
使用*args和**kw是python的習慣寫法,當然也可以用其他引數名,但最好使用習慣用法。
命名的關鍵字引數是為了限制呼叫者可以傳入的引數名,同時可以提供預設值。
定義命名的關鍵字引數在沒有可變引數的情況下不要忘了寫分隔符*,否則定義的將是位置引數
傳入引數方法1
>>> extra =
>>> person('jack', 24, city=extra['city'], job=extra['job'])
name: jack age: 24 other:
傳入引數方法2
>>> extra =
>>> person('jack', 24, **extra)
name: jack age: 24 other:
如果要限制關鍵字引數的名字,就可以用命名關鍵字引數,例如,只接收city和job作為關鍵字引數。這種方式定義的函式如下:
def person(name, age, *, city, job):
print(name, age, city, job)
和關鍵字引數**kw不同,命名關鍵字引數需要乙個特殊分隔符*,*後面的引數被視為命名關鍵字引數。
呼叫方式如下:
>>> person('jack', 24, city='beijing', job='engineer')
jack 24 beijing engineer
如果函式定義中已經有了乙個可變引數,後面跟著的命名關鍵字引數就不再需要乙個特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
要注意定義可變引數和關鍵字引數的語法:
*args是可變引數,args接收的是乙個tuple;
**kw是關鍵字引數,kw接收的是乙個dict。
以及呼叫函式時如何傳入可變引數和關鍵字引數的語法:
可變引數既可以直接傳入:func(1, 2, 3),又可以先組裝list或tuple,再通過* args傳入:func( * (1, 2, 3));
關鍵字引數既可以直接傳入:func(a=1, b=2),又可以先組裝dict,再通過** kw傳入:func( **)。
使用*args和**kw是python的習慣寫法,當然也可以用其他引數名,但最好使用習慣用法。
命名的關鍵字引數是為了限制呼叫者可以傳入的引數名,同時可以提供預設值。
定義命名的關鍵字引數在沒有可變引數的情況下不要忘了寫分隔符*,否則定義的將是位置引數
解決遞迴呼叫棧溢位的方法是通過尾遞迴優化,事實上尾遞迴和迴圈的效果是一樣的,所以,把迴圈看成是一種特殊的尾遞迴函式也是可以的。
尾遞迴是指,在函式返回的時候,呼叫自身本身,並且,return語句不能包含表示式。這樣,編譯器或者直譯器就可以把尾遞迴做優化,使遞迴本身無論呼叫多少次,都只占用乙個棧幀,不會出現棧溢位的情況。
廖雪峰python自學1
這一章主要講了位置引數,預設引數等。在python中定義函式,可以用必選引數 預設引數 可變引數 關鍵字引數和命名關鍵字引數,這5種引數都可以組合使用。但是請注意,引數定義的順序必須是 必選引數 預設引數 可變引數 命名關鍵字引數和關鍵字引數。以下函式允許計算兩個數的乘積,請稍加改造,變成可接收乙個...
廖雪峰python教程筆記1
d.get thomas 1 檢查字典中是否有 thomas 的key,沒有返回 1,沒有指定返回值預設返回none d.pop bob 刪key 字典key不能為列表 s set 1,2,3 set需要以list作為輸入集合,不能重複且無順序。s.add s.remove s1 s2 s1 s2 ...
廖雪峰python入門筆記 for迴圈
list或tuple可以表示乙個有序集合。如果我們想依次訪問乙個list中的每乙個元素呢?比如 list l adam lisa bart print l 0 print l 1 print l 2 如果list只包含幾個元素,這樣寫還行,如果list包含1萬個元素,我們就不可能寫1萬行print。...