簡體   English   中英

在函數定義中正確使用lambda

[英]Proper use of lambda in function definition

我想寫一個識別回文的簡單函數:

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

只需調用一次,將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個值(參數)來提供它。 所以現在,“甚至這個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方式做事,甚至用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'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM