位置参数与关键字参数

2025-01-08 08:50:00
admin
原创
112
摘要:问题描述:基于此位置参数是一个后面不跟等号 (=) 和默认值的名称。关键字参数后面跟着一个等号和一个给出其默认值的表达式。def rectangleArea(width, height): return width * height print rectangleArea(width=1,...

问题描述:

基于此

位置参数是一个后面不跟等号 (=) 和默认值的名称。

关键字参数后面跟着一个等号和一个给出其默认值的表达式。

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

    
print rectangleArea(width=1, height=2)

问题。我假设widthheight都是位置参数。那么为什么我们也可以用关键字参数语法来调用它?


解决方案 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是传递给函数的参数。当您说位置参数时,您指的是参数,这与函数定义无关。widthheight(在 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”

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1579  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1355  
  信创产品在政府采购中的占比分析随着信息技术的飞速发展以及国家对信息安全重视程度的不断提高,信创产业应运而生并迅速崛起。信创,即信息技术应用创新,旨在实现信息技术领域的自主可控,减少对国外技术的依赖,保障国家信息安全。政府采购作为推动信创产业发展的重要力量,其对信创产品的采购占比情况备受关注。这不仅关系到信创产业的发展前...
信创和国产化的区别   8  
  信创,即信息技术应用创新产业,旨在实现信息技术领域的自主可控,摆脱对国外技术的依赖。近年来,国货国用信创发展势头迅猛,在诸多领域取得了显著成果。这一发展趋势对科技创新产生了深远的推动作用,不仅提升了我国在信息技术领域的自主创新能力,还为经济社会的数字化转型提供了坚实支撑。信创推动核心技术突破信创产业的发展促使企业和科研...
信创工作   9  
  信创技术,即信息技术应用创新产业,旨在实现信息技术领域的自主可控与安全可靠。近年来,信创技术发展迅猛,对中小企业产生了深远的影响,带来了诸多不可忽视的价值。在数字化转型的浪潮中,中小企业面临着激烈的市场竞争和复杂多变的环境,信创技术的出现为它们提供了新的发展机遇和支撑。信创技术对中小企业的影响技术架构变革信创技术促使中...
信创国产化   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用