Существует ли значение в использовании карты () по сравнению с для?

Вы можете проверить i, чтобы увидеть, содержит ли он что-нибудь. Подобно этому

   if (e.which === 13) {       
      if (i) {
        const list = [...this.state.list, i]; 

        this.setState({
          list,
          input: ""
        });
      }

      e.preventDefault();
    }

Итак, на enter вы проверяете, не является ли i не пустым (пустые строки , ложные ), а затем вы добавляете его в свое состояние. Вы предотвращаете вариант по умолчанию в любом случае, поэтому не обновляете страницу при пустой отправке ввода.

Подробнее см. В этом кодовом окне: https://codesandbox.io/s/14jy6jmm04

.

10
задан Martijn Pieters 1 September 2016 в 15:01
поделиться

8 ответов

Вы можете использовать map вместо для цикла , который вы показали, но поскольку вы, похоже, не используете результат 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 применяются к соответствующим входам .

Например, не имеет значения, отображается ли отображение ] возвращает и итератор или полный список сразу. Однако, если f и / или g вызывают побочные эффекты, то эта эквивалентность гарантируется только в том случае, если семантика map (g, map (f, l)) таковы, что на любом этапе g применяется к первым n элементам, возвращенным map (f, l) перед map (f, l) применяет f к (n + 1) -м элементу l . (Это означает, что map должна выполнять самую ленивую возможную итерацию - что она и делает в Python 3, но не в Python 2!)

Идем еще дальше: даже если мы предполагаем реализацию Python 3 для map , семантическая эквивалентность может легко нарушиться, если вывод map (f, l) , например, будет передан через itertools.tee перед передачей во внешний карта вызов.

Приведенное выше обсуждение может показаться теоретическим, но по мере того, как программы становятся более сложными, их становится труднее рассуждать и, следовательно, труднее отлаживать. Обеспечение инвариантности некоторых вещей в некоторой степени решает эту проблему и может фактически предотвратить целый класс ошибок.

Наконец, map напоминает многим людям о своем действительно функциональном аналоге на различных (чисто) функциональных языках. Передача ему «функции» с побочными эффектами запутает этих людей. Следовательно, поскольку альтернативу (т.е. использование явного цикла) не сложнее реализовать, чем вызов map , настоятельно рекомендуется ограничить использование map этими случаями. в котором применяемая функция не вызывает побочных эффектов.

map напоминает многим о своем действительно функциональном аналоге на различных (чисто) функциональных языках. Передача ему «функции» с побочными эффектами запутает этих людей. Следовательно, поскольку альтернативу (т.е. использование явного цикла) не сложнее реализовать, чем вызов map , настоятельно рекомендуется ограничить использование map этими случаями. в котором применяемая функция не вызывает побочных эффектов.

map напоминает многим о своем действительно функциональном аналоге на различных (чисто) функциональных языках. Передача ему «функции» с побочными эффектами запутает этих людей. Следовательно, поскольку альтернативу (т.е. использование явного цикла) не сложнее реализовать, чем вызов map , настоятельно рекомендуется ограничить использование map этими случаями. в котором применяемая функция не вызывает побочных эффектов.

23
ответ дан 3 December 2019 в 14:44
поделиться

Вы можете написать это, используя карту следующим образом:

map(cls.my_func, items)

замена cls классом элементов, которые вы повторяете.

Как упоминал Stephan202, это не рекомендуется в данном случае.

Как правило, если вы хотите создать новый список, применив некоторую функцию к каждому элементу в списке, используйте map. Подразумевается, что функция не имеет побочных эффектов, и поэтому вы можете (потенциально) запустить карту параллельно.

Если вы не хотите создавать новый список или если функция имеет побочные эффекты, используйте цикл for. Так обстоит дело в вашем примере.

5
ответ дан 3 December 2019 в 14:44
поделиться

Есть небольшая семантическая разница, которая, вероятно, закрыта в спецификации языка Python. Отображение явно распараллеливается, а для только в особых случаях. Код может прервать из для , но только выход за исключением из карты .

По моему мнению карта также не должна гарантировать порядок применения функции, тогда как для должен. AFAIK ни одна реализация python в настоящее время не может выполнять это автоматическое распараллеливание.

2
ответ дан 3 December 2019 в 14:44
поделиться

Вы можете переключить вашу карту на какую-нибудь классную структуру потоковых ИЛИ многопроцессорных ИЛИ распределенных вычислений, если вам нужно. Disco - это пример распределенной, устойчивой к сбоям среды на основе Erlang и Python. Я сконфигурировал его на 2 модулях по 8 ядер, и теперь моя программа работает в 16 раз быстрее благодаря кластеру Disco, однако мне пришлось переписать свою программу с использованием списков и циклов для отображения / сокращения.

То же самое и с напишите программу, используя циклы for и понимание списков и map / reduce, но когда вам нужно, чтобы она работала в кластере, вы можете сделать это почти бесплатно, если вы использовали map / reduce. Если вы этого не сделали, что ж, вам придется переписать.

Осторожно: насколько я знаю, python 2.x возвращает список вместо итератора из карты. Я'

2
ответ дан 3 December 2019 в 14:44
поделиться

Use an explicit for-loop when you don't need a list of results back (eg. functions with side-effects).

Use a list comprehension when you do need a list of results back (eg. functions that return a value based directly on the input).

Use map() when you're trying to convince Lisp users that Python is worth using. ;)

2
ответ дан 3 December 2019 в 14:44
поделиться

Главное преимущество map - это когда вы хотите получить результат некоторого вычисления для каждого элемента в списке. Например, этот фрагмент удваивает каждое значение в списке:

map(lambda x: x * 2, [1,2,3,4])  #=> [2, 4, 6, 8]

Важно отметить, что map возвращает новый список с результатами. Он не изменяет исходный список на месте.

Чтобы сделать то же самое с для , вам нужно будет создать пустой список и добавить дополнительную строку в для тела чтобы добавить результат каждого вычисления в новый список. Версия map более лаконична и функциональна.

1
ответ дан 3 December 2019 в 14:44
поделиться

Карта иногда может быть быстрее для встроенных функций, чем ручное кодирование цикла for. Попробуйте временную карту (str, range (1000000)) по сравнению с аналогичным циклом for.

0
ответ дан 3 December 2019 в 14:44
поделиться
map(lambda item: item.my_func(), items)
-3
ответ дан 3 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: