Одна строка, если-условие-присваивание - PullRequest
97 голосов
/ 24 октября 2011

У меня есть следующий код

num1 = 10
someBoolValue = True

Мне нужно установить значение num1 на 20, если someBoolValue равно True;и ничего не делать иначе.Итак, вот мой код для этого

num1 = 20 if someBoolValue else num1

Можно ли как-нибудь избежать части ...else num1, чтобы она выглядела чище?Эквивалент

if someBoolValue:
    num1 = 20

Я попытался заменить его на ...else pass следующим образом: num1=20 if someBoolValue else pass.Все, что я получил, было синтаксической ошибкой.Также я не мог просто пропустить ...else num1 часть.

Ответы [ 11 ]

146 голосов
/ 24 октября 2011

Я не думаю, что это возможно в Python, поскольку то, что вы на самом деле пытаетесь сделать, вероятно, будет расширено до чего-то вроде этого:

num1 = 20 if someBoolValue else num1

Если вы исключите else num1, выполучить синтаксическую ошибку, так как я совершенно уверен, что присвоение должно действительно что-то возвращать.

Как уже упоминали другие, вы могли бы сделать это, но это плохо, потому что вы, вероятно, просто запутаетесь, читаяэтот кусок кода в следующий раз:

if someBoolValue: num1=20

Я не большой поклонник num1 = someBoolValue and 20 or num1 по той же самой причине.Я должен дважды подумать о том, что делает эта линия.

Лучший способ добиться того, что вы хотите сделать, - это оригинальная версия:

if someBoolValue:
    num1 = 20

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

Также, как примечание, num1 = 20 if someBoolValue - этодопустимый код Ruby, потому что Ruby работает немного по-другому.

34 голосов
/ 24 октября 2011

Используйте это:

num1 = 20 if someBoolValue else num1
18 голосов
/ 24 октября 2011

В одну строку:

if someBoolValue: num1 = 20

Но не делай этого. Этот стиль обычно не ожидается. Люди предпочитают более длинную форму для ясности и последовательности.

if someBoolValue:
    num1 = 20

(Точно так же следует избегать верблюжьих шапок. Поэтому используйте some_bool_value.)

Обратите внимание, что встроенное выражение some_value if predicate без части else не существует, поскольку не было бы возвращаемого значения, если предикат был ложным. Однако выражения должны иметь четко определенное возвращаемое значение во всех случаях. Это отличается от использования, например, в Ruby или Perl.

12 голосов
/ 08 октября 2015

Вы можете использовать одно из следующих:

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal
5 голосов
/ 24 октября 2011

Нет.Полагаю, вы надеялись, что что-то вроде num1 = 20 if someBoolValue сработает, но это не так.Я думаю, что лучший способ - использовать оператор if, как вы его написали:

if someBoolValue:
    num1 = 20
3 голосов
/ 09 декабря 2017
num1 = 10 + 10*(someBoolValue == True)

Это мой новый окончательный ответ.Предыдущий ответ был следующим и был излишним для указанной проблемы.Getting_too_clever == not Good.Вот предыдущий ответ ... все еще хорошо, если вы хотите добавить одну вещь для True cond и другую для False:

num1 = 10 + (0,10)[someBoolValue == True]

Вы упомянули, что num1 уже будет иметь значение, которое следует оставитьв одиночестве.Я предположил num1 = 10, так как это первое утверждение в сообщении, поэтому операция, чтобы добраться до 20, заключается в добавлении 10.

num1 = 10
someBoolValue = True

num1 = 10 + (0,10)[someBoolValue == True]

print(f'num1 = {num1}\nsomeBoolValue = {someBoolValue}')

, сгенерировавшем этот вывод

num1 = 20
someBoolValue = True
1 голос
/ 29 сентября 2015
num1 = 20 * someBoolValue or num1
0 голосов
/ 27 апреля 2019

Если вы хотите вызвать метод, если какое-то логическое значение истинно, вы можете поставить else None, чтобы прервать процесс трина.

>>> a=1
>>> print(a) if a==1 else None
1
>>> print(a) if a==2 else None
>>> a=2
>>> print(a) if a==2 else None
2
>>> print(a) if a==1 else None
>>>
0 голосов
/ 11 декабря 2018

Другой способ num1 = (20*boolVar)+(num1*(not boolVar))

0 голосов
/ 25 июля 2018

Вот что я могу предложить.Используйте другую переменную для получения предложения if и присвойте ему значение num1.

Код:

num2 =20 if someBoolValue else num1
num1=num2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...