1

I know function map. It is used something like

new_list = map(func, list)

But what does *map(func, list) mean? It was used like

hands = set(best_hand(h) for h in itertools.product( *map(replacements, hand)))
SKulibin
  • 719
  • 1
  • 6
  • 14

1 Answers1

7

It means that the iterable returned from map() will be unpacked as arguments to the function. That is, rather than calling the function and passing the iterable object as a single parameter, the individual elements of the iterable are passed as individual parameters.

An illustration of this technique:

>>> def foo(a, b, c): print "a:%s b:%s c:%s" % (a, b, c)
...
>>> x = [1,2,3]
>>> foo(*x)
a:1 b:2 c:3

But calling foo() without unpacking x means you are passing one argument where three are expected:

>>> foo(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: foo() takes exactly 3 arguments (1 given)

From the Python 3 reference ยง6.3.4:

If the syntax *expression appears in the function call, expression must evaluate to an iterable. Elements from this iterable are treated as if they were additional positional arguments ...

cdhowie
  • 158,093
  • 24
  • 286
  • 300