位置参数与关键字参数

2025-01-08 08:50:00
admin
原创
140
摘要:问题描述:基于此位置参数是一个后面不跟等号 (=) 和默认值的名称。关键字参数后面跟着一个等号和一个给出其默认值的表达式。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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2974  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1836  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   47  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   47  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   48  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用