【问题标题】:Proper use of lambda in function definition在函数定义中正确使用 lambda
【发布时间】:2015-06-07 01:23:10
【问题描述】:

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

【问题讨论】:

  • 不不,这不是lambda 或参数的工作方式。为什么不喜欢第二种方式呢?
  • 您不能在参数定义中使用 lambda。
  • 因为我会将字符串小写两次,但使用 lambda,它会从一开始就修复。

标签: python string lambda python-3.4


【解决方案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 来定义所有执行此操作的函数作为第一步。

【讨论】:

  • 很好,这是我问题的答案。它根本无法按照我尝试的方式完成。谢谢。
【解决方案2】:

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

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

【讨论】:

  • 你的意思是lambda不能在这里使用?
  • @schmutter,你为什么想要?您只需调用 lower 一次并返回。
  • 为了简洁和少写一行。
  • 您还发现lambda s : s.lower() 的字符数比s = s.lower() 多?
  • 感谢 Padraic,感谢您的回答。原来我对在输入参数上使用 lambda 有一个误解。显然不能从一开始就完成。
【解决方案3】:

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

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

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

【讨论】:

  • 非常聪明的答案!尽管 Padraic 的建议更具可读性,但这正是提问者所要寻找的。​​span>
【解决方案4】:
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 programmers 和我们(我)知道。

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

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,我们就可以进入FUNCTIONAL PROGRAMMING 的美丽世界。

所以让我们尝试调用这个函数,但问题是如何做到这一点?

palindrome("superpalindrome") == False

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

palindrome()("superpalindrome") == False

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

更加简化的完整答案

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

method = palindrome()

print(method("cococ"))

【讨论】:

    【解决方案5】:

    也许你想要这个:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多