On 29/08/2020 08:58, Shivlal Sharma wrote:
from functools import*
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
add = reduce(lambda a : a + 1, nums)
print(add)

error: -
TypeError                                 Traceback (most recent call last)
<ipython-input-15-684b5d4fac30> in <module>()
       1 from functools import*
       2 nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
----> 3 add = reduce(lambda a : a + 1, nums)
       4 print(add)

TypeError: <lambda>() takes 1 positional argument but 2 were given
When you write
    lambda a :
you are defining a function that takes **one** argument, viz. a.
It's the same as if you wrote:
    def myfunc(a): return a+1
and then
    add = reduce(myfunc, nums)
But reduce always calls your supplied function with **two** arguments.  Hence the error.
I don't know exactly what you are trying to do, but if you wrote
    add = reduce(lambda a,b: a+1, nums)
or equivalently
    def myfunc(a,b): return a+1
    add = reduce(myfunc, nums)
reduce would call your lambda function succesively with arguments
    (1,2)    # which would return 1+1 i.e. 2
    (2,3)    # use previous result (2) and next number in the sequence (3); returns 2+1 i.e. 3
    (3,4)    # use previous result (3) and next number in the sequence (4)

    .....
    (8,9)    # returns 8+! i.e. 9
and finally 9 would be printed.

If you want to watch what is happening try
    def myfunc(a,b):
        print(f"Myfunc({a},{b})")
        return a+1
    add = reduce(myfunc, nums)

Try
    from functools import *
    help(reduce)
for an explanation of how reduce works.  Note that the first sentence starts "Apply a function of two arguments"
Best wishes
Rob Cliffe

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to