Python函数的默认值作为函数参数是什么?

4

假设我有以下函数:

def myF(a, b):
    return a*b-2*b

假设我想要给b设置一个默认值为a-1

如果我这样写:

def myF(a, b=a-1):
    return a*b-2*b

我遇到了错误信息:

NameError: name 'a' is not defined

我可以使用以下代码:
def myF(a, b):
    return a*b-2*b

def myDefaultF(a):
    return myF(a, a-1)

我想要一个默认值为myDefaultFmyF,但我不喜欢它。

如何避免myDefaultF,并且在没有错误的情况下让bmyF具有默认值a-1


1
有趣的是,你可以使用JS和R中的函数来实现这一点。 - qwr
3个回答

8
您可以执行以下操作:
def myF(a, b=None):
    if b is None:
        b = a - 1
    return a * b - 2 * b

3

如果您需要让b的值成为a的函数,但是您需要该函数发生变化,可以将b的默认值设置为lambda函数,然后在函数块中检查b是否可调用。

def myF(a, b=lambda a: a-1):
    if callable(b):
        b = b(a)
    return a * b - 2 * b

这样可以让您随时设置不同的函数来处理元素b
# pass b as an integer
myF(1, 1)
# returns: -1


# use default function for b
myF(4)
# returns: 6


# set b to be 2*a + 1
myF(3, lambda a: 2*a+1)
# returns: 7

谢谢你的回答!我只知道一些关于“lambda”的东西。感谢你提供的额外信息! - Kώστας Κούδας
lambda不重要,重要的是检测b是否为可调用函数。 - qwr

0
你可以使用try-except语句块:
def myF(a, b=None):
  try:
    return a*b-2*b
  except:
    return a*(a-1)-2*(a-1)

2
这不是一个好的做法,因为它滥用了异常处理系统。此外,一个宽泛的 except 子句会捕获并默默地抑制其他错误,比如将非数字值传递给 b。来自 Python 之禅:_"显式优于隐式"_。 - Selcuk
谢谢你的回答!我刚开始学Python。我不知道tryexcept。感谢你提供的额外信息! - Kώστας Κούδας

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接