178

Why doesn't this work?

lambda: print "x" 

Is this not a single statement, or is it something else? The documentation seems a little sparse on what is allowed in a lambda...

2
  • 1
    docs.python.org/reference/expressions.html#lambda. It says "expression", which is a link to a complete definition of all possible expressions. How is this "sparse"? What was incorrect or incomplete? Commented Jun 4, 2010 at 2:49
  • 3
    @Lott I had misunderstanding of what expression/statement is and where print belongs. it makes sense now Commented Jun 4, 2010 at 5:31

10 Answers 10

202

A lambda's body has to be a single expression. In Python 2.x, print is a statement. However, in Python 3, print is a function (and a function application is an expression, so it will work in a lambda). You can (and should, for forward compatibility :) use the back-ported print function if you are using the latest Python 2.x:

In [1324]: from __future__ import print_function In [1325]: f = lambda x: print(x) In [1326]: f("HI") HI 
Sign up to request clarification or add additional context in comments.

4 Comments

Now I see why it was such a big deal to make it a function. Wanted to use print as a default kwarg and this fixed it. Thanks.
May I know why would from __future__ import print_function must be at the beginning of the code? thx
Where would I see the prints of what we have written here?
I agree with Ben's comment: I don't get this import. Python (2 or 3) has print() as built-in method.
28

In cases where I am using this for simple stubbing out I use this:

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

which works perfectly.

1 Comment

As an additional note - use the from future above. Use this only where that isn't available - which would be a seriously out of date version right now.
25

what you've written is equivalent to

def anon(): return print "x" 

which also results in a SyntaxError, python doesn't let you assign a value to print in 2.xx; in python3 you could say

lambda: print('hi') 

and it would work because they've changed print to be a function instead of a statement.

3 Comments

There's also from __future__ import print_function, which enables this in py2.x
Or alternatively lambda: sys.stdout.write('hi')
@fmark: Except it's not that simple in 2.x: you need to handle sys.stdout.softspace and (at least) write a newline afterwards.
11

The body of a lambda has to be an expression that returns a value. print, being a statement, doesn't return anything, not even None. Similarly, you can't assign the result of print to a variable:

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

You also can't put a variable assignment in a lambda, since assignments are statements:

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

Comments

11

You can do something like this.

Create a function to transform print statement into a function:

def printf(text): print text 

And print it:

lambda: printf("Testing") 

1 Comment

More flexibly: def printf(fmt, *args): print(fmt % args)
7

With Python 3.x, print CAN work in a lambda, without changing the semantics of the lambda.

Used in a special way this is very handy for debugging. I post this 'late answer', because it's a practical trick that I often use.

Suppose your 'uninstrumented' lambda is:

lambda: 4 

Then your 'instrumented' lambda is:

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

Comments

3

If you want to print something inside a lambda func In Python 3.x you can do it as following:

my_func = lambda : print(my_message) or (any valid expression) 

For example:

test = lambda x : print(x) or x**x 

This works because print in Python 3.x is a function.

1 Comment

definitely useful for debugging purposes
2

The body of a lambda has to be a single expression. print is a statement, so it's out, unfortunately.

1 Comment

thank you, I was not sure about definition of expression versus statement, now it makes sense
2

in python3 print is a function, and you can print and return something as Jacques de Hooge suggests, but i like other approach: lambda x: print("Message") or x

print function returns nothing, so None or x code returns x other way around:
lambda x: x or print("Message") would print message only if x is false-ish

this is widely used in lua, and in python you can too instead of a if cond else b write cond and a or b

Comments

1

Here, you see an answer for your question. print is not expression in Python, it says.

1 Comment

Incomplete answer, but nice link.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.