Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将参数作为默认值传递?_Python_Function_Named Parameters - Fatal编程技术网

Python 如何将参数作为默认值传递?

Python 如何将参数作为默认值传递?,python,function,named-parameters,Python,Function,Named Parameters,我想使用参数的默认值,但在调用中包括其名称。我认为将参数设置为“无”可以做到这一点,但事实并非如此 例如: def a(num=3): print(num) a(num=None) #returns "None", not "3" like I want it to. 在调用中包含命名参数时,如何使用该参数的默认值?(这可能吗?) 为了解释为什么我想做这样的事情(因为这可能是我总体编码风格中的一个问题): 我经常有这样的代码 def add(num, numToAdd=1):

我想使用参数的默认值,但在调用中包括其名称。我认为将参数设置为“无”可以做到这一点,但事实并非如此

例如:

def a(num=3):
    print(num)

a(num=None) #returns "None", not "3" like I want it to.
在调用中包含命名参数时,如何使用该参数的默认值?(这可能吗?)

为了解释为什么我想做这样的事情(因为这可能是我总体编码风格中的一个问题):

我经常有这样的代码

def add(num, numToAdd=1):
    return num+numToAdd

def addTwice(num, numToAdd=None):
    for i in range(2):
        num=add(num, numToAdd=numToAdd)
    return num

addTwice(3) #throws an error instead of returning 5
我想让
addtweep
numToAdd
始终使用默认的
add
numToAdd
,无论它是什么

原因:也许在代码的后面,我意识到在执行
add
时,添加2作为默认值比添加1更好

所以我把它改成

def add(num, numToAdd=2):
        return num+numToAdd
但是,这不会有任何帮助,除非我总是可以在
addtweeps
中指定在收到默认值时使用默认值

这就是基本原理


换句话说:我让一个函数(第一个函数)调用另一个函数(第二个函数),如果第一个函数必须使用默认值,我希望它默认为第二个函数的默认值。这样,我只需更改第二个函数(不是每个调用它的函数)的默认值就可以更改默认功能。

不,你不能:这在术语上是矛盾的。当且仅当未在参数列表中提供值时,才会使用默认值。如果您提供一个值,那么默认值不能在例程中使用

def a(num=None):
    if num is None: 
       num = 3
    print(num)

a(num=None)  # prints 3
a() # prints 3
。。。我想。。。也许吧

或者解释默认参数

def a(num=3):
   print(num)

a(num=None) # prints None
a() # prints 3

没有内置支持显式使用参数的默认值。如果不想将参数保留在调用站点,则必须非常手动地检索默认值:

import inspect

a(num=inspect.signature(a).parameters['num'].default)
在大多数情况下,这是不值得的。

关于如何做到这一点有一个详细的说明(如果您确定我要求的默认获取功能确实是您想要的)。但是,我只是想指出,在实践中,我相信我试图实现的目标通常是通过全局变量来实现的

也就是说,我想做的事情通常是:

DEFAULT_NUM_TO_ADD = 1
def add(num, numToAdd=DEFAULT_NUM_TO_ADD):
    return num+numToAdd

def addTwice(num, numToAdd=DEFAULT_NUM_TO_ADD):
    for i in range(2):
        num=add(num, numToAdd=numToAdd)
    return num

addTwice(3) # returns 5

这允许我快速更改默认值,两个函数使用相同的默认值。这是明确和非常清楚的;它是pythonic。

如果包含默认参数,则无需在函数调用中提及它。只需执行
a()
。它不打印任何内容,因为您显式传递的参数覆盖了默认值。为什么要传递值而不使用它?我不明白为什么这会被严重否决。这是一个合理的、写得很好的问题。@michaelpri请看我对为什么要这样做的解释。。。你是对的,但我不想为默认参数的不同组合编写每个显式案例。是的,这就是我定义大多数函数的方式。。。这只是一个麻烦,尤其是有很多参数。