Методы mutator изменчивых контейнеров Python (такие как метод списков .reverse
) почти всегда возвращают None
- некоторые возвращают одно полезное значение, например, метод .pop
возвращает извлеченный элемент, но ключевая концепция, которую следует сохранить, заключается в том, что ни один из этих мутаторов не возвращает мутировавший контейнер: скорее, контейнер мутирует на месте , а возвращаемое значение метода мутатора равно не этот контейнер. (Это применение принципа CQS - не настолько фанатичного, как, скажем, в Eiffel, языке, разработанном Бертраном Мейером, который также изобрел CQS, но это только потому, что в Python "практичность" бьет чистотой, ср import this
; -).
Построение списка часто обходится дороже, чем просто создание итератора, поскольку в подавляющем большинстве случаев вам нужно всего лишь loop для результата; поэтому встроенные модули, такие как reversed
(и все замечательные строительные блоки в модуле itertools
), возвращают итераторы, списки , а не .
Но что, если у вас есть итератор x
, но вам действительно нужен эквивалентный список y
? Кусок торта - просто сделай y = list(x)
. Чтобы создать новый экземпляр типа list
, вы вызываете типа list
- это такая общая идея Python, что даже более важно сохранить ее, чем довольно важный материал, который я указал в первые два абзаца! -)
Итак, код для вашей конкретной задачи действительно очень легко составить, основываясь на ключевых понятиях в предыдущих параграфах:
[list(reversed(row)) for row in figure]
Обратите внимание, что я использую понимание списка, не map
: как правило, map
следует использовать только в качестве последней оптимизации, когда нет требуется lambda
для его построения (если задействован lambda
, то listcomp, а также более ясный, как обычно, также в любом случае быстрее! -).
Как только вы станете «бывшим мастером Python», если ваше профилирование говорит вам, что этот код является узким местом, вы можете попробовать другие варианты, такие как
[row[::-1] for row in figure]
применяя нарезку с отрицательным шагом (также известную как "Марсианский смайлик"), чтобы сделать перевернутые копии строк, зная, что это обычно быстрее, чем подход list(reversed(row))
. Но - если ваш код не предназначен для поддержки только вами или кем-то, по крайней мере, столь же опытным в Python - это оправданная позиция, чтобы использовать простейший подход «код из первых принципов», за исключением случаев, когда профилирование подсказывает вам нажать на педаль , (Лично я думаю, что «Марсианский смайлик» достаточно важен, чтобы не применять эту хорошую общую философию к этому конкретному случаю использования, но разумные люди могут отличаться по этому очень специфическому вопросу!