?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Python: временные переменные в list comprehension
nyaload
_winnie
Читая исходники питоновского (имп)экспортера в Blender, наткнулся на забавный синтаксический трюк.

Иногда жалко, что в list comprehension нельзя завести временную переменную, как where в Haskell, и надо либо что-то вычислять два раза, забивая на производительность, либо разделить на два последовательных list comprehension (или пара вложеных)

Пример:
[f(x) for x in l if g(f(x))]
или
[(f(x), g(f(x))) for x in l]

Внутри f - может быть скажем открытие и закрытие файла, с разбитием на строки.
Тогда можно либо переписать в два приёма:

fxs = [f(x) for x in l]
fxs = [fx for fx in fxs if g(fx)]

либо оказывается можно через задницу завести временную переменную.
[fx for x in l for fx in (f(x),) if g(fx)]
[(fx, g(fx) for x in l for fx in (f(x),)]

(f(x),) - это тюпл из одного элемента
Read more...Collapse )

Ни в коем случае не призываю так писать, просто показалось интересным.