普通参数与关键字参数

2024-12-06 08:40:00
admin
原创
84
摘要:问题描述:name=value“关键字参数”与常规参数有何不同?难道所有参数都不能通过位置语法传递吗?解决方案 1:有两个相关的概念,都称为“关键字参数”。在调用方,也就是其他评论者提到的,你有能力通过名称指定一些函数参数。你必须在所有没有名称的参数(位置参数)之后提及它们,并且对于任何根本没有提及的参数,必...

问题描述:

name=value“关键字参数”与常规参数有何不同?难道所有参数都不能通过位置语法传递吗?


解决方案 1:

有两个相关的概念,都称为“关键字参数”。

在调用方,也就是其他评论者提到的,你有能力通过名称指定一些函数参数。你必须在所有没有名称的参数(位置参数)之后提及它们,并且对于任何根本没有提及的参数,必须有默认值。

另一个概念是在函数定义方面:您可以定义一个按名称接受参数的函数——您甚至不必指定这些名称是什么。这些是纯关键字参数,不能按位置传递。语法是

def my_function(arg1, arg2, **kwargs)

传递给此函数的任何关键字参数都将放入名为 的字典中kwargs。您可以在运行时检查此字典的键,如下所示:

def my_function(**kwargs):
    print str(kwargs)

my_function(a=12, b="abc")

{'a': 12, 'b': 'abc'}

解决方案 2:

最后一个语言特性中,区别非常重要。考虑以下函数:

def foo(*positional, **keywords):
    print "Positional:", positional
    print "Keywords:", keywords

*positional参数将存储传递给的所有位置参数foo(),对于您可以提供的数量没有限制。

>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}

**keywords参数将存储任何关键字参数:

>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}

当然,你可以同时使用两者:

>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}

这些功能很少使用,但有时它们非常有用,并且知道哪些参数是位置参数或关键字非常重要。

解决方案 3:

使用关键字参数与使用普通参数相同,只是顺序无关紧要。例如,下面的两个函数调用是相同的:

def foo(bar, baz):
    pass

foo(1, 2)
foo(baz=2, bar=1)

解决方案 4:

位置参数

它们前面没有关键字。顺序很重要!

func(1,2,3, "foo")

关键字参数

它们前面都有关键字。它们的顺序可以是任意的!

func(foo="bar", baz=5, hello=123)

func(baz=5, foo="bar", hello=123)

您还应该知道,如果您使用默认参数而忽略插入关键字,那么顺序就会很重要!

def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)

解决方案 5:

为函数形参分配实参值有两种方法,均可使用。

  1. 按位置。位置参数没有关键字,并且首先被分配。

  2. 按关键字。关键字参数具有关键字,并且在位置参数之后第二个被分配。

请注意,可以选择使用位置参数。

如果不使用位置参数,那么 - 是的 -所写的所有内容都会变成关键字参数。

调用函数时,您要决定使用位置参数、关键字参数还是两者的混合。您可以根据需要选择使用所有关键字参数。有些人不会做出这种选择,而是使用位置参数。

解决方案 6:

我很惊讶,似乎没有人指出可以传递一个满足形式参数的键控参数字典,就像这样。

>>> def func(a='a', b='b', c='c', **kwargs):
...    print 'a:%s, b:%s, c:%s' % (a, b, c)
... 
>>> func()
a:a, b:b, c:c
>>> func(**{'a' : 'z', 'b':'q', 'c':'v'})
a:z, b:q, c:v
>>> 

解决方案 7:

使用Python 3,您可以同时拥有必需和非必需的关键字参数:


可选:(为参数“b”定义的默认值)

def func1(a, *, b=42):
    ...
func1(value_for_a) # b is optional and will default to 42

必需(参数‘b’没有定义默认值):

def func2(a, *, b):
    ... 
func2(value_for_a, b=21) # b is set to 21 by the function call
func2(value_for_a) # ERROR: missing 1 required keyword-only argument: 'b'`

这会在您有许多相似的参数彼此相邻的情况下有所帮助,特别是当它们是同一类型时,在这种情况下,我更喜欢使用命名参数,或者如果参数属于一起,我会创建一个自定义类。

解决方案 8:

我很惊讶没有人提到你可以混合位置参数和关键字参数来做一些鬼鬼祟祟的事情,比如使用*args**kwargs(来自这个网站):

def test_var_kwargs(farg, **kwargs):
    print "formal arg:", farg
    for key in kwargs:
        print "another keyword arg: %s: %s" % (key, kwargs[key])

这使得您可以使用任意关键字参数,这些参数可能包含您不想预先定义的键。

解决方案 9:

我正在寻找一个使用类型注释的默认 kwargs 的示例:

def test_var_kwarg(a: str, b: str='B', c: str='', **kwargs) -> str:
     return ' '.join([a, b, c, str(kwargs)])

例子:

>>> print(test_var_kwarg('A', c='okay'))
A B okay {}
>>> d = {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', c='c', b='b', **d))
a b c {'f': 'F', 'g': 'G'}
>>> print(test_var_kwarg('a', 'b', 'c'))
a b c {}

解决方案 10:

只需补充/添加一种定义调用函数时未在关键字中分配的参数的默认值的方法:

def func(**keywargs):
if 'my_word' not in keywargs:
    word = 'default_msg'
else:
    word = keywargs['my_word']
return word

调用方式如下:

print(func())
print(func(my_word='love'))

你会得到:

default_msg
love

阅读有关Python 的更多信息:*argshttps : //www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3**kwargs

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1000  
  华为作为全球领先的信息与通信技术(ICT)解决方案提供商,其全球化项目的成功离不开高效的项目管理方法。其中,集成产品开发(IPD)流程是华为项目管理体系的核心组成部分。IPD流程不仅帮助华为在复杂的全球化项目中实现了资源的高效整合,还通过跨部门协作和持续优化,确保了项目的高质量交付。本文将通过具体案例,分析华为IPD流...
IPD测试流程   0  
  IPD(Integrated Product Development)是一种以跨职能团队协作为核心的产品开发流程,旨在通过整合资源、优化流程和提高决策效率,实现产品从概念到市场的快速、高效交付。IPD流程的核心思想是将传统的串行开发模式转变为并行开发模式,通过跨部门协作和早期风险识别,减少开发周期中的浪费和返工。这种方...
IPD流程分为几个阶段   0  
  华为的集成产品开发(IPD)流程是企业项目管理中的经典实践,其核心在于通过跨部门协同实现高效的产品开发。IPD流程强调从市场需求到产品交付的全生命周期管理,而跨部门沟通则是这一流程成功的关键。在华为的实践中,跨部门沟通不仅仅是信息的传递,更是团队协作、目标对齐和资源整合的重要手段。本文将深入探讨IPD流程中的跨部门沟通...
IPD项目管理咨询   0  
  IPD流程全称是集成产品开发(Integrated Product Development),它是一种以客户需求为导向、跨部门协作的产品开发模式。与传统产品开发模式相比,IPD强调在产品开发的早期阶段就整合市场、研发、制造、采购等多个部门的资源和能力,通过并行工程和协同工作来提升开发效率。IPD流程的核心在于打破部门壁...
IPD产品开发流程   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用