1樓:
遇事不決,查文件
parameter -- 形參
function (或方法)定義中的命名實體,它指定函式可以接受的乙個 argument (或在某些情況下,多個實參)。有五種形參:
positional-or-keyword:位置或關鍵字,指定乙個可以作為 位置引數 傳入也可以作為 關鍵字引數 傳入的實參。這是預設的形參型別,例如下面的 foo 和 bar:
deffunc(foo, bar=None): ...
positional-only:僅限位置,指定乙個只能通過位置傳入的引數。 僅限位置形參可通過在函式定義的形參列表中它們之後包含乙個 / 字元來定義,例如下面的 posonly1 和 posonly2:
deffunc(posonly1, posonly2, /, positional_or_keyword): ...
keyword-only:僅限關鍵字,指定乙個只能通過關鍵字傳入的引數。僅限關鍵字形參可通過在函式定義的形參列表中包含單個可變位置形參或者在多個可變位置形參之前放乙個 * 來定義,例如下面的 kw_only1 和 kw_only2:
deffunc(arg, *, kw_only1, kw_only2): ...
var-positional:可變位置,指定可以提供由乙個任意數量的位置引數構成的序列(附加在其他形參已接受的位置引數之後)。這種形參可通過在形參名稱前加綴 * 來定義,例如下面的 args:
deffunc(*args, **kwargs): ...
var-keyword:可變關鍵字,指定可以提供任意數量的關鍵字引數(附加在其他形參已接受的關鍵字引數之後)。這種形參可通過在形參名稱前加綴 ** 來定義,例如上面的 kwargs。
形參可以同時指定可選和必選引數,也可以為某些可選引數指定預設值。
另參見 argument 術語表條目、引數與形參的區別 中的常見問題、inspect.Parameter
類、函式定義 一節以及PEP 362。
術語對照表 - Python 3.9.0 文件
2樓:Jock
知乎潛水多年,第一次回答技術問題,如有不當之處,還望各位知友指教。
前面 @angwer 和 @Yudi 兩位知友的回答都已經比較全面了.
這裡我補充一下 Python 3.8 中已經支援函式定義中使用 / 了。具體 / 和 * 的用法,參看 Python 3.
8 的官方文件,寫的非常清楚,這裡我把自己的總結貼在下面。
deff
(pos1
,pos2,/
,pos_or_kwd,*
,kwd1
,kwd2):|
|||Positional
orkeyword||
-Keyword
only
--Positional
only
這裡:/ 和 * 是可選的。
/ 前面的引數都是 僅位置引數(positional-only parameter),即引數只能通過位置引數的形式傳入函式,不能通過關鍵字的形式傳入函式。
/ 和 * 之間的是位置或關鍵字引數(positional-or-keyword parameter),即引數可以通過位置引數的形式參入函式,也可以通過關鍵字的形式傳入函式。
* 後面的引數是 僅關鍵字引數(keyword-only parameter),即只能通過關鍵字傳入引數。注意:在 Python 3.
7 及之前的 Python 版本都是不能在函式定義中的使用/ 符號,否則會報錯,而 * 是可以使用的。從 Python 3.8 開始 / 才可以在函式定義時使用了。
下面給出官方文件中的用法舉例:
>>>defstandard_arg
(arg
):...
(arg
)...
>>>defpos_only_arg
(arg,/
):...
(arg
)...
>>>defkwd_only_arg(*
,arg
):...
(arg
)...
>>>defcombined_example
(pos_only,/
,standard,*
,kwd_only
):...
(pos_only
,standard
,kwd_only
)第乙個函式 standard_arg(arg) 是我們定義函式的方式,它對於傳入引數的方式沒有限制,可以是位置引數,也可以關鍵字引數形式傳入。下面兩種方法都爭取:
>>>standard_arg(2
)2>>>standard_arg
(arg=2
)2第二個函式 pos_only_arg(arg, /) 裡面出現了 / 符號,所以它前面的引數都是僅位置引數,只能通過位置引數的形式傳入函式,通過關鍵字引數形式將報錯,示例如下:
>>>pos_only_arg(1
)1>>>pos_only_arg
(arg=1
)Traceback
(most
recent
call
last
):File"",
line1,
in >TypeError :pos_only_arg ()got anunexpected keyword argument 'arg' 第三個函式 kwd_only_arg(*, arg) 裡面出現了 * 符號,所以它後面的引數都是僅關鍵字引數,只能通過關鍵字引數的形式傳入函式,通過位置引數形式傳入將報錯。示例如下: >>>kwd_only_arg(3 )Traceback (most recent call last ):File"", line1, in >TypeError :kwd_only_arg ()takes 0positional arguments but1 wasgiven >>>kwd_only_arg (arg=3 )3第四個函式 combined_example(pos_only, /, standard, *, kwd_only) 出現了 / 和 *,所以它組合了 3 種函式呼叫約定,即僅位置引數、位置或關鍵字引數、僅關鍵字引數。示例如下: >>>combined_example(1 ,2,3 )Traceback (most recent call last ):File"", line1, in >TypeError :combined_example ()takes 2positional arguments but3 were given >>>combined_example(1 ,2,kwd_only=3 )123 >>>combined_example(1 ,standard=2 ,kwd_only=3 )123 >>>combined_example (pos_only=1 ,standard=2 ,kwd_only=3 )Traceback (most recent call last ):File"", line1, in >TypeError :combined_example ()got anunexpected keyword argument 'pos_only' 如果 / 前的僅位置引數設定了預設值,依據預設引數必須在位置引數之後的原則,那麼 / 和 * 之間的位置或關鍵字引數在 函式定義時 只能通過 kwarg=value 的形式定義,否則會報錯,不過 呼叫時 位置引數和關鍵字引數的傳入方式都可以。但 * 之後的僅關鍵字引數不受影響,可以不設定預設值,但是呼叫必須用關鍵字引數的形式呼叫。 Python 3.8 中測試如下: # 錯誤定義:僅位置引數有預設值,/ 和 * 的位置或關鍵字引數需用 kwarg=value 定義 # SyntaxError: non-default argument follows default argument defmy_fun (name ,age=12 ,/,nation,* ,city ):print(f '我的名字是:,今年歲,來自,現居' )# 正確定義一:關鍵字引數不設定預設值 defmy_fun (name ,age=12 ,/,nation ='中國',* ,city ):print(f '我的名字是:,今年歲,來自,現居' )# 正確定義二:關鍵字引數設定預設值 defmy_fun (name ,age=12 ,/,nation ='中國',* ,city ='武漢' ):print(f '我的名字是:,今年歲,來自,現居' )# 錯誤呼叫一:僅位置引數不能通過關鍵字引數形式傳入 my_fun ('Jock' ,age=25 )# TypeError: my_fun() got some positional-only arguments passed as keyword arguments: 'age' # 正確呼叫一 my_fun ('Jock',25 )# Correct # 正確呼叫二 my_fun ('Jock',25 ,'中國' )# Correct # 正確呼叫三 my_fun ('Jock',25 ,nation ='中國' )# Correct # 錯誤呼叫二:僅關鍵字引數不能通過位置引數的形式傳入 my_fun ('Jock',25 ,'中國' ,'武漢' )# TypeError: my_fun() takes from 1 to 3 positional arguments but 4 were given # 正確呼叫四 my_fun ('Jock',25 ,nation ='中國' ,city ='桂林' )# Correct 如果大家想更加詳細的了解 Python 函式中的引數問題,可以參考下我的這篇文章Python 入門之 Python 函式 丁果 這個問題我們可以換個角度看,看看python的C API,用c寫的python模組中引數傳進去的都是乙個PyObject的指標。比如這個例子,丟擲乙個ValueError異常 include Python.h static PyObject raiseError PyObject self,P... vincen 在Python中,函式是一等物件。程式語言理論家把 一等物件 定義為滿足下述條件的程式實體 1 在執行時建立 2 等賦值給變數或者資料結構中的元素 3 能作為引數傳給函式 4 能作為函式的返回結果 Xi Yang 函式能作為引數和函式式程式設計可完全是兩碼事。真的函式式程式設計是這樣的... 烏索普 兩種不同用法,畢竟是函式引數,你不但可以傳本類物件,也可以傳子類物件,不需要改什麼東西。如果在類裡面寫死,那麼你再想修改。就只能去類裡面改了 酷安小黃 題主,你是怎麼在類B建立乙個A的引用,然後在測試類中構建B類的物件的?傳引數只能按照你注釋之後的那樣穿,類與類之間才能關聯起來。並不是哪種好...關於Python中引數傳遞和作用域的問題?
如何理解「python中函式是一等公民」?
java中為什麼建構函式中的引數傳遞乙個類的物件來實現直接在該類中生成乙個想要傳遞類的物件?