Функция map
Функция map()
используется в Python для того, чтобы применить одни и те же действия к каждому элементу последовательности. Она имеет следующий синтаксис:
map(function, iterable)
Здесь function
- функция, которую нужно применить к последовательности (ее называют трансформационной), а iterable
- любой объект, поддерживающий итерацию. Функция map()
возвращает map object, который является итерируемым.
Сравнение с генераторами и списковыми включениями
Может показаться, что для тех же целей можно использовать генераторы и списковые включения. Так и есть, поэтому было бы логично сравнить их между собой. Давайте напишем функцию, которая возвращает округленное до первого знака абсолютное значение переданного в нее аргумента и применим её к одной и той же последовательности.
def abs_round(val):
return round(abs(val), 1)
lst = [-0.111, 2.4321, -3.99999, 2.5]
>>> [abs_round(i) for i in lst] # Списковое включение
... (abs_round(i) for i in lst) # Генератор
... map(abs_round, lst) # map()
[0.1, 2.4, 4.0, 2.5]
<generator object <genexpr> at 0x0000029ACF341BA0>
<map object at 0x0000019C22EBCFA0>
Как видите, функция map()
вернула нам объект. Впрочем, map object
легко преобразуется в другие типы.
>>> list(map(abs_round, lst))
... set(map(abs_round, lst))
[0.1, 2.4, 4.0, 2.5]
{0.1, 2.4, 2.5, 4.0}
Однако зачем такие сложности? Дело, как это часто бывает, в производительности. Функция map написана на С и работает быстрее:
>>> lst = [i + 0.1 * i for i in range(500)]
... print("Списковые включения:", timeit("[abs_round(i) for i in lst]", number=10000, globals=globals()))
... print("Генератор:", timeit("(abs_round(i) for i in lst)", number=10000, globals=globals()))
... print("map():", timeit("map(abs_round, lst)", number=10000, globals=globals()))
Списковые включения: 2.451521
Генератор: 0.00202250000000026
map(): 0.0009697000000001843
С другой стороны, функция map()
гораздо хуже читается, и при злоупотреблении (особенно с анонимніми функциями) код становится слишком сложным для восприятия. Поэтому использование генераторов и списковых включений считается более питоническим.
Заключение
Функция map()
широко используется для трансформации последовательностей. Она работает несколько быстрее генераторов, однако сложнее воспринимается при анализе кода.
Возможно будет интересно
🏆 Hello, world!
Мы вчера запустили новый www.pylot.me. Должны были в следующую среду, но запустили вчера.
Как практиковаться в Python?
Для улучшения качества знаний и повышения уровня программиста, необходим постоянный практикум. Где можно это организовать самостоятельно, и как практиковаться в Python?
Условные конструкции и сопоставление структурных шаблонов
Шпаргалка по условным конструкциям и сопоставлению структурных шаблонов