Python 函式的引數

2021-09-30 01:29:47 字數 4564 閱讀 1335

def power(x):

return x * x

對於power(x)函式,引數x就是乙個位置引數。

def power(x, n=2):

s = 1

while n > 0:

n = n - 1

s = s * x

return s

引數 n 就是乙個預設引數,預設值為2;當我們呼叫power(5)時,相當於呼叫power(5, 2)

>>> power(5)

25>>> power(5, 2)

25

而對於n 不為 2的其他情況,就必須明確地傳入n,比如power(5, 3)

預設引數可以簡化函式的呼叫。設定預設引數時,有幾點要注意:

一是必選引數在前,預設引數在後;

二是如何設定預設引數。當函式有多個引數時,把變化大的引數放前面,變化小的引數放後面。變化小的引數就可以作為預設引數。

三是預設引數必須指向不變物件!

def calc(*numbers):

sum = 0

for n in numbers:

sum = sum + n * n

return sum

定義可變引數和定義乙個list或tuple引數相比,僅僅在引數前面加了乙個*號。在函式內部,引數numbers接收到的是乙個tuple,因此,函式**完全不變。但是,呼叫該函式時,可以傳入任意個引數,包括0個引數:

>>> calc(1, 2)

5>>> calc()

0

如果已經有乙個list或者tuple,python允許你在list或tuple前面加乙個*號,把list或tuple的元素變成可變引數傳進去:

>>> nums = [1, 2, 3]

>>> calc(*nums)

14

*nums表示把nums這個list的所有元素作為可變引數傳進去。

可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為乙個tuple。而關鍵字引數允許你傳入0個或任意個含引數名的引數,這些關鍵字引數在函式內部自動組裝為乙個dict。

def person(name, age, **kw):

print('name:', name, 'age:', age, 'other:', kw)

函式person除了必選引數nameage外,還接受關鍵字引數kw。在呼叫該函式時,可以只傳入必選引數:

>>> person('michael', 30)

name: michael age: 30 other: {}

也可以傳入任意個數的關鍵字引數:

>>> person('bob', 35, city='beijing')

name: bob age: 35 other:

>>> person('adam', 45, gender='m', job='engineer')

name: adam age: 45 other:

如果已經有乙個dict,python允許你在dict前面加**號,把ldict的元素變關鍵字引數傳進去;

>>> extra = 

>>> person('jack', 24, **extra)

name: jack age: 24 other:

**extra表示把extra這個dict的所有key-value用關鍵字引數傳入到函式的**kw引數,kw將獲得乙個dict,注意kw獲得的dict是extra的乙份拷貝,對kw的改動不會影響到函式外的extra

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)

命名關鍵字引數必須傳入引數名,這和位置引數不同。如果沒有傳入引數名,呼叫將報錯:

>>> person('jack', 24, 'beijing', 'engineer')

traceback (most recent call last):

file "", line 1, in typeerror: person() takes 2 positional arguments but 4 were given

由於呼叫時缺少引數名cityjob,python直譯器把這4個引數均視為位置引數,但person()函式僅接受2個位置引數。

命名關鍵字引數可以有預設值,從而簡化呼叫:

def person(name, age, *, city='beijing', job):

print(name, age, city, job)

由於命名關鍵字引數city具有預設值,呼叫時,可不傳入city引數:

>>> person('jack', 24, job='engineer')

jack 24 beijing engineer

在python中定義函式,可以用必選引數、預設引數、可變引數、關鍵字引數和命名關鍵字引數,這5種引數都可以組合使用。但是請注意,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。

比如定義乙個函式,包含上述若干種引數:

def f1(a, b, c=0, *args, **kw):

print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):

print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

在函式呼叫的時候,python直譯器自動按照引數位置和引數名把對應的引數傳進去。

>>> f1(1, 2)

a = 1 b = 2 c = 0 args = () kw = {}

>>> f1(1, 2, c=3)

a = 1 b = 2 c = 3 args = () kw = {}

>>> f1(1, 2, 3, 'a', 'b')

a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}

>>> f1(1, 2, 3, 'a', 'b', x=99)

a = 1 b = 2 c = 3 args = ('a', 'b') kw =

>>> f2(1, 2, d=99, ext=none)

a = 1 b = 2 c = 0 d = 99 kw =

最神奇的是通過乙個tuple和dict,你也可以呼叫上述函式:

>>> args = (1, 2, 3, 4)

>>> kw =

>>> f1(*args, **kw)

a = 1 b = 2 c = 3 args = (4,) kw =

>>> args = (1, 2, 3)

>>> kw =

>>> f2(*args, **kw)

a = 1 b = 2 c = 3 d = 88 kw =

所以,對於任意函式,都可以通過類似func(*args, **kw)的形式呼叫它,無論它的引數是如何定義的。

雖然可以組合多達5種引數,但不要同時使用太多的組合,否則函式介面的可理解性很差。

python引數函式 Python函式引數總結

coding utf 8 整理一下python函式的各種引數型別 位置引數 呼叫函式時,傳入的兩個值按照位置順序依次賦給引數 def power x,n s 1 while n 0 n n 1 s s x return s print power 5,2 預設引數 簡化函式的呼叫 def power...

python 引數 Python函式 引數

python中將函式作為引數,區分將引數直接寫成函式名和函式名 的區別。def fun1 fun print print print fun 執行fun1 fun4 時,fun為函式fun3的返回值x print type fun type fun type fun fun 執行fun1 fun4 ...

python 函式的引數

位置引數 def power x,n s 1 while n 0 n n 1 s s xreturn s 以上的函式旨在於實現計算x的n次方 預設引數 def power x,n 2 s 1 while n 0 n n 1 s s x return s以上函式中,預設n 2,這樣情況下,不需要每次輸...