廖雪峰Python 自學筆記 2 函式

2021-09-10 23:36:35 字數 3089 閱讀 7623

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。...