【问题标题】:How to call a function without the required arguments?如何在没有所需参数的情况下调用函数?
【发布时间】:2019-06-04 19:01:05
【问题描述】:

我想创建一个函数列表来设置先前定义的函数的默认值,以便以后我可以只用一个参数调用它们。问题是第一个参数是必需的,所以我得到一个错误。最pythonic的方法是什么?

def plus(num, a1):
    return num + a1

def div(num, a1):
    return num / a1;

acts = [plus(a1 = 3), div(a1 = 3), div(a1 = 2)]

num = 9
for act in acts:
    num = act(num)

我想要的行为是 num 为 9 -> 12 -> 4 -> 2

【问题讨论】:

    标签: python function instantiation


    【解决方案1】:

    使用funtools.partial,你需要翻转参数,因为partial按顺序应用它们:

    from functools import partial
    
    def plus(a1, num):
        return num + a1
    
    f = partial(plus, 3)
    

    例如:

    >>> f = partial(plus, 3)
    >>> f(10)
    13
    

    或者使用默认值:

    def div(num, a1=1):
        return num / a1
    
    fdiv = partial(div, a1=3)
    

    例如:

    >>> acts = [partial(plus, 3), partial(div,a1 = 3), partial(div, a1 = 2)]
    >>> num = 9
    >>> for act in acts:
    ...     num = act(num)
    ...
    >>> num
    2.0
    

    【讨论】:

    • Partial 也允许关键字。无需交换参数。
    • partial 接受关键字参数:partial(plus, a1=3) 将使用 plus 的原始定义。
    • 谢谢你们,你们这么快,我实际上是在扩展答案:)
    • 正是我所寻找的 ^-^ 这具有允许函数多个部分参数的额外好处。 tyty
    【解决方案2】:

    对于您的情况,您可以执行以下操作:

    def plus(num, a1):
        return num + a1
    
    def div(num, a1):
        return num / a1;
    
    acts = [(plus, 3), (div, 3), (div, 2)]
    
    num = 9
    for func, arg in acts:
        print(func(num, arg))
    

    它允许您将参数预先输入到列表中并进行迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      相关资源
      最近更新 更多