Python lambda function printing <function <lambda> at 0x7fcbbc740668> instead of value
Solution 1
You aren't calling the function. It's the same as if you wrote
print convert_ascii
instead of print convert_ascii(i)
.
Try
print (lambda x: chr(ord(x) + 1))(i)
Note that I changed ord(i)
to ord(x)
in the function body.
Solution 2
The Lambda Keyword returns an anonymous function:
>>> func = lambda x: x+1
>>> print(func)
<function <lambda> at 0x7f0310160668>
the above is (not counting the behind-the-scenes magic) equivalent to:
>>> def func(x):
return x+1
>>> print(func)
<function func at 0x7fa73d3e6bf8>
to invoke the function, lambda or not, you still have to call it:
>>> print(func)
<function <lambda> at 0x7f0310160668>
>>> func(123)
124
That said, Lambdas are not very well suited to this situation, and are better used if a function or construct requires a short function.
>>> word = "spam"
>>> map(lambda x: chr(ord(x) + 1), word)
Solution 3
Currently you are printing a function object. You have to call the function.
Receive the function in a variable and call it with a parameter.
for i in word:
print convert_ascii(i)
fun=lambda x: chr(ord(x) + 1)
print fun(some_arg)
Solution 4
You are trying to print the function itself. Instead of that, assign the function in a variable, and pass the parameter to the variable, or use the same within print itself.
for i in word:
z = lambda x: chr(ord(x) + 1)
print z(i)
or
for i in word:
print (lambda x: chr(ord(x) + 1))(i)
or to learn map, you can use map to get the same result
for i in word:
print "".join(map(lambda x: chr(ord(x) + 1), i))
pkill
Updated on June 09, 2022Comments
-
pkill over 1 year
I am a beginner in python, and I was playing around with lambda functions. I was writing a program using lambda function to print characters that are +1 the ascii value of the input characters. My code is
#!/usr/bin/python import sys try: word = sys.argv[1] except: print "No arguments passed" sys.exit(1) def convert_ascii(char): return "".join(chr(ord(char) + 1)) for i in word: print convert_ascii(i) print lambda x: chr(ord(i) + 1)
I have a function convert_ascii that does the same thing as lambda. However, my output is
/usr/bin/python2.7 /home/user1/PycharmProjects/test/Tut1/asciipl2.py "abc def ghi" b <function <lambda> at 0x7f0310160668> c <function <lambda> at 0x7f0310160668> d <function <lambda> at 0x7f0310160668> ! <function <lambda> at 0x7f0310160668> e <function <lambda> at 0x7f0310160668> f <function <lambda> at 0x7f0310160668> g <function <lambda> at 0x7f0310160668> ! <function <lambda> at 0x7f0310160668> h <function <lambda> at 0x7f0310160668> i <function <lambda> at 0x7f0310160668> j <function <lambda> at 0x7f0310160668>
The purpose of this script is learning lambda, though there are other ways to do this program. Please let me know what am I doing wrong. Process finished with exit code 0
-
Vasily Ryabov about 8 yearsCorrect. But saving lambda to a variable looks like creating a named function that is vice versa to lambda idea. For example, QuantifiedCode.com service treats it as an anti-pattern raising a warning.
-
chepner about 8 yearsYou don't need to assign the function to a variable;
print (lambda x: chr(ord(x) + 1))(i)
works the same. -
pkill about 8 yearsNever knew that. Thanks
-
chepner about 8 yearsList comprehensions are more efficient than mapping a user-defined function over a list:
[ chr(ord(x) + 1) for x in word]
. -
saulspatz about 8 yearsA lambda is a literal function. It doesn't have to be anonymous. One might equally well say that giving a name to a literal string or a literal number is an "anti-pattern".
-
Ahsanul Haque about 8 yearsI know, it's basiclly matter of calling the function.
-
chepner about 8 yearsLambdas are intended for situations where you can't or don't need to assign a name. If you're going to write
foo = lambda x: ...
, you may as well writedef foo(x): ...
. I can't think of a situation where you would use a lambda expression with a list comprehension. -
Azsgy about 8 yearsAlthough fo note that in this case the Lambda is useless. The code in this answer is equivalent to
print(chr(ord(x) + 1))
-
Ahsanul Haque about 8 years
[(lambda x: x*x)(x) for x in range(10)]
can't you write that? -
chepner about 8 yearsThe OP's stated purpose is to learn how lambda expressions work. Where it is appropriate to use them is off-topic for this particular question.
-
chepner about 8 yearsYou could, but why would you?
[x*x for x in range(10)]
-
Azsgy about 8 years@chepner, yeah, just caught that. Will change to OP's example. Yes, list comprehensions would be better.
-
nohup about 8 yearsThanks chepner. I copy-pasted, and hence I didn't notice. Changed.
-
pkill about 8 yearsThough I used i instead of x in lambda functions, the result was the same. In lambda, I accepted the var as x, but iterated as i, and still it worked. Any idea why?
-
chepner about 8 yearsSince the lambda expression is defined and called in the same scope, the
i
as a free variable in the expression is bound to the same value asx
once the expression is called. It's technically a bug, but under the circumstances works the same as the correctly written code. -
pkill about 8 yearsThanks @chepner. This really helped.
-
saulspatz about 8 years@chepner You're right, but I think the OP is just trying to figure out how lambdas work in python, don't you?
-
chepner about 8 yearsI do, but you're the one who brought up using a lambda expression in a list comprehension.
-
saulspatz about 8 years@chepner. I think you're confusing me with Ahsanul Hasque. I didn't say anything about list comprehensions. I may have scrolled down too fast. I thought you were talking about the OP's code, not Ahsanul's.