Вы можете использовать map
вместо показанного вами цикла for
, но, поскольку вы не используете результат item.my_func()
, это не рекомендуется . map
следует использовать, если вы хотите применить функцию без побочных эффектов ко всем элементам списка. Во всех других ситуациях используйте явный цикл for.
Кроме того, начиная с Python 3.0 map
возвращает генератор, поэтому в этом случае map
не будет вести себя одинаково (если вы явно не оцените все элементы, возвращаемые генератором, например, вызвав list
на нем).
Edit : kibibu просит в комментариях пояснить, почему первый аргумент map
не должен быть функцией с побочными эффектами. Я дам ответ на этот вопрос:
map
предназначено для передачи функции f
в математическом смысле . При таких обстоятельствах не имеет значения, в каком порядке f
применяется к элементам второго аргумента (конечно, если они возвращают в их первоначальном порядке). Что еще более важно, в этих обстоятельствах map(g, map(f, l))
семантически эквивалентно map(lambda x: g(f(x)), l)
, независимо от порядка, в котором f
и g
применяются к их соответствующим входам .
Например, не имеет значения, возвращает ли map
итератор, или полный список сразу. Однако, если f
и / или g
вызывают побочные эффекты, то эта эквивалентность гарантируется только в том случае, если семантика map(g, map(f, l))
такова, что на любом этапе g
применяется к первому n элементы, возвращаемые map(f, l)
до map(f, l)
, применяют f
к элементу (n + 1) st l
. (Это означает, что map
должен выполнять самую ленивую итерацию, что и в Python 3, но не в Python 2!)
Пойдем еще дальше: даже если мы примем реализацию Python 3 map
, семантическая эквивалентность может легко нарушиться, если вывод map(f, l)
будет, например, передается через itertools.tee
перед подачей на внешний вызов map
.
Приведенное выше обсуждение может показаться теоретическим, но по мере того, как программы становятся более сложными, их становится все труднее рассуждать и, следовательно, труднее их отлаживать. Обеспечение того, что некоторые вещи являются инвариантами, несколько облегчает эту проблему и может фактически предотвратить целый класс ошибок.
Наконец, map
напоминает многим людям о его действительно функциональном аналоге на различных (чисто) функциональных языках. Передача «функции» с побочными эффектами приведет в замешательство этих людей. Поэтому, учитывая, что альтернатива (т. Е. Использование явного цикла) не сложнее реализовать, чем вызов map
, настоятельно рекомендуется ограничить использование map
теми случаями, в которых применяемая функция делает не вызывает побочных эффектов.