I discovered list comprehension and was exited and used them a lot. Then I went to multi level list comp. Then I realise I could never debug those so went back to loops for anything needing more than a single level. Finally I discovered Generator Expression which are basically like list comp, but lazy (not evaluated) and since then I break my code in a series of generator expression which I materialise at the end with a single list comprehension. This way I keep my code readable, it's a lot cleaner then a bunch of loops, and I also benefit of Python's special optimisation for list comprehension.
Arguably it's even easier because you you generally know you won't have inter-item dependencies.
But yeah, map/reduce are so common nowadays that I think most people would not have a problem with them anymore. Even Java is doing them now :)
OTOH, if you've never encountered them because you come from languages that did not have them, they might be confusing at first. Some of my colleagues did have trouble getting used to map/reduce when Java8 came around.
This may be part of the problem with hyper-productive languages in general, you get stuff done fast but it tends not to be documented as well as a publicly available programming language.
map() that is part of the language is also very STABLE whereas if you write your own you are likely to tinker with what it does here and there, what default argument-values it uses and so on.
A regular function call is first-order:
foo(bar: Int): Int
While is usually a magical special case, but conceptually it's just a higher-order function that takes two functions: while(keepGoing: () => Boolean, action: () => Unit): Unit
Or, if you want to be pedantic: while[M: Monad](keepGoing: Monad[Boolean], action: Monad[Unit]): Monad[Unit]