Python 3 Map function is not Calling up function
Solution 1
map()
returns an iterator, and will not process elements until you ask it to.
Turn it into a list to force all elements to be processed:
list(map(self.do_someting,range(10)))
or use collections.deque()
with the length set to 0 to not produce a list if you don't need the map output:
from collections import deque
deque(map(self.do_someting, range(10)))
but note that simply using a for
loop is far more readable for any future maintainers of your code:
for i in range(10):
self.do_someting(i)
Solution 2
Before Python 3, map() returned a list, not an iterator. So your example would work in Python 2.7.
list() creates a new list by iterating over its argument. ( list() is NOT JUST a type conversion from say tuple to list. So list(list((1,2))) returns [1,2]. ) So list(map(...)) is backwards compatible with Python 2.7.
Solution 3
I just want to add the following:
With multiple iterables, the iterator stops when the shortest iterable is exhausted
[ https://docs.python.org/3.4/library/functions.html#map ]
Python 2.7.6 (default, Mar 22 2014, 22:59:56)
>>> list(map(lambda a, b: [a, b], [1, 2, 3], ['a', 'b']))
[[1, 'a'], [2, 'b'], [3, None]]
Python 3.4.0 (default, Apr 11 2014, 13:05:11)
>>> list(map(lambda a, b: [a, b], [1, 2, 3], ['a', 'b']))
[[1, 'a'], [2, 'b']]
That difference makes the answer about simple wrapping with list(...)
not completely correct
The same could be achieved with:
>>> import itertools
>>> [[a, b] for a, b in itertools.zip_longest([1, 2, 3], ['a', 'b'])]
[[1, 'a'], [2, 'b'], [3, None]]
Comments
-
Sibi almost 2 years
Why doesn't following code print anything:
#!/usr/bin/python3 class test: def do_someting(self,value): print(value) return value def fun1(self): map(self.do_someting,range(10)) if __name__=="__main__": t = test() t.fun1()
I'm executing the above code in Python 3. I think i'm missing something very basic but not able to figure it out.
-
Jon Clements over 11 yearsAlso, the OP may just be missing a
return
, but it's generally not considered good practice to usemap
to execute a function repeatedly for side-effects (in this caseprint
) as opposed to working with the result set... -
Martijn Pieters over 11 years@JonClements: The OP is playing around with the map function and created a short piece of example code to show that things didn't work as he expected, I'd say.
-
Oleh Prypin over 11 yearsCreating a temporary list is not the best thing, I'd say. The
consume
recipe may be better. -
ruancomelli about 4 yearsNote that creating a
collection.deque
withmaxlen=0
is equivalent to callingitertools.consume
. The latter, however, is much more readable to me since it is clear that you want to consume the iterator. -
Martijn Pieters about 4 years@rugortal there is no
itertools.consume()
. There is aconsume()
example function definition in theitertools
documentation recipes section, but that’s not part of what the module provides. -
ruancomelli about 4 years@MartijnPieters, you're right, thanks for pointing that out. I got confused because, while a recipe for
consume
indeed exists initertools
, they do not provide such function. Instead, one can findconsume
implemented in more-itertools. -
elliotwesoff almost 4 years
for
loops are better for smaller code blocks. i personally prefer a functional approach withmap
calls, and dividing code into smaller chunks when the instruction set gets large. i highly recommend this book on the subject: oreilly.com/library/view/functional-programming-in/…