2011-08-16 125 views
2

我聽說可以使用lambda替換if語句。Lambda而不是「if」語句

這是可能的Python嗎?如果是這樣,怎麼樣?

+5

如果您以其他語言提供了參考或示例,這將有所幫助。 – agf

回答

3

像其他人一樣,我不確定你在問什麼,但我願意猜測。

我有時會使用lambda表達式來處理API調用的結果。

說例如一個API調用結果的元素應該是一個數字字符串,我希望作爲一個整數,但偶爾它會返回別的東西。

你可以定義一個lambda將一個字符串轉換成整數,如果它是由數字:

lambda x: x and x.isdigit() and int(x) or None 

這避免了if聲明,但lambda不是因爲,你可以做同樣的功能:

def f(x): 
    return x and x.isdigit() and int(x) or None 

更新

bug更少的黑客,保羅·麥圭爾的禮貌:

lambda x: int(x) if x and x.isdigit() else None 

即作爲int('0')返回False等效拉姆達可以通過返回None當你想要0

+0

這只是在Python中沒有包含三進制運算符的舊解決方法,現代的方式是'int(x)if x and x.isdigit()else None',雖然這意味着你不想轉換'0.0'。 – agf

+1

正如@agf指出的那樣,如果其中一個術語成功評估爲一個Python被視爲布爾型False的值,則此舊解決方法一直存在做錯事情的風險。如果你打算指示某人使用這種黑客攻擊,至少應該使用更少的漏洞攻擊:'lambda x:int(x)if x and x.isdigit()else None'。現在,當x爲'0'時,您不會感到驚訝。 – PaulMcG

+0

如果x是「-1」,該怎麼辦? x.isdigit()也在這裏返回False。 – PaulMcG

3

我可能是嚴重偏離,但我想這意味着類似:

filter(lambda x: x > 0, list_of_values) 

會回到你的元素從list_of_values具有大於0

0
if condition: 
    do_stuff() 
else: 
    dont() 

值爲

(lambda x: do_stuff() if x else dont())(condition) 

但目前還不清楚你在找什麼。

請注意,這是而不是if聲明 - 這是一個ternary operation。在Python中,它們都使用if這個詞。在C#中查看例如Lambda "if" statement?

+0

好吧,你實際上使用if語句:) – Ant

+2

它不是'if'語句,它是一個三元運算符。當我搜索這個主題時,這就是結果使用的結果(例如C#中)。 Python的三元運算符恰好使用「if」這個詞。 – agf

5

也許你是指這樣的東西(Lambda calculus)?

If = lambda test, x, y: test(x, y) 
True = lambda x, y: x 
False = lambda x, y: y 

,你可以使用像...

# I guess you have to convert them sometimes... oh well 
C = lambda b: [False, True][b] 

x = If(C(2 > 3), "Greater", "Less") 
print(x) 
# "Less" 

但現在事情開始土崩瓦解......

If(C(2 > 3), print("Greater"), print("Less")) 
# Invalid syntax unless you use 
    #  from __future__ import print_function 
# And if you do, it prints both! 
# (Because python has eager evaluation) 

# So we could do 
True = lambda x, y: x() 
False = lambda x, y: y() 

# And then 
If(C(2 > 3), lambda:print("Greater"), lambda:print("Less")) 
# "Less" 

所以,不那麼漂亮,還是有用的。但它的工作。

+0

恩,這是如果你把逗號之間的lambda表達式的參數?並且可能展示一個如何使用它的例子? (爲了我的利益,如果沒有其他人的話) – agf

+0

哦,是的。對於那個很抱歉。 – Owen

+0

一個例子是一個好主意。我加了一些。 – Owen

1

下面是一個小竅門,通過Smalltalk的 語言核心的啓發,不if語句也不三元 運營商使用,但因爲工作會讓你大吃一驚有條件執行 機制。 :-)

#!/usr/bin/env python 
class ATrue: 
    def ifThen(self,iftrue): iftrue() 
    def ifThenElse(self,iftrue,iffalse): return iftrue() 
    def andThen(self,other): return other() 
    def orElse(self,other): return self 

class AFalse: 
    def ifThen(self,iftrue): pass 
    def ifThenElse(self,iftrue,iffalse): return iffalse() 
    def andThen(self,other): return self 
    def orElse(self,other): return other() 

def echo(x): print x 

if __name__=='__main__': 
    T = ATrue() 
    F = AFalse() 

    x = T     # True 
    y = T.andThen(lambda: F) # True and False 
    z = T.orElse(lambda: F) # True or False 

    x.ifThenElse(lambda: echo("x is True"), lambda: echo("x if False")) 
    y.ifThenElse(lambda: echo("y is True"), lambda: echo("y if False")) 
    z.ifThenElse(lambda: echo("z is True"), lambda: echo("z if False")) 

更新:整理一些符號,以避免混淆,並明確指出。並添加了代碼以顯示如何對邏輯運算符執行快捷評估。