Czy istnieje sposób wykonywania „if” w lambda Pythona

358

W Pythonie 2.6 chcę zrobić:

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

To oczywiście nie jest składnia. Czy to możliwe, aby wykonują ifw lambdaa jeśli tak, w jaki sposób to zrobić?

dzięki

Chłopak
źródło
2
Nie możesz drukować ani wychowywać w lambda. Lambda to tylko funkcje, zawsze możesz zamiast tego użyć funkcji.
Lennart Regebro
10
Nie zgadzam sie z Toba. 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 iterować nad nimi i wybierać, które z nich będą używane w każdej iteracji. Zamiast wielu wierszy kodu samych początków, przed iteracją sam mogę sprowadzić go do zaledwie 4 wierszy kodu inicjującego. Im mniej tym lepiej ..
Guy
5
4 linie kodu nie są godnym pochwały rozwiązaniem, gdy inni ludzie muszą czytać, interpretować, rozumieć i utrzymywać kod. Ponadto problem „print / raise” w tym przykładzie pokazuje to, czego nie można i nie należy robić w lambdach.
S.Lott
@LennartRegebro lambda nie są funkcjami w pythonie, są tylko wyrażeniami, dlatego jest wiele rzeczy, których nie można z nimi zrobić.
Aaron McMillin,
1
@AaronMcMillin Lambdas są funkcjami. Są one ograniczone do wyrażeń ze względów składniowych, ale SĄ funkcjami.
Lennart Regebro,

Odpowiedzi:

660

Składnia, której szukasz:

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

Ale nie możesz używać printani raisew lambda.

Robert Rossney
źródło
33
w pythonie 3 możesz użyć print
rekurencyjny
11
Jasne, ale pytanie brzmiało: „jak stosować ifw lambda?” nie „jaki jest najlepszy sposób na zapisanie lambda, które zwraca True, jeśli liczba jest parzysta?”
Robert Rossney
99
Jest to okropna składnia - najłatwiejsza konstrukcja języka Python, która zbliża się do poziomu absurdu w Perlu w ocenie poza kolejnością - ale o to poproszono. Poważnie głosujesz na odpowiedzi za poprawność?
Glenn Maynard
41
To poprawna odpowiedź na pytanie „Jak napisać funkcję lambda, która mówi mi, czy liczba jest parzysta?” Nie jest to jednak poprawna odpowiedź na pytanie, które pierwotnie zadał PO. Jednak bardzo się nie jak w przykładzie I wymyślony, mój post nie , w rzeczywistości jasno odpowiedzieć na pytanie OP.
Robert Rossney
10
To boleśnie oczywiste, że ktokolwiek sugerujący „x% 2 == 0” - lub głosujący komentarz polecający go, co czyni co najmniej siedem osób - nawet nie przeczytał pierwotnego pytania.
Glenn Maynard
40

dlaczego po prostu nie zdefiniujesz funkcji?

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

naprawdę nie ma uzasadnienia dla zastosowania lambda w tym przypadku.

SilentGhost
źródło
3
printnie jest jeszcze funkcją 2.6. :)
Lukáš Lalinský
7
@ Lukáš Lalinský: nadal działa w wersji 2.x. będzie traktowany jak para zbędnych nawiasów
newacct
24
Nie znasz jego rzeczywistego przypadku użycia, więc nie możesz powiedzieć, że nie ma powodu, aby używać lambda.
Glenn Maynard
6
@Glenn Maynard: Niemal nie ma powodu, aby używać lambda, kropka. Przypisywanie lambda do zmiennej - jako stand-in def- jest ogólnie bardzo złym pomysłem (tm). Wystarczy użyć deftak zwykłych śmiertelnych programistów, aby mogli go czytać, interpretować, rozumieć i utrzymywać.
S.Lott
17
Istnieje wiele uzasadnionych zastosowań lambd. Jeśli nie możesz o tym myśleć, to nie jest to wina lambdy. (Oczywiście nie jestem fanem samej składni - jest to niezdarne obejście tego faktu, że źle pomyślana składnia wcięcia Pythona nie obsługuje funkcji wbudowanych, takich jak normalne języki.)
Glenn Maynard,
25

