473,578 Members | 3,001 Online

# Using __mul__

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
Jul 18 '05 #1
2 4516
Thomas Philips wrote:
To compute the product of a list of numbers, I tried entering
reduce(__mu l__,[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(prod uct,[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.__mu l__, [1, 2, 3])

Sam
Jul 18 '05 #2
Sam Jervis wrote:
Thomas Philips wrote:
To compute the product of a list of numbers, I tried entering
>reduce(__m ul__,[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.__mu l__, [1, 2, 3])

Or use operator.mul if you cannot guarantee that all numbers are integers:
reduce(int.__mu l__, [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

Jul 18 '05 #3

This thread has been closed and replies have been disabled. Please start a new discussion.