lambda函数能否在Python中返回一个已定义的函数?

时间:2017-03-25 23:49:31

标签: python lambda

我想从lambda函数返回一个比较函数,并根据输入的类型使用它。有办法吗?

def p12(p):
    f = lambda p: compare_nr if type(p) == int else compare_str
    return f
if __name__ == '__main__':
    cmp1 = p12(0)
    cmp1(2,3)
    cmp2 = p12('')
    cmp2('Mississippi','fall')

3 个答案:

答案 0 :(得分:1)

有一种方法可以在不使用lambdafunctools.singledispatch的情况下(在Python 3中)。有了这个,您可以创建single-dispatch generic function

  

一种通用函数调度形式,其中选择了实现   基于单个参数的类型

[强调我的]

它根据第一个参数的 type 向函数添加重载实现,幸运的是,p12函数只接受一个参数。

from functools import singledispatch

@singledispatch
def p12(p):
     ...

@p12.register(int)
def _(p):
     '''compare integers'''
     ...

@p12.register(str)
def _(p):
     '''compare strings'''
     ...
p12(0) # calls integer dispatch
p12('') # calls string dispatch

您仍然可以为其他Python类型添加更多候选函数来重载p12

答案 1 :(得分:0)

遇到的问题是我返回了实际的 lambda 函数,而不是定义的函数。

def p12(p):
    f = lambda p: compare_nr if type(p) == int else compare_str

    #here was the problem
    #return f
    return f(p)
if __name__ == '__main__':
    cmp1 = p12(0)
    cmp1(2,3)
    cmp2 = p12('')
    cmp2('Mississippi','fall')

答案 2 :(得分:0)

您也可以使用更高阶函数替换lambda并执行相同的操作。

def p12(p):
    if type(p) == int :
        return compare_nr
    else:
        return compare_str

if __name__ == '__main__':
    cmp1 = p12(0)
    cmp1(2,3)
    cmp2 = p12('')
    cmp2('Mississippi','fall')