Ree Ray - 1 year ago 39

Python Question

As for

`map(Fn, Iterable)`

`Fn()`

`def Fn(x, k):`

return x+k

But, if I want to use the

`Fn()`

`map()`

`map(Fn(Iterable, k), Iterable)`

It means that how can I do if I want to use the param

`k`

Answer Source

Here are some possibilities

```
def fn(x,k):
return x+k
In [1095]: k=10 # in global space
In [1096]: map(lambda x: fn(x,k), [1,2,3])
Out[1096]: <map at 0xb263e04c> # ops, py3, need
In [1097]: list(map(lambda x: fn(x,k), [1,2,3]))
Out[1097]: [11, 12, 13]
```

I prefer list comprehensions to map:

```
In [1100]: [(lambda x: fn(x,k))(x) for x in [1,2,3]]
Out[1100]: [11, 12, 13]
In [1101]: [fn(x,k) for x in [1,2,3]]
Out[1101]: [11, 12, 13]
```

or if both x and k come from iterables, we can join them with zip:

```
In [1102]: [fn(x,k) for x,k in zip([1,2,3],[10,20,30])]
Out[1102]: [11, 22, 33]
```

I was going to suggest `functools.partial`

, but I don't think I can use that with the 2nd positional argument. I can use it to partially define the 1st argument (in this case it doesn't matter).

```
In [1107]: from functools import partial
In [1111]: [partial(fn, 1)(k) for k in [10,20,30]]
Out[1111]: [11, 21, 31]
In [1112]: list(map(partial(fn, 1),[10,20,30]))
Out[1112]: [11, 21, 31]
```

If I change `fn`

so `k`

becomes a keyword argument

```
def fn(x,k=0):
return x+k
In [1114]: [partial(fn, k=10)(x) for x in [1,2,3]]
Out[1114]: [11, 12, 13]
```

And similarly for `map`

.

If I define `fn`

so it takes a tuple, I could use zip with map:

```
def fn(args):
x,k=args
return x+k
In [1117]: list(map(fn,zip([1,2,3],[10,20,30])))
Out[1117]: [11, 22, 33]
```