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


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.


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.


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.


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.


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

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

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

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


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)


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.