在函数定义中正确使用lambda

时间:2015-06-07 01:23:10

标签: python string lambda python-3.4

我想写一个识别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

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:6)

您不能使用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来定义执行此操作的所有功能。

答案 2 :(得分:5)

这不是真正惯用的python,但你要找的是这样的:

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

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

答案 3 :(得分:1)

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

这非常简单,易于使用和理解答案,这是100%正确和良好。 但是如果你想使用lambda表达式,你必须考虑如何以及如何以及为什么以及为什么这样的东西让我们进入FUNCTIONAL PROGRAMMING的神奇世界。

如果您不知道lambda表达式是什么,基本上当您输入单词lambda时,它指定您稍后会给它一些值,例如键入lambda a意味着你将为它提供1个值(参数),明确地键入lambda a, b意味着你将使用2个值(参数)来提供它。所以现在,即使这个“lambda词语意味着什么”的整个事情已经完成,让我们更深入地了解FUNCTIONAL PROGRAMMING的神奇世界。

所以现在当你告诉python它将不得不等待一段时间(或者根本没有时间)这个值,所以它可以做一些魔术,你可以告诉它如何处理它,例如

some_var = lambda some_string: some_string.lower()

所以现在这意味着它会获得一些价值,我们希望它是某种字符串,我们可以并且只会some_var将其保留在PHP programmersreturn some_var == some_var[::-1] 和我们(我)知道。

接下来真的很直接我们只是回来检查它是否是回文

lambda

让我们从我们之前的事物中获得一些胶水并构建这个def palindrome(): some_var = lambda some_string : some_string.lower() return some_var == some_var[::-1] 野兽

s

正如您所看到的,我们不再需要声明我们在方法中使用了一些微不足道的DEL,因此我们只需按FUNCTIONAL PROGRAMMING即可进入{{1}的美丽世界}。

所以让我们试着调用这个函数,但这个问题提出了如何做到这一点?

palindrome("superpalindrome") == False

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

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"))

答案 4 :(得分:0)

也许你想要这个:

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