map(function, iterable, ...)
Примените функцию к каждому элементу итерации и верните список результатов. Если переданы дополнительные итерируемые аргументы, функция должна принимать столько аргументов и применяется к элементам из всех итерируемых параллельно.
Если одна итерация короче другой, предполагается, что она расширена элементами None.
Если функция есть None
, предполагается тождественная функция; если есть несколько аргументов, map()
возвращает список, состоящий из кортежей, содержащих соответствующие элементы из всех итераций (своего рода операция транспонирования).
Итерируемые аргументы могут быть последовательностью или любым итеративным объектом; Результатом всегда является список.
Какую роль это играет в создании декартового произведения?
content = map(tuple, array)
Какой эффект имеет размещение кортежа где-нибудь там? Я также заметил, что без функции карты вывод abc
и с ним, это a, b, c
.
Я хочу полностью понять эту функцию. Справочные определения также трудно понять. Слишком много фантазии.
источник
map
?map(None, a, b, c)
оказывается, делаетzip(a, b, c)
. Но вы очень редко видите это на практике именно потому, чтоzip
вызов эквивалентен.tuple
является функцией (ну, это более нюанс, чем это, но она ведет себя как функция), которая принимает итеративный, и дает вам кортеж с теми же элементами - такtuple([1, 2, 3])
что эквивалентно(1, 2, 3)
. Ибоmap(tuple, array)
,array
будет итерируемым итерируемым (представьте список списков), и он возвращает каждый внутренний список, превращенный в кортеж.Ответы:
map
не особенно питонический. Я бы порекомендовал использовать списочные выражения:в основном эквивалентно:
map
сам по себе не может сделать декартово произведение, потому что длина его списка вывода всегда совпадает с его списком ввода. Вы можете тривиально сделать декартово произведение с помощью понимания списка:Синтаксис немного сбивает с толку - это в основном эквивалентно:
источник
map
гораздо менее многословным, чем списочные, по крайней мере для случая, который вы демонстрируете.map
-эквивалент[v.__name__ for v in (object, str)]
?map(lambda v: v.__name__, list)
?map
было иногда быстрее , чем постижения, иногда нет, именно из - за функции накладных расходов вызова? В частности, эвристика, которую я выучил, заключается в том, что при использованииmap
требует, чтобы вы вводили дополнительный вызов функции, понимание быстрее? Например, меня заставили поверить, чтоmap(lambda foo: foo.bar, my_list)
это медленнее, чемfoo.bar for foo in my_list
дажеmap(operator.add, my_list_of_pairs)
медленнееx + y for x, y in my_list_of_pairs
, именно из-за вызова дополнительной функции.map
вообще не имеет отношения к декартовому продукту, хотя я думаю, что кто-то, хорошо разбирающийся в функциональном программировании, может придумать какой-то непонятный способ генерации одного из нихmap
.map
в Python 3 это эквивалентно:и единственное отличие в Python 2 состоит в том, что он создаст полный список результатов, которые будут возвращаться сразу, а не в
yield
ing.Хотя соглашение Python обычно предпочитает списочные выражения (или выражения-генераторы) для достижения того же результата, что и при вызове
map
, особенно если вы используете лямбда-выражение в качестве первого аргумента:В качестве примера того, что вы просили в комментариях к вопросу - «превратить строку в массив», для «массива» вы, вероятно, хотите либо кортеж, либо список (оба они ведут себя немного как массивы из других языков) -
Использование
map
здесь будет, если вы начнете со списка строк вместо одной строки -map
можете перечислить их все по отдельности:Обратите внимание, что
map(list, a)
это эквивалентно в Python 2, но в Python 3 вам нуженlist
вызов, если вы хотите сделать что-то кроме подачи вfor
цикл (или функция обработки, такая какsum
эта, нуждается только в итерации, а не в последовательности). Но также отметьте еще раз, что понимание списка обычно предпочтительнее:источник
map
создает новый список, применяя функцию к каждому элементу источника:n-ary
map
эквивалентно объединению входных итераций и последующему применению функции преобразования к каждому элементу этого промежуточного сжатого списка. Это не декартово произведение:Я использовал
zip
здесь, ноmap
поведение на самом деле немного отличается, когда итерируемые объекты не имеют одинаковый размер - как отмечено в его документации, они расширяют итерируемые для содержанияNone
.источник
[2,4,6]
для понимания списка и явных циклов, но карта возвращает объект карты - например, я получаю следующее:<map at 0x123a49978>
что я тогда должен привести в список.Если немного упростить, вы можете представить себе
map()
что-то вроде этого:Как вы можете видеть, он берет функцию и список и возвращает новый список с результатом применения функции к каждому элементу в списке ввода. Я сказал «немного упрощая», потому что на самом деле
map()
может обрабатывать более одной итерации:Для второй части вопроса: какую роль это играет в создании декартового произведения? ну,
map()
может быть использован для генерации декартового произведения списка вроде этого:... Но, по правде говоря, использование
product()
является гораздо более простым и естественным способом решения проблемы:В любом случае, результатом является декартово произведение,
lst
как определено выше:источник
map()
Функция есть , чтобы применить ту же процедуру для каждого элемента в Iterable структуры данных, как списки, генераторы, строки и другие вещи.Давайте рассмотрим пример:
map()
можно перебрать каждый элемент списка и применить функцию к каждому элементу, после чего он вернет (вернет) новый список.Представьте, что у вас есть функция, которая берет число, добавляет 1 к этому числу и возвращает его:
У вас также есть список номеров:
если вы хотите увеличить каждое число в списке, вы можете сделать следующее:
Примечание: как минимум
map()
необходимо два аргумента. Сначала имя функции, а затем что-то вроде списка.Давайте посмотрим, какие еще классные вещи
map()
можно сделать.map()
может принимать несколько итераций (списки, строки и т. д.) и передавать элемент из каждой итерации в функцию в качестве аргумента.У нас есть три списка:
map()
может сделать вас новым списком, который содержит добавление элементов по определенному индексу.Теперь запомните
map()
, нужна функция. На этот раз мы будем использовать встроеннуюsum()
функцию. Бегmap()
дает следующий результат:ПОМНИТЕ:
В Python 2
map()
будет проходить итерацию (проходить по элементам списков) в соответствии с самым длинным списком и переходитьNone
к функции для более коротких списков, поэтому ваша функция должна их искатьNone
и обрабатывать, иначе вы получите ошибки. В Python 3map()
остановлюсь после окончания самого короткого списка. Кроме того, в Python 3map()
возвращает итератор, а не список.источник
Python3 - карта (функциональная, повторяемая)
Одна вещь, которая не была упомянута полностью (хотя @BlooB вроде упомянул об этом), это то, что карта возвращает объект карты, а не список. Это большая разница, когда дело доходит до производительности при инициализации и итерации. Рассмотрим эти два теста.
Как видите, инициализация функции карты почти не занимает времени. Однако итерация по объекту карты занимает больше времени, чем простая итерация по итерируемому. Это означает, что функция, переданная в map (), не применяется к каждому элементу, пока элемент не будет достигнут в итерации. Если вы хотите список, используйте понимание списка. Если вы планируете выполнять итерацию в цикле for и в какой-то момент прервитесь, используйте map.
источник