правильное использование списочных представлений - python - PullRequest
11 голосов
/ 02 января 2012

Обычно списочные выражения используются для получения нового списка из существующего списка.Например:

>>> a = [1, 2, 3, 4, 5]
>>> [i for i in a if i > 2]
[3, 4, 5]

Должны ли мы использовать их для выполнения других процедур?Например:

>>> a = [1, 2, 3, 4, 5]
>>> b = []
>>> [b.append(i) for i in a]
[None, None, None, None, None]
>>> print b
[1, 2, 3, 4, 5]

или мне следует избегать вышеуказанного и использовать вместо этого следующее?:

for i in a:
    b.append(i)

Ответы [ 5 ]

10 голосов
/ 02 января 2012

Вы действительно должны избегать использования списочных представлений (наряду со словарными пониманиями, множественными определениями и выражениями-генераторами) для побочных эффектов.Помимо того, что они накапливают фиктивный список и, следовательно, тратят память, это также сбивает с толку.Я ожидаю, что понимание списка создаст (значимое) значение, и многие с этим согласятся.Циклы, с другой стороны, явно представляют собой последовательность утверждений.Ожидается, что они вызовут побочные эффекты и не дадут никакого результата - неудивительно.

4 голосов
/ 02 января 2012
2 голосов
/ 02 января 2012

Используйте списки только в том случае, если вы планируете использовать созданный список. В противном случае вы создаете его только для GC, чтобы бросить его снова, никогда не используя.

Так что вместо [b.append(i) for i in a] вы должны использовать правильный цикл for:

for i in a:
    b.append(i)

Другое решение будет через выражение генератора:

b += (i for i in a)

Однако, если вы хотите добавить весь список, вы можете просто сделать

b += a

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

b += map(somefunc, a)
2 голосов
/ 02 января 2012

В приведенном вами примере наиболее целесообразно выполнить:

b = [i for i in a]

, если по какой-либо причине вы хотите создать b.В общем, есть здравый смысл, который нужно использовать.Если использование понимания делает ваш код нечитаемым, не используйте его.В противном случае пойти на это.

0 голосов
/ 02 января 2012
b = []
a = [1, 2, 3, 4, 5]
b.extend (a)
...