在函数定义中正确使用 lambda

Proper use of lambda in function definition

我想写一个简单的函数来识别palindromes:

>>> def palindrome(s):
    return s == s[::-1]

它工作正常,但区分大小写,我可以解决这个问题:

>>> def palindrome(s):
    return s.lower() == s[::-1].lower()

>>> palindrome('Aba')
True

但我认为它不是很优雅。我尝试使用 lambda 表达式将输入小写,但我做错了,不知道如何解决:

>>> def palindrome(lambda s : s.lower()):
    return s == s[::-1]
SyntaxError: invalid syntax

只需调用 lower 一次,将 s 重新分配给该值并忘记 lambda:

def palindrome(s):
    s = s.lower()
    return s == s[::-1]

您不能使用 lambda 表达式来描述应对输入参数执行的操作(但是您可以使用 lambda 来定义默认值)。你可以做两件事:

  • 在函数头部定义一个函数:

    def palindrome(s):
        s = s.lower()
        return s == s[::-1]
    
  • 使用 装饰器:

    def caseinsensitive(f):
        def helper(s):
            s = s.lower()
            return f(s)
        return helper
    

    然后将您的 palindrome 定义为:

    @caseinsensitive
    def palindrome(s):
        return s == s[::-1]
    

    在这里您可以重复使用 @caseinsensitive 来定义所有执行此操作的函数作为第一步。

这不是很地道python,但您正在寻找的是这样的东西:

def palindrome(s):
    return (lambda x: x == x[::-1])(s.lower())

也就是说,您定义一个 lambda 函数并立即调用它,将 s.lower() 绑定到 x

def palindrome(s):
    s = s.lower()
    return s == s[::-1]

这是一个非常简单易懂的答案,100% 正确而且很好。 但是如果你想使用 lambda 表达式,你必须考虑如何、什么、为什么等等,所以让我们进入 FUNCTIONAL PROGRAMMING.

的神奇世界

如果您不知道 lambda 表达式是什么,基本上当您输入单词 lambda 时,它会指定您稍后将给它一些值,例如输入 lambda a 表示您将为其提供 1 个值(参数),键入 lambda a, b 明确表示您将为其提供 2 个值(参数)。现在 "what does even this lambda word mean" 的整个事情都完成了,让我们更深入地了解 FUNCTIONAL PROGRAMMING 的神奇世界。

所以现在当你告诉 python 它将必须等待一段时间(或者可能根本没有时间)以获得该值以便它可以对其执行一些魔法时,你可以告诉它该做什么例如

some_var = lambda some_string: some_string.lower()

所以现在这意味着它将获得一些价值,我们希望它是某种字符串,我们可以并将它保存在 some_var 中,仅出于 PHP programmers 和我们的原因 (我)知道。

接下来真的很简单,我们只是return检查它是否是回文

return some_var == some_var[::-1]

让我们弄些胶水,用我们早先的东西制作这个 lambda 野兽

def palindrome():
    some_var = lambda some_string : some_string.lower()
    return some_var == some_var[::-1]

正如你所看到的,我们不再需要声明我们在方法中使用了一些微不足道的s,因此我们只需按DEL,我们就可以进入[=的美丽世界17=].

那么让我们尝试调用这个函数,但是问题是如何调用呢?

palindrome("superpalindrome") == False

虽然它没有编译,因为它认为我们试图给回文方法某种参数,而定义根本没有 none。所以函数的正确调用应该是

palindrome()("superpalindrome") == False

简而言之,这很神奇,lambda 表达式实际上在大多数情况下在时间使用方面更差,因此您应该坚持以 OOP 方式甚至其他 pythonic 方式做事。如果你想使用 lambda 表达式,你应该尝试切换到 Haskell(我强烈建议)或 Scala。如果您有任何其他问题,请随时问我,我喜欢谈论 Haskell。或者 FUNCTIONAL PROGRAMMING.

更加简化的完整答案

def palindrome():
    return lambda some_str : some_str.lower() == some_str.lower()[::-1]

method = palindrome()

print(method("cococ"))

也许你想要这个:

(lambda lstr : lstr == lstr[::-1])((lambda x : x.lower())('abA'))