Python:使用方法的高阶函数

时间:2015-06-03 02:41:40

标签: python higher-order-functions

在Python中,无论如何都要将方法传递给更高阶的函数,就像传递常规函数一样?

例如,让我们说我有一个字符串," str",并且根据某些条件," cond",我想应用一些任意方法,& #34; meth",到字符串并返回它。在代码中:

def func(str, meth, cond):
    ...
    if cond:
        str.meth()
    ...

现在,我知道上述情况并不奏效。我也知道我可以这样写:

def func(str, meth, cond):
    ...
    if cond:
        str = meth
    ...

并将我想要执行的对象和方法传递给func,如下所示:func(str,str.capitalize(),cond)。上述问题是:

  1. 上述代码并未明确该功能的用意。
  2. 例如,如果我想要修改" str"无论如何在应用该方法之前,我最终得到的结果不正确。考虑:

    def func(str, meth, cond):
        ...
        str += "a"
        ...
        if cond:
            str = meth
        ...
    

    无法正常使用。

  3. 所以,回到开头:无论如何要完成我想要的东西吗?或者我是从错误的方向接近这个?

4 个答案:

答案 0 :(得分:3)

您可以将方法传递给更高阶的函数,就像使用任何函数一样,只需将其作为object.method传递:

class Foo(object):
    def upper(self, s):
        return s.upper()

def func(s, method, cond):
    if cond:
        return method(s)
    else:
        return s

obj = Foo()
s = 'hello world'

print(func(s, obj.upper, 'hello' in s))   
print(func(s, obj.upper, 'goodbye' in s))

结果:

HELLO WORLD
hello world

或者,如果你可以尝试:

def func(s, method, cond):
    if cond:
        return method()
    else:
        return s

s = 'hello world'

print(func(s, s.upper, 'hello' in s))
print(func(s, s.upper, 'goodbye' in s))

但是,正如评论中指出的那样,如果在函数内部有s = s + 'a'语句,则第二种方法将不起作用,因为您只是将局部变量s绑定到一个新的字符串,而method仍然绑定到最初传递给函数的字符串的upper方法。

答案 1 :(得分:1)

我认为你将mat作为无界方法传递给你的是什么,所以它可以动态地与另一个对象联系起来。

>>> class C(object):
...     def foo(self):
...             print self
... 
>>> C.foo
<unbound method C.foo>
>>> C().foo
<bound method C.foo of <__main__.C object at 0xb708216c>>
>>> def func(obj, meth):
...     meth(obj)
... 
>>> c = C()
>>> func(c, C.foo)
<__main__.C object at 0xb70822ac>
>>> c
<__main__.C object at 0xb70822ac>

你可以认为一个无限制的方法是一个必须将一个对象作为其第一个参数的常规方法

答案 2 :(得分:0)

这不允许您按照自己的意愿调用函数,但它非常接近,所以它可能解决了您的问题。

def func(str, meth, cond):
    if cond:
        str = getattr(str, meth)()
    return str

print func("a", "capitalize", True)
print func("a", "capitalize", False)

答案 3 :(得分:0)

不太确定你在问什么,但你可以通过以下功能。

def func(str, meth, cond):
    ...
    ...
    if cond:
        return meth(str)
    ...

然后像这样运行:(例如小写)

func("ABC", str.lower, True)

应该返回"abc"