Perché la stampa non funziona in una lambda?


164

Perché non funziona?

lambda: print "x"

Non è una singola affermazione o è qualcos'altro? La documentazione sembra un po 'scarsa su ciò che è permesso in un lambda ...


1
docs.python.org/reference/expressions.html#lambda . Dice "espressione", che è un collegamento a una definizione completa di tutte le espressioni possibili. Come è "scarso"? Che cosa era errato o incompleto?
S.Lott

3
@Lott Ho avuto un malinteso su cosa sia l'espressione / istruzione e dove appartenga la stampa. ora ha senso
Anycorn

Risposte:


188

Il lambdacorpo di A deve essere una singola espressione . In Python 2.x printè un'istruzione. Tuttavia, in Python 3 printè una funzione (e un'applicazione di funzione è un'espressione, quindi funzionerà in una lambda). Puoi (e dovresti, per compatibilità con il futuro :) usare la funzione di stampa con back-port se stai usando l'ultima versione di Python 2.x:

In [1324]: from __future__ import print_function

In [1325]: f = lambda x: print(x)

In [1326]: f("HI")
HI

5
Ora vedo perché è stato un grosso problema renderlo una funzione. Volevo usare print come kwarg predefinito e questo l'ha risolto. Grazie.
Thomas Dignan,

1
Posso sapere perché dovrebbe from __future__ import print_functionessere all'inizio del codice? grazie
Ben

Dove vedrei le stampe di ciò che abbiamo scritto qui?
Sk. Irfan,

Sono d'accordo con il commento di Ben: non ottengo questa importazione. Python (2 o 3) ha print()come metodo incorporato.
Ivanleoncz,

27

Nei casi in cui lo sto usando per un semplice stubbing, uso questo:

fn = lambda x: sys.stdout.write(str(x) + "\n")

che funziona perfettamente.


3
Come nota aggiuntiva: usa il futuro sopra. Usa questo solo dove non è disponibile - che sarebbe una versione seriamente obsoleta in questo momento.
Danny Staple,

24

ciò che hai scritto equivale a

def anon():
    return print "x"

che risulta anche in SyntaxError, python non consente di assegnare un valore per la stampa in 2.xx; in python3 potresti dire

lambda: print('hi')

e funzionerebbe perché hanno cambiato print per essere una funzione anziché un'istruzione.


3
C'è anche from __future__ import print_function, che lo abilita in py2.x
tzaman

5
O in alternativalambda: sys.stdout.write('hi')
segna il

@fmark: Tranne che non è così semplice in 2.x: devi gestire sys.stdout.softspace e (almeno) scrivere una nuova riga in seguito.
Fred Nurk,

11

Il corpo di una lambda deve essere un'espressione che restituisce un valore. print, essendo una dichiarazione, non restituisce nulla, nemmeno None. Allo stesso modo, non è possibile assegnare il risultato di printa una variabile:

>>> x = print "hello"
  File "<stdin>", line 1
    x = print "hello"
            ^
SyntaxError: invalid syntax

Inoltre, non puoi inserire un'assegnazione variabile in una lambda, poiché le assegnazioni sono istruzioni:

>>> lambda y: (x = y)
  File "<stdin>", line 1
    lambda y: (x = y)
                 ^
SyntaxError: invalid syntax

11

Puoi fare qualcosa del genere.

Crea una funzione per trasformare l'istruzione print in una funzione:

def printf(text):
   print text

E stampalo:

lambda: printf("Testing")

Più flessibile:def printf(fmt, *args): print(fmt % args)
IvyMike l'

4

Con Python 3.x, la stampa PU work funzionare in una lambda, senza cambiare la semantica della lambda.

Utilizzato in modo speciale, è molto utile per il debug. Pubblico questa "risposta tardiva", perché è un trucco pratico che uso spesso.

Supponiamo che il tuo lambda "non strutturato" sia:

lambda: 4

Quindi la tua lambda "strumentata" è:

lambda: (print (3), 4) [1]

3

Il corpo di una lambda deve essere una singola espressione . printè un'affermazione, quindi è sfortunatamente.


grazie, non ero sicuro della definizione di espressione contro affermazione, ora ha senso
Anycorn

2

Qui vedi una risposta per la tua domanda. printnon è espressione in Python, dice.


1
Risposta incompleta, ma bel link.
Stephen
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.