Вы можете использовать map
вместо цикла for
, который вы показали, но поскольку вы не используете результат item.my_func()
, это не рекомендуется. map
следует использовать, если вы хотите применить функцию без побочных эффектов ко всем элементам списка. Во всех других ситуациях используйте явный цикл for.
Кроме того, начиная с Python 3.0 map
возвращает генератор, поэтому в этом случае map
не будет вести себя так же (если только вы явно не оцените все элементы, возвращаемые генератором, например, вызвав list
на нем).
Изменить: 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) элементу l
. (Это означает, что map
должен выполнять максимально ленивую итерацию — что он делает в Python 3, но не в Python 2!)
Еще один шаг вперед: даже если мы предположим реализацию map
в Python 3, семантическая эквивалентность может легко разрушиться, если вывод map(f, l)
будет, например, передается через itertools.tee
перед передачей во внешний вызов map
.
Приведенное выше обсуждение может показаться теоретическим, но по мере того, как программы становятся более сложными, их становится все труднее анализировать и, следовательно, труднее отлаживать. Обеспечение инвариантности некоторых вещей несколько облегчает эту проблему и фактически может предотвратить целый класс ошибок.
Наконец, map
напоминает многим людям его действительно функциональный аналог в различных (чисто) функциональных языках. Передача ему «функции» с побочными эффектами запутает этих людей. Поэтому, поскольку альтернативу (т. е. использование явного цикла) реализовать не сложнее, чем вызов map
, настоятельно рекомендуется ограничить использование map
теми случаями, в которых применяемая функция не вызывает побочных эффектов. .
person
Stephan202
schedule
17.05.2009