Python 3 Map function is not Calling up function

17,604

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]]
Share:
17,604
Sibi
Author by

Sibi

Learning Maths in Spare time.

Updated on June 14, 2022

Comments

  • Sibi
    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
    Jon Clements over 11 years
    Also, the OP may just be missing a return, but it's generally not considered good practice to use map to execute a function repeatedly for side-effects (in this case print) as opposed to working with the result set...
  • Martijn Pieters
    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
    Oleh Prypin over 11 years
    Creating a temporary list is not the best thing, I'd say. The consume recipe may be better.
  • ruancomelli
    ruancomelli about 4 years
    Note that creating a collection.deque with maxlen=0 is equivalent to calling itertools.consume. The latter, however, is much more readable to me since it is clear that you want to consume the iterator.
  • Martijn Pieters
    Martijn Pieters about 4 years
    @rugortal there is no itertools.consume(). There is a consume() example function definition in the itertools documentation recipes section, but that’s not part of what the module provides.
  • ruancomelli
    ruancomelli about 4 years
    @MartijnPieters, you're right, thanks for pointing that out. I got confused because, while a recipe for consume indeed exists in itertools, they do not provide such function. Instead, one can find consume implemented in more-itertools.
  • elliotwesoff
    elliotwesoff almost 4 years
    for loops are better for smaller code blocks. i personally prefer a functional approach with map 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/…