2009-10-18 12 views
189

W python 2.6, chcę zrobić:Czy istnieje sposób, aby wykonać "jeśli" w lambda Pythona

f = lambda x: if x==2 print x else raise Exception() 
f(2) #should print "2" 
f(3) #should throw an exception 

To wyraźnie nie jest składnia. Czy jest możliwe wykonanie if w lambda, a jeśli tak, to jak to zrobić?

dzięki

+1

Nie możesz wydrukuj lub podnieś w lambda. Lambda to tylko funkcje, możesz zamiast tego używać zamiast tego funkcji. –

+10

Nie zgadzam się z tobą. Potrzebuję 4 różnych, bardzo krótkich funkcji, takich jak powyższa, które należy umieścić na liście/słowniku, aby móc je sprawdzać i wybierać te, które będą używane w każdej iteracji. Zamiast wielu linii kodu tylko inicjały, przed samą iteracją mogę sprowadzić ją do zaledwie 4 linii kodu init. Im mniej tym lepiej ... – Guy

+5

4 linie kodu nie są godnym pochwały rozwiązaniem, gdy inne osoby muszą czytać, interpretować, rozumieć i utrzymywać kod.Co więcej, problem "wydrukuj/podnieś" w przykładzie pokazuje to, czego nie można i nie powinno się robić w lambdach. –

Odpowiedz

398

Składnia szukasz:

lambda x: True if x % 2 == 0 else False 

Ale nie można używać print lub raise w lambda.

+21

w python 3, możesz użyć print – recursive

+37

f = lambda x: x% 2 == 0 również będzie działać. – unutbu

+8

Jasne, ale pytanie brzmiało: "jak używać' if' w lambda? " nie "jaki jest najlepszy sposób napisania lambda, który zwraca True, jeśli liczba jest równa?" –

13

lambda w Pythonie są dość restrykcyjne w odniesieniu do tego, co masz prawo do użycia. W szczególności nie możesz mieć w swoim ciele żadnych słów kluczowych (z wyjątkiem operatorów takich jak and, not, or itd.).

Tak, nie ma sposobu, można użyć lambda za przykład (bo nie można używać raise), ale jeśli jesteś gotów przyznać, że na ... Można użyć:

f = lambda x: x == 2 and x or None 
+9

Szczególnym ograniczeniem lambdy jest to, że nie wolno używać instrukcji, tylko wyrażeń. –

29

dlaczego nie definiujecie po prostu funkcji?

def f(x): 
    if x == 2: 
     print(x) 
    else: 
     raise ValueError 

Naprawdę nie ma uzasadnienia dla używania lambda w tym przypadku.

+3

'print' nie jest jeszcze funkcją w 2.6. :) –

+6

@ Lukáš Lalinský: nadal działa w wersji 2.x. będzie traktowany jako para zbędnych nawiasów. – newacct

+17

Nie znasz jego rzeczywistego przypadku użycia, więc nie ma możliwości powiedzieć, że nie ma powodu, aby używać lambda. –

19

Możesz łatwo podnieść wyjątek w lambda, jeśli tak naprawdę chcesz zrobić.

def Raise(exception): 
    raise exception 
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value")) 

Czy to dobry pomysł? Ogólnie moim instynktem jest opowiadanie o błędach zgłaszanych przez lambdy; niech ma wartość None i wywołaj błąd w wywołującym. Nie sądzę jednak, że jest to z natury zła - uważam, że sama składnia "y if x else z" jest gorsza - po prostu upewnij się, że nie próbujesz zbytnio wciskać się w ciało lambda.

+1

Podnoszenie go w dzwoniącym jest prawdopodobnie piękniejszą metodą, jeśli mnie zapytasz. –

+0

Prawdopodobnie, ale to zależy w dużej mierze od konkretnego przypadku. Oczywiście możesz także ozdobić lambdę po jej utworzeniu. 'x = RaiseValueErrorOnNone (x)', ponownie, w zależności od przypadku. –

21

Prawdopodobnie najgorsza linia pyton pisałem do tej pory:

f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2]) 

Jeśli x == 2 wydrukować,

jeśli x = 2 podnieść!.

3

zauważyć można użyć kilka indziej ... jeśli stwierdzenia zawarte w definicji lambda:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1 
2

Jeśli nadal chcesz wydrukować można importować przyszłemu modułu

from __future__ import print_function 

f = lambda x: print(x) if x%2 == 0 else False 
Powiązane problemy