Причина того, что оба существуют, состоит в том, что понимание списка возвращает новый list
, где map
(в Python3) возвращает generator
, таким образом, map
более эффективно использует память, если вам не нужны результирующие list
сразу.
Это может рассматриваться как техническая составляющая, хотя, поскольку часто, когда вы используете понимание списка, чтобы сделать что-то, что может сделать карта, вы перезаписываете исходную переменную:
a = [1, 2, 3]
# The following line creates a new list but
# since we assign that list to `a` we give the old list to
# the garbage collector
a = [x**2 for x in a]
# or
a = list(map(lambda x: x**2, a))
# both of which are basically the same.
Сила карты может проявитьсяИграйте, если вы не работаете с той же переменной:
a = [1, 2, 3] # If we want to save this then we don't want to overwrite it
b = [x**2 for x in a] # A full new list is now in b
c = map(lambda x: x**2, a) # c is just a generator object.
print(a) # [1, 2, 3]
print(b) # [1, 4, 9]
print(c) # <map object ...>
for x in c:
print(x)
# We never create a full list from c, we just use each object as we go thus we save memory.
В предыдущем примере b
- это совершенно новая list
память, где c
- просто объект генератора.При работе с такими маленькими a
, b
и c
, вероятно, довольно близки в памяти, но если бы a
было большим, c
было бы значительно меньше памяти, чем b
.
Большинствослучаи общего использования map
связаны с первым случаем, поэтому map
не имеет реальной выгоды, но во втором случае гораздо выгоднее использовать map
.
для записи "один способ сделатьчто-то "из дзен" является своего рода расплывчатым.Я мог бы реализовать сортировку слиянием правильным способом (т.е. с идеальной скоростью и пространством), но мой код выглядел совершенно иначе, чем кто-то другой, кто реализовал сортировку слиянием.«Один способ» на самом деле не означает только один способ его кодирования, это скорее означает, что нужно использовать только одну методологию или один процесс.