python可變引數呼叫函式問題

2021-09-07 13:06:17 字數 1931 閱讀 9637

一直使用python實現一些想法,近期在使用python的過程**現這樣乙個需求,定義了乙個函式。第乙個是普通引數。第二個是預設引數,後面還有可變引數,在最初學習python的時候,都知道非keyword可變引數和keyword可變引數兩種,呼叫的方式或許多種多樣,這裡主要提出乙個比較隱含的問題。並將各種可能出現的情況進行了**。

python儘管不支援函式過載,可是通過對函式引數的眾多特性的支援基本彌補了。

函式宣告的通式例如以下:

def

func

(ar**1,ar**2...[,ar**_d = default1,...]\

[,*var_ar**][,**var_key_ar**])

這是python函式宣告的通式。首先是普通引數若干個。也能夠沒有,接著是帶預設值的引數。然後是非keyword可變引數,最後是keyword可變引數。這為python提供的強大函式呼叫奠定了基礎。

正是在函式呼叫的過程中遇到了問題。為了說明。我定義了乙個例如以下的函式進行說明:

def

f1(a,b=1,*var):

print a,'\t',b,'\t',var

deff2

(a,b=1,**var):

print a,'\t',v,'\t',var

首先普通引數能夠使用按位置的方式呼叫,同一時候能夠使用按形參keyword呼叫。預設值引數也是使用位置方式匹配或者keyword呼叫。實比例如以下:

這裡沒有使用後面的可變引數。一切都沒有問題。

問題是。本人遇到的乙個需求是,預設引數須要就是使用預設值呼叫。同一時候還有可變引數,並且是非keyword引數,那麼呼叫時就會出現以下的情況:

能夠看到,通過非keyword可變引數傳入引數之後。python會預設把非keyword可變引數的前面若干個(這裡是1個)當做預設引數,這裡是由於我沒有提供預設引數b的值,正是這個原因,在我的程式中一直沒發現。

後來自習思考一下。發現python直譯器做出這種決定還是有一定的道理的,由於非keyword可變引數是預設引數之後的若干個引數。而在呼叫的時候由於沒有傳入預設引數的值。python無法推斷究竟從**開始是可變引數,因此在沒有傳入預設引數的值時,就依次從非keyword引數(呼叫者覺得的)中依照順序抽取去當做預設引數的值,這從側面論證了非keyword可變引數在python內部是和普通引數預設引數一併處理的

儘管上述呼叫有些極端,可是確實會出現這種需求,那麼能夠使用keyword可變引數進行替換,上述問題就能夠攻克了,由於直譯器是能夠差別keyword引數和預設引數的,呼叫例如以下:

在使用keyword可變引數時,另乙個重要問題就是,keyword引數的鍵值不能有普通引數或者預設引數的引數名反覆,這從側面論證了,python對keyword呼叫和keyword可變引數在內部都是經過同乙個字典儲存的,因此不能有反覆的鍵。呼叫例如以下:

上述遇到的問題是在實際操作過程中遇到的,一般從各種教程、書本學習python都僅僅是說明上述的函式宣告和呼叫的方式。可是差點兒沒有這種實際操作中可能遇到的點點滴滴,因此學習不論什麼東西最好的方式就動手,這個真理永遠不會變啦!

python可變引數呼叫函式問題

一直使用python實現一些想法,最近在使用python的過程中出現這樣乙個需求,定義了乙個函式,第乙個是普通引數,第二個是預設引數,後面還有可變引數,在最初學習python的時候,都知道非關鍵字可變引數和關鍵字可變引數兩種,呼叫的方式也非常多種多樣,這裡主要提出乙個比較隱含的問題,並將各種可能出現...

python可變引數呼叫函式的問題

已使用python實現的一些想法,近期使用python這種出現的要求,它定義了乙個函式,第一種是一般的引數,第二個引數是預設,並有可變引數。在第一項研究中python時間,不知道keyword可變引數和keyword可變引數兩種,呼叫的方式或許多種多樣。這裡主要提出乙個比較隱含的問題。並將各種可能出...

Python 函式 可變引數

有些時候我們可能遇到引數的個數並不固定的情況,比如1 2 3 n 函式定義如下 def calc numbers sum 0 for n in numbers sum sum n n return sum上面這種情況只能傳乙個引數,而且引數一般是list或tuple,呼叫方式 calc 1,3,5 ...