# Using __mul__

Discussion in 'Python' started by Thomas Philips, Jul 3, 2004.

1. ### Thomas PhilipsGuest

To compute the product of a list of numbers, I tried entering
>>>reduce(__mul__,[1,2,3])

Traceback (most recent call last):
File "<pyshell#0>", line 1, in -toplevel-
reduce(__mul__,[1,2,3])
NameError: name '__mul__' is not defined

I can get the answer I want by defining a function that returns the
product of two numbers:
>>> def product(x,y):

return x*y

and then using it:
>>> reduce(product,[1,2,3])

6

But why does my first approach not work? __mul__ is a valid method of
type int. Is there an obvious flaw in my logic?

Thomas Philips

Thomas Philips, Jul 3, 2004

2. ### Sam JervisGuest

Thomas Philips wrote:
> To compute the product of a list of numbers, I tried entering
>
>>>>reduce(__mul__,[1,2,3])

>
>
> Traceback (most recent call last):
> File "<pyshell#0>", line 1, in -toplevel-
> reduce(__mul__,[1,2,3])
> NameError: name '__mul__' is not defined
>
> I can get the answer I want by defining a function that returns the
> product of two numbers:
>
>>>>def product(x,y):

>
> return x*y
>
> and then using it:
>
>>>>reduce(product,[1,2,3])

>
> 6
>
> But why does my first approach not work? __mul__ is a valid method of
> type int. Is there an obvious flaw in my logic?
>
> Thomas Philips

The answer is in your question. __mul__ is a valid method of type int,
but __mul__ on its own is an undefined name. The following code works:

reduce(int.__mul__, [1, 2, 3])

Sam

Sam Jervis, Jul 3, 2004

3. ### Peter OttenGuest

Sam Jervis wrote:

> Thomas Philips wrote:
>> To compute the product of a list of numbers, I tried entering
>>
>>>>>reduce(__mul__,[1,2,3])

[...]

> The answer is in your question. __mul__ is a valid method of type int,
> but __mul__ on its own is an undefined name. The following code works:
>
> reduce(int.__mul__, [1, 2, 3])

Or use operator.mul if you cannot guarantee that all numbers are integers:

>>> reduce(int.__mul__, [1.0, 2, 3])

Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: descriptor '__mul__' requires a 'int' object but received a
'float'
>>> reduce(operator.mul, [1.0, 2, 3])

6.0

Peter

Peter Otten, Jul 3, 2004