в Python какая разница между картой (func, list) и [func (x) для x в списке] - PullRequest
2 голосов
/ 23 марта 2012

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

Например:

map(lambda x: x + 1, range(4)) == [(lambda x: x + 1)(y) for y in range(4)]

Кажется,мне нравится, что второй способ более питонический, но я не уверен, почему.

РЕДАКТИРОВАТЬ:

Да, я понимаю, что лямбда будет исключена во втором примере, я просто пытался показатькак эквивалентный код, насколько это возможно.

Ответы [ 2 ]

6 голосов
/ 23 марта 2012

Правильный способ сделать это будет

[y + 1 for y in range(4)]

Здесь нет необходимости создавать lambda функцию. Ваш код будет без необходимости создавать новый функциональный объект на каждой итерации понимания списка.

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

map(str, my_list)

в то время как другие предпочитают

[str(x) for x in my_list]
3 голосов
/ 23 марта 2012

Нет никакой разницы, но питонский способ - полностью исключить лямбду:

[y + 1 for y in range(4)]

Обратите внимание, что если ваша функция отображения является «встроенной» (написанной на C),вместо функции python или лямбды map будет быстрее.

Другой питонический, но необычный способ (исключает ненужную лямбду) будет:

map(1 .__add__, range(4)) # thanks to SvenMarnach for this

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

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

[x+y for x,y in zip(range(4), range(2,6))]
#vs
from operator import add
map(add, range(4), range(2,6))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...