【问题标题】:How to associate parameters with a function object?如何将参数与函数对象关联?
【发布时间】:2011-03-18 05:38:36
【问题描述】:

我是 python 新手,我发现“偶函数是对象”这件事真的很酷,所以我只是在 PyShell 中玩函数。以下代码运行良好。

def add_num(a,b):
  c = a + b
  return c

x = add_num
x(5,2)

我想知道我们在分配 x = add_num 时是否可以存储参数。因此,每当我们调用 x() 时,它都会添加 a 和 b(这里是 5 和 2)并返回结果。 x = add_num(5,2) 不起作用,因为 add_num(5,2) 实际调用函数并返回 7。

【问题讨论】:

  • 你刚刚发明了“闭包”。谷歌“python lambda”比你想知道的更多...... :-)
  • @samurailawngnome 只是出于好奇。
  • 当你存储一个部分时,这会变得有趣,如下所述,但只有两个参数之一

标签: python function object


【解决方案1】:

functools 模块 (documentation) 中的 partial 函数可以创建一个新的函数对象,其行为方式如您所愿。

import functools

def add_num(a, b):
    c = a + b
    return c

x = functools.partial(add_num, 5, 2)
print(x()) # prints 7

您也可以只指定一个参数,在调用“部分”函数时提供另一个参数:

y = functools.partial(add_num, 5)
print(y(6)) # prints 11

它也适用于关键字参数:

z = functools.partial(add_num, b=5)
print(z(10)) # prints 15

根据 cmets 中的建议,另一种选择是使用 lambda 表达式 (documentation),它只是创建新函数的简写。

f = lambda: add_num(25, 30)
print(f()) # prints 55

# the lambda definition is equivilent to
def f():
    return add_num(25, 30)

也可以像您在问题中显示的那样修改原始功能,但在大多数情况下,这会被认为是不好的风格。如果你真的想这样做,你可以通过将参数添加为函数对象的.func_defaults 属性来实现(在旧版本的 Python 中称为 .__defaults__documentation)。

add_num.func_defaults = (1, 2)
print(add_num()) # prints 3

【讨论】:

    【解决方案2】:
    def gen_add(x, y):
      def add():
        return x + y
      return add
    
    fn =gen_add(2,4)
    print fn
    print fn()
    
    fn1 = gen_add(5,4)
    print fn1()
    

    打印:

    <function add at 0x1004d4398>
    6
    9
    

    【讨论】:

      【解决方案3】:
      import functools
      x = functools.partial(add_num, 5, 2)
      print x()
      

      【讨论】:

        【解决方案4】:
        import functools
        addnum = lambda x,y:x+y
        print addnum(5,2) #print 7
        z = functools.partial(addnum,5,2)
        print z() #print 7
        

        【讨论】:

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