代码之家  ›  专栏  ›  技术社区  ›  martin

Python-函数的可选参数

  •  0
  • martin  · 技术社区  · 5 年前

    假设我要构建一个函数,它要么添加两个数字 a b ,或减去它们并加上第三个数字 c d . 我打算指定两个操作中的哪一个将由参数执行 sum ;如果这是 True ,执行第一个操作,如果 False ,然后执行第二个操作。我会这样写:

    def f(a, b, c, d, sum=True):
        if sum: return a+b
        else: return a-b+c-d
    

    f(1,2,3,4) 回报 3 ,而 f(1,2,3,4,sum=False) 回报 -2 c类 只有在 sum=False . 我该怎么做?我试过设置

    4 回复  |  直到 5 年前
        1
  •  3
  •   jfaccioni    5 年前

    使用默认值 None

    def f(a, b, c=None, d=None, sum=True):
        if sum:
            return a+b
        else: 
            return a-b+c-d
    

    这还允许您将错误检查逻辑添加到函数中-当sum为False时检查c和d是否存在:

    def f(a, b, c=None, d=None, sum=True):
        if sum: 
            return a+b
        else: 
            if None in (c, d):
                raise TypeError('f requires c and d args with parameter sum=False')
            return a-b+c-d
    
        2
  •  3
  •   Masklinn kmdreko    5 年前

    其他人已经给出了你可以做到的方法,但在更基本的层面上,我会问为什么这甚至是相同的方法?在我看来,这里有两种不同的方法,fúsum和f(或其他),一个取两个参数,另一个取4。

    或者如果这是一个更复杂的操作,而c和d只是附加的参数/属性,则可以将它们默认为空值,例如,对于加法,只需将它们默认为0:

    def f(a, b, c=0, d=0)
    

    a+b-0+0 如果不提供这些参数,则不会执行任何操作,结果将与a+b相同,甚至不需要条件或魔法标志。 很抱歉错过了第二个案子 - 把它误读为+

        3
  •  1
  •   Carlos Bettin    5 年前

    这解决了您的问题:

    def f(a, b, c=0, d=0, sum=True):
        if sum: return a+b
        else: return a-b+c-d
    
        4
  •  1
  •   Bonfire    5 年前

    def f(a, b, c=None, d=None, sum=True):
      if sum: return a + b
      else: return a - b + c - d
    

    但是,您可以进一步简化为:

    def f(a, b, c=0, d=0):
      return a - b + c - d
    

    sum 是真是假。