Prawdopodobnie najgorsza linia pytona, jaką do tej pory napisałem:

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

Jeśli x == 2 drukujesz,

jeśli x! = 2 podbijesz.

jimifiki
źródło
kuud, myślę, że to jedyna odpowiedź na stronie, która faktycznie odpowiada na pytanie
TheEsilon
22

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

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

Czy to dobry pomysł? Mój instynkt generalnie polega na tym, aby pomijać raportowanie błędów w lambdas; niech ma wartość Brak i podnosi błąd w wywołującym. Nie sądzę jednak, aby było to z natury złe - uważam, że sama składnia „y if x else z” jest gorsza - po prostu upewnij się, że nie próbujesz zbytnio wpychać ciała lambda.

Glenn Maynard
źródło
1
Podnoszenie go w dzwoniącym jest prawdopodobnie ładniejszą metodą, jeśli mnie o to poprosisz.
Dominic Bou-Samra
Być może, ale zależy to w dużej mierze od konkretnego przypadku. Oczywiście możesz też ozdobić lambdę po jej utworzeniu. x = RaiseValueErrorOnNone(x), znowu, w zależności od przypadku.
Glenn Maynard
15

Lambdy w Pythonie są dość restrykcyjne w odniesieniu do tego, co wolno ci używać. W szczególności, nie można mieć żadnych słów kluczowych (z wyjątkiem operatorów podoba and, not, oritp) w organizmie.

Więc nie ma mowy, żebyś użył lambda na swój przykład (bo nie możesz użyć raise), ale jeśli chcesz zgodzić się na to ... Możesz użyć:

f = lambda x: x == 2 and x or None
David Wolever
źródło
16
Konkretnym ograniczeniem lambda jest to, że nie wolno używać instrukcji, a tylko wyrażeń.
Daniel Werner
13

uwaga: możesz użyć kilku innych ... jeśli w definicji lambda znajdują się wyrażenia:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1
filotn
źródło
2

Jeśli nadal chcesz drukować, możesz zaimportować przyszły moduł

from __future__ import print_function

f = lambda x: print(x) if x%2 == 0 else False
Juan Pablo Lopez
źródło
2

Możesz także użyć operatorów logicznych, aby mieć coś w rodzaju warunkowego

func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse

Możesz dowiedzieć się więcej o operatorach logicznych tutaj

Victor Lucas
źródło
Nie idzie to w parze z filozofią Pythona pod względem przejrzystości. Chociaż logicznie równoważna, ifskładnia jest zawsze preferowana. Oczywisty sposób sprawdzania warunków.
0xc0de,
Dziękuję Ci! Użyłem tego w pracy z językiem funkcjonalnym na studiach z powodu ograniczeń nałożonych przez profesora, który mówi, że nie mogę użyć ifoświadczenia, więc znalazłem ten nieoczywisty sposób.
Victor Lucas
2

czego dokładnie potrzebujesz

def fun():
    raise Exception()
f = lambda x:print x if x==2 else fun()

teraz wywołaj funkcję tak, jak potrzebujesz

f(2)
f(3)
Manjunath Bhadrannavar
źródło
2

Ten fragment powinien pomóc:

x = lambda age: 'Older' if age > 30 else 'Younger'

print(x(40))
Adarsh ​​Somasundar
źródło
0

Poniższy przykładowy kod działa dla mnie. Nie jestem pewien, czy odnosi się to bezpośrednio do tego pytania, ale mam nadzieję, że pomoże w niektórych innych przypadkach.

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))
Rahul
źródło
0

Spróbuj:

is_even = lambda x: True if x % 2 == 0 else False
print(is_even(10))
print(is_even(11))

Na zewnątrz:

True
False
Benyamin Jafari
źródło
0

Prostym sposobem na wykonanie instrukcji if in lambda jest użycie listy.

Nie możesz zgłosić wyjątku w lambda, ale w Pythonie 3.x jest to sposób na zrobienie czegoś zbliżonego do twojego przykładu:

f = lambda x: print(x) if x==2 else print("exception")

Inny przykład:

zwraca 1, jeśli M w przeciwnym razie 0

f = lambda x: 1 if x=="M" else 0
Paul Cysne
źródło