簡體   English   中英

位置參數與關鍵字參數

[英]Positional argument v.s. keyword argument

基於

位置參數是后面沒有等號 (=) 和默認值的名稱。

關鍵字參數后跟一個等號和一個給出其默認值的表達式。

def rectangleArea(width, height):
    return width * height

print rectangleArea(width=1, height=2)

問題> 我假設widthheight都是位置參數。 那為什么我們也可以用關鍵字參數語法來調用它呢?

您引用的文本用於函數的定義,與對函數的調用無關。 調用該函數時,您使用的是“命名參數”功能。 您提供的鏈接質量不是很好,作者似乎對兩種不同的事物感到困惑。

Python 參考僅在調用函數時引用位置和關鍵字參數(請參閱5.3.4 Calls5.3.4 Calls )。

當他們在7.6 Function definitions7.6 Function definitions談論7.6 Function definitions ,它是一個完全不同的術語“默認參數值”。

我懷疑將這些課件放在一起的人並不完全熟悉 Python :-)


舉例來說,參考下面的定義和調用:

def fn (a, b, c = 1):          # a/b required, c optional.
    return a * b + c

print fn (1, 2)                # returns 3, positional and default.
print fn (1, 2, 3)             # returns 5, positional.
print fn (c = 5, b = 2, a = 2) # returns 9, named.
print fn (b = 2, a = 2)        # returns 5, named and default.
print fn (5, c = 2, b = 1)     # returns 7, positional and named.
print fn (8, b = 0)            # returns 1, positional, named and default.

=的含義會發生變化,具體取決於它是在定義中還是在調用中。

在定義中,它將參數標記為可選並設置默認值。

在調用中,它只是允許您以您想要的任何順序指定哪些參數應該是哪些值。

由於 python 3.8 只引入了位置參數,這篇文章需要更新。

位置參數、關鍵字參數、必需參數和可選參數經常被混淆。 位置參數必需參數不同。 和關鍵字參數可選參數不同。

位置參數是可以通過它們在函數定義中的位置來調用的參數。

關鍵字參數是可以通過名稱調用的參數。

必需參數是必須傳遞給函數的參數。

可選參數是不能傳遞給函數的參數。 在 python 中,可選參數是具有默認值的參數

可選的位置參數(python 3.8)

def f(a=2, /):
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

需要的位置參數(python 3.8)

def f(a, /):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Error, positional only argument

可選的關鍵字參數

def f(*, a=1):
    pass


f()  # Allowed
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

必需的關鍵字參數

def f(*, a)
    pass


f()  # Error, argument required
f(1)  # Error, keyword only arguments
f(a=1)  # Allowed, it's a keyword argument

可選的位置和關鍵字參數

def f(a=1)
    pass


f()  # Allowed, argument is optional
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a=1, /):
    pass

需要的位置和關鍵字參數

def f(a):
    pass


f()  # Error, argument required
f(1)  # Allowed, it's a positional argument
f(a=1)  # Allowed, it's a keyword argument

# In fact this function is the same as
def f(*, a, /):
    pass

結論,一個參數可以是可選的或必需的,不能同時是兩者 它也可以是位置、關鍵字或同時是兩者

Python 3.8 引入了僅位置參數

def f(positional_argument, /, positional_or_keyword_argument, *, keyword_argument):
    pass

關鍵字參數只是具有默認值的位置參數。 您必須指定所有沒有默認值的參數。 換句話說,關鍵字參數只是“可選的”,因為如果沒有特別提供,它們將被設置為默認值。

可以按順序使用值或通過命名每個值來調用位置參數。 例如,以下所有三個都將以相同的方式工作:

def rectangleArea(width, height):
    return width * height

print(rectangleArea(1, 2))
print(rectangleArea(width=1, height=2))
print(rectangleArea(height=2, width=1))

在這里定義參數和參數會有所幫助。

  1. 參數:函數/方法定義指定自變量的命名實體。
  2. 參數:傳遞給函數的值。

例如,

def my_function(parameter_1, parameter_2):
    pass

my_function(argument_1, argument_2)

現在當你說位置參數時,你在談論參數,所以與函數定義無關。 您的示例中的widthheight是位置參數關鍵字參數(所謂的位置或關鍵字參數)。

您如何調用/將值傳遞給函數決定了它們是位置參數還是關鍵字參數

rectangleArea(1, 2) # positional arguments
rectangleArea(width=1, height=2) # keyword arguments

很多人不知道的是,您可以通過在參數列表中使用/來指定僅位置參數(來自此處的示例)。

def func(positional_only1, positional_only2, /, positional_or_keyword): ...

同樣,您也可以使用*字符來獲得僅關鍵字參數。

def func(positional_or_keyword, *, keyword_only1, keyword_only2): ...

最后,我們還有 var-positional 和 var-keyword(分別是 *args 和 **kwargs)。 這意味着,您可以將任意序列的位置參數或關鍵字參數傳遞給函數。

位置參數:以正確的位置順序傳遞給函數的參數。 下面的程序理解函數的位置參數

#positional arguments example
def combine(str1, str2):
#To join str1 and str2 with str3
    str3 = str1 + str2
    print(str3)

#call combine() and pass 2 strings
combine("Well", "come")   #positional arguments 

假設,我們首先通過 'come',然后通過 'well',那么結果將是 comewell。 此外,調用函數 3 字符串成為錯誤。

了解函數的關鍵字參數。

關鍵字參數是通過名稱標識參數的參數。

#keyword arguments example: 
def employee(name, Id):
    print("Employee Name: ", name)
    print("Employee Id  : ", Id)
#call employee() and pass 2 arguments
employee(name = "inban", Id = "pay001")
employee(Id = "pay002", name = "karthik") #we can change the order args.

我假設寬度和高度都是位置參數。 那為什么我們也可以用關鍵字參數語法來調用它呢?

為了防止這種情況,您可以使用僅位置參數:

def rectangleArea(width, height, /):
    return width * height

print rectangleArea(width=1, height=2)

錯誤消息如下:

TypeError: rectangleArea() 得到了一些作為關鍵字參數傳遞的僅位置參數:'width, height'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM