位置参数与关键字参数
- 2025-01-08 08:50:00
- admin 原创
- 112
问题描述:
基于此
位置参数是一个后面不跟等号 (=) 和默认值的名称。
关键字参数后面跟着一个等号和一个给出其默认值的表达式。
def rectangleArea(width, height):
return width * height
print rectangleArea(width=1, height=2)
问题。我假设width
和height
都是位置参数。那么为什么我们也可以用关键字参数语法来调用它?
解决方案 1:
您引用的这段文字似乎混淆了两件完全不同的事情:
位置参数和关键字参数是函数调用的一个特性(参见Python 参考部分
5.3.4 Calls
)。默认值是函数定义的一个特性,如第节所述
7.6 Function definitions
我怀疑编写该课程的人并不完全熟悉 Python :-) 因此,您提供的链接质量不太好。
在调用函数时,您使用了“关键字参数”功能(其中参数被命名,而不是依赖于其位置)。如果没有该功能,则值将仅根据顺序绑定到名称。因此,在此示例中,以下两个调用是等效的:
def process_a_and_b(a, b):
blah_blah_blah()
process_a_and_b(1, 2)
process_a_and_b(b=2, a=1)
进一步举例来说,参考以下定义和调用:
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.
解决方案 2:
位置参数、关键字参数、必需参数和可选参数经常被混淆。位置参数不同于必需参数,关键字参数不同于可选参数。
位置(仅限)参数与调用中提供的位置参数绑定,即按位置绑定。它们是在Python 3.8中引入的。
关键字(仅)参数绑定到调用中提供的关键字参数,即按名称绑定。
位置或关键字参数与调用中提供的位置参数或关键字参数绑定,即按位置或按名称绑定。
必需参数与调用中提供的参数绑定。
可选参数与定义中提供的默认参数绑定。
这是声明参数的 Python 语法:
def f(positional_parameter, /, positional_or_keyword_parameter, *, keyword_parameter):
pass
必需的位置参数(自 Python 3.8 起):
def f(a, /):
pass
f() # error, argument is required
f(1) # allowed, positional argument
f(a=1) # error, keyword argument
可选的位置参数(自 Python 3.8 起):
def f(a=2, /):
pass
f() # allowed, argument is optional
f(1) # allowed, positional argument
f(a=1) # error, keyword argument
必填关键字参数:
def f(*, a):
pass
f() # error, argument is required
f(1) # error, positional argument
f(a=1) # allowed, keyword argument
可选的关键字参数:
def f(*, a=1):
pass
f() # allowed, argument is optional
f(1) # error, positional argument
f(a=1) # allowed, keyword argument
必需的位置或关键字参数:
def f(a):
pass
f() # error, argument is required
f(1) # allowed, positional argument
f(a=1) # allowed, keyword argument
# In fact that function is the same as this one.
def f(/, a, *):
pass
可选的位置或关键字参数:
def f(a=1):
pass
f() # allowed, argument is optional
f(1) # allowed, positional argument
f(a=1) # allowed, keyword argument
# In fact that function is the same as this one.
def f(/, a=1, *):
pass
结论。——参数可以是必需的或可选的,但不能同时是两者。它也可以是位置参数、关键字参数,或者同时是两者。
解决方案 3:
关键字参数只是具有默认值的位置参数。您必须指定所有没有默认值的参数。换句话说,关键字参数只是“可选的”,因为如果没有特别提供,它们将被设置为默认值。
解决方案 4:
首先,参数是函数/方法定义中指定参数的命名实体。参数是传递给函数的值。
例如,
def rectangle_area(height, width):
pass
rectangle_area(argument_1, argument_2)
height, width
是函数参数,argument_1, argument_2
是传递给函数的参数。当您说位置参数时,您指的是参数,这与函数定义无关。width
和height
(在 Python 中默认)是位置参数或关键字参数(所谓的位置或关键字参数)。因此,您可以通过位置或关键字传递参数。
如何调用/将值传递给函数决定了它们是位置参数还是关键字参数。
对于该函数,rectangle_area
我们可以像这样同样地调用它:
rectangle_area(1, 2) # positional arguments
rectangle_area(width=2, height=1) # keyword arguments
在第一次调用中,我们按位置传递值:1 传递给高度,2 传递给宽度。也就是说,当您说
1, 2
我们的意思是高度为 1 而宽度为 2 时,Python 会根据传递它们的位置推断(即,在函数定义中,第一个参数是height
,第二个参数是width
)。在第二个调用中,我们通过关键字传递值。我们向 Python 暗示我们将参数传递给哪个参数。在第二个示例中,我们翻转了参数的顺序,但我们告诉 Python 高度仍为 1,宽度仍为 2。两个调用的结果完全相同。
仅限位置和仅限关键字
很多人不知道的是,你可以使用参数列表中的来指定位置专用参数/
(示例来自此处)。
def func(positional_only1, positional_only2, /, positional_or_keyword): ...
类似地,您也可以使用字符来获得仅关键字参数*
。
def func(positional_or_keyword, *, keyword_only1, keyword_only2): ...
最后,我们还有 var-positional 和 var-keyword(又名 args 和 *kwargs)。这意味着,你可以将任意序列的位置参数或关键字参数传递给函数。
解决方案 5:
这里有一些额外的信息来补充@Nazime Lakehal 的精彩答案。
可选位置参数后面不能跟必需位置参数或位置或关键字参数:
# SyntaxError.
def f(a=1, b, /):
pass
# SyntaxError.
def f(a=1, /, b):
pass
可选的位置或关键字参数后面不能跟必需的位置或关键字参数:
# SyntaxError.
def f(a=1, b):
pass
为了绑定可选的位置参数,必须绑定所有先前的可选位置参数,从而使它们全部成为必需参数。这可能是位置参数与必需参数混淆的根源:
def f(a=1, b=2, /):
pass
f(1, 0)
对于绑定可选的关键字参数或位置或关键字参数,所有其他可选的关键字参数和位置或关键字参数不必绑定。这可能是关键字参数与可选参数混淆的起源:
def f(c=3, *, a=1, b=2):
pass
f(b=0)
def f(a=1, b=2, *, c=3):
pass
f(b=0)
解决方案 6:
位置参数可以按顺序使用值来调用,也可以通过命名每个值来调用。例如,以下三种方式的工作方式相同:
def rectangleArea(width, height):
return width * height
print(rectangleArea(1, 2))
print(rectangleArea(width=1, height=2))
print(rectangleArea(height=2, width=1))
解决方案 7:
位置参数:按正确的位置顺序传递给函数的参数。下面的程序理解函数的位置参数
#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 字符串会出现错误。
解决方案 8:
了解函数的关键字参数。
关键字参数是通过名称来标识参数的参数。
#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.
解决方案 9:
我假设 width 和 height 都是位置参数。那么为什么我们也可以使用关键字参数语法来调用它呢?
为了防止这种情况,您可以使用位置专用参数:
def rectangleArea(width, height, /):
return width * height
print rectangleArea(width=1, height=2)
错误信息如下:
TypeError: rectangleArea() 将一些仅位置参数作为关键字参数传递:“width, height”