On Tue, Dec 10, 2013 at 10:39:34AM +0100, Rafael Knuth wrote: > I don't understand yet what the "map" function does - can you explain? > I read the Python 3.3.0 documentation on that topic but I frankly > didn't really understand it
The "map" function comes from so-called functional programming languages like Lisp, Scheme and Haskell. The idea, and the name, comes from the concept of a "mapping" in mathematics. The idea is that you have some relationship between the things over here and the things over there, e.g. the places on a map and the places in real life. "Here we are at the Town Hall, so on the map we must be here..." sort of thing. So, in mathematics we might have a mapping between (let's say) counting numbers 1, 2, 3, 4, ... and the even numbers larger than fifty, 52, 54, 56, ... and so on. The mapping function is 50 + 2*x: x = 1 --> 50 + 2*1 = 52 x = 2 --> 50 + 2*2 = 54 x = 3 --> 50 + 2*3 = 56 x = 4 --> 50 + 2*4 = 58 and so on, where we might read the arrow --> as "maps to". So the fundamental idea is that we take a series of elements (in the above case, 1, 2, 3, ...) and a function, apply the function to each element in turn, and get back a series of transformed elements (52, 54, 56, ...) as the result. So in Python, we can do this with map. First we define a function to do the transformation, then pass it to map: def transform(n): return 50 + 2*n result = map(transform, [1, 2, 3, 4, 5, 6]) For short, simple functions, we don't even need to create the function ahead of time: result = map(lambda n: 50 + 2*n, [1, 2, 3, 4, 5, 6]) works the same way. In Python 3, map doesn't actually perform the calculations immediately. To turn the result into a list, just call the list() function: result = list(result) I should emphasis that it's not just mathematical functions where this is useful. We can use any function that takes a single argument: def transform(astr): return "Hello " + astr.strip().title() + "!" for item in map(transform, [" George ", "SUE\n", "bobby", "MicheLLE", "fred"]): print(item) prints: Hello George! Hello Sue! Hello Bobby! Hello Michelle! Hello Fred! or even multiple arguments, in which case you need to pass multiple data streams: for item in map(lambda a,b,c: a+b-c, [1000, 2000, 3000], [100, 200, 300], [1, 2, 3]): print(item) gives: 1099 2198 3297 -- Steven _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor