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.