Если вы можете предварительно вызвать func () и хотите объединить операторы test и assignment в один оператор, то вы можете сделать это с помощью выражения if-else:
b += [a] if a is not None else []
Если a не None, то это добавит [a] к b - по сути, та же операция, что и b.append (a)
Если a равно Нет, то это добавит [] к b, что оставит b без изменений.
Это не будет работать, если b не является списком или, по крайней мере, не поддерживает добавление "+ =" на месте. Если это не так - возможно, это какой-то пользовательский объект, тогда вы сможете сделать это:
(b.append(a) if a is not None else None)
Это выражение, оцененное на предмет его побочных эффектов, а затем выброшенное. Если a - None, то вызов b.append(a)
никогда не будет выполнен. В любом случае значением выражения является None, но нас это не волнует, поэтому оно игнорируется.
Теперь, если вы хотите объединить вызов func () с этим, вам придется сделать что-то другое, чтобы избежать вызова func дважды. Если вы можете использовать синтаксис "+ =", то вы можете сделать это так:
b += filter(None, [func()])
filter(None, <list>)
возвращает список со всеми ложными элементами (не включая, кроме 0 и []). Это утверждение затем добавит либо [func ()], либо [] к b.
[Изменено]
Наконец, для наихудшего сценария: если вы не можете вызывать func () более одного раза, и , вы не можете использовать b += <list>
, и , вам нужно примите 0, "", [] и т. д. и исключите только None
, и , вам нужно все это в одну строку, вот самая уродливая строка кода:
(lambda l, a: l.append(a) if a is not None else None)(b, func())
По сути, это решение @ ekhumoro, сжатое в одну строку. Он определяет анонимную функцию, вызывает ее, отбрасывает значение, а затем отбрасывает функцию, все ради побочного эффекта.
Теперь, это одна строка, но ее, конечно, не легче прочитать или понять, чем оригинальный код. На вашем месте я бы придерживался оригинала или придерживался идеи @ ekhumoro просто определить вспомогательную функцию и использовать ее.