C'è un modo per eseguire "if" in lambda di Python


358

In Python 2.6 , voglio fare:

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

Questa chiaramente non è la sintassi. E 'possibile eseguire un ifin lambdae se sì come si fa?

Grazie


2
Non è possibile stampare o aumentare in una lambda. Le lambda sono solo funzioni, puoi sempre usare una funzione.
Lennart Regebro,

10
Sono in disaccordo con te. Ho bisogno di 4 funzioni diverse, molto brevi come quella sopra, che devono essere inserite in un elenco / dizionario in modo da poter scorrere su di esse e selezionare quali utilizzare in ciascuna iterazione. Invece di molte righe di codice di solo inits, prima dell'iterazione, posso ridurlo a sole 4 righe di codice init. Meno il merrier ..
Guy

5
4 righe di codice non sono una soluzione lodevole quando altre persone devono leggere, interpretare, comprendere e mantenere il codice. Inoltre, il problema "stampa / rilancia" nell'esempio mostra ciò che non può e non deve essere fatto in lambdas.
S. Lott,

@LennartRegebro Le lambda non sono funzioni in Python, sono solo espressioni, ecco perché ci sono molte cose che non puoi fare con esse.
Aaron McMillin l'

1
@AaronMcMillin Lambdas sono funzioni. Sono limitati alle espressioni per motivi di sintassi, ma SONO funzioni.
Lennart Regebro,

Risposte:


660

La sintassi che stai cercando:

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

Ma non puoi usare printo raisein una lambda.


33
in Python 3, puoi usare print
recursive il

11
Certo, ma la domanda era "come si usa ifin una lambda?" non "qual è il modo migliore per scrivere un lambda che restituisce True se un numero è pari?"
Robert Rossney,

99
È una sintassi orribile - facilmente il peggior costrutto del linguaggio Python, che si avvicina ai livelli di assurdità del Perl nella sua valutazione fuori servizio - ma è quello che è stato chiesto. Stai seriamente votando le risposte per essere corretto?
Glenn Maynard,

41
È la risposta corretta alla domanda "Come faccio a scrivere una funzione lambda che mi dice se un numero è pari?" Non è, tuttavia, una risposta corretta alla domanda che l'OP aveva inizialmente posto. Per quanto non come l'esempio riuscii, il mio post fa , infatti, chiaramente rispondere alla domanda del PO.
Robert Rossney,

10
È dolorosamente ovvio che chiunque suggerisca "x% 2 == 0" - o vota un commento che lo consiglia, che rende almeno sette persone - non ha nemmeno letto la domanda originale.
Glenn Maynard,

40

perché non definisci semplicemente una funzione?

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

non c'è davvero alcuna giustificazione per usare lambda in questo caso.


3
printnon è ancora una funzione in 2.6. :)
Lukáš Lalinský,

7
@ Lukáš Lalinský: funziona ancora in 2.x. sarà trattato come una coppia di parentesi ridondanti
newacct

24
Non conosci il suo caso d'uso reale, quindi non c'è modo di dire che non c'è motivo di usare un lambda.
Glenn Maynard,

6
@Glenn Maynard: non c'è quasi motivo di usare una lambda, punto. Assegnare una lambda a una variabile - come sostituto di def- è generalmente un'idea molto negativa (tm). Basta usare un defprogrammatore mortale così semplice da poterlo leggere, interpretare, capire e mantenerlo.
S. Lott,

17
Ci sono molti usi legittimi di lambda. Se non riesci a pensare a nessuno, allora non è colpa di Lambda. (Non sono un fan della sintassi stessa, ovviamente - è una soluzione goffa per il fatto che la sintassi di rientro mal concepita di Python non può gestire funzioni incorporate come i linguaggi normali.)
Glenn Maynard,

25

Probabilmente la peggior linea di pitone che ho scritto finora:

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

Se x == 2 stampi,

se x! = 2 rilanci.


complimenti, penso che questa sia l'unica risposta sulla pagina che in realtà risponde alla domanda
Epsilon il

22

Puoi facilmente sollevare un'eccezione in una lambda, se è quello che vuoi davvero fare.

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

E 'questa una buona idea? Il mio istinto in generale è di lasciare l'errore riferendosi a lambdas; lasciare che abbia un valore di Nessuno e aumentare l'errore nel chiamante. Non penso che questo sia intrinsecamente malvagio, però - considero la sintassi "y if x else z" stessa peggiore - assicurati solo che non stai cercando di infilare troppo in un corpo lambda.


1
Alzarlo in un chiamante è probabilmente il metodo più carino se me lo chiedi.
Dominic Bou-Samra,

Forse, ma dipende fortemente dal caso particolare. Naturalmente, puoi anche decorare la lambda dopo averla creata. x = RaiseValueErrorOnNone(x), di nuovo, a seconda del caso.
Glenn Maynard,

15

Le lambda in Python sono abbastanza restrittive rispetto a ciò che ti è permesso usare. In particolare, non si può avere qualsiasi parola chiave (ad eccezione di operatori come and, not, or, ecc) nel loro corpo.

Quindi, non c'è modo di usare un lambda per il tuo esempio (perché non puoi usarlo raise), ma se sei disposto a concederlo ... Puoi usare:

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

16
La restrizione specifica di lambda è che non ti è permesso usare istruzioni, solo espressioni.
Daniel Werner,

13

nota che puoi usare diverse altre ... se istruzioni nella tua definizione lambda:

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

2

Se vuoi ancora stampare puoi importare il modulo futuro

from __future__ import print_function

f = lambda x: print(x) if x%2 == 0 else False

2

Puoi anche usare gli operatori logici per avere qualcosa come un condizionale

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

Puoi vedere di più sugli operatori logici qui


Non si adatta alla filosofia di Python in termini di chiarezza. Anche se logicamente equivalente, la ifsintassi è sempre preferita a questo. Il modo ovvio di controllare le condizioni.
0xc0de,

Grazie! L'ho usato in un lavoro di linguaggio funzionale al college a causa delle restrizioni imposte dal professore che dice che non potevo usare la ifdichiarazione, quindi ho trovato questo modo non ovvio .
Victor Lucas,

2

quello di cui hai bisogno è esattamente

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

ora chiama la funzione nel modo che ti serve

f(2)
f(3)


0

Il seguente codice di esempio funziona per me. Non sono sicuro se si riferisce direttamente a questa domanda, ma spero che possa aiutare in alcuni altri casi.

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))

0

Provalo:

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

Su:

True
False

0

Un modo semplice per eseguire un if in lambda è usare la comprensione dell'elenco.

Non puoi sollevare un'eccezione in lambda, ma questo è un modo in Python 3.x di fare qualcosa di simile al tuo esempio:

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

Un altro esempio:

ritorna 1 se M altrimenti 0

f = lambda x: 1 if x=="M" else 0
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.