在函数定义中正确使用 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'))
我想写一个简单的函数来识别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'))