Одна строка, если-условие-присваивание

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

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 часть.

Спасибо

9 ответов

Решение

Я не думаю, что это возможно в 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 работает немного по-другому.

Использовать этот:

num1 = 20 if someBoolValue else num1

Для будущих путешественников во времени из Google есть новый способ (доступен начиная с Python 3.8):

b = 1
if a := b:
    # this section is only reached if b is not 0 or false.
    # Also, a is set to b
    print(a, b)

В одной строке:

if someBoolValue: num1 = 20

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

if someBoolValue:
    num1 = 20

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

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

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

(falseVal, trueVal)[TEST]

TEST and trueVal or falseVal

Если вы определенно собираетесь использовать однострочный код, Python 3.8 вводит выражения присваивания, известные как "оператор моржа".

:=

someBoolValue and (num := 20)

В 20 будет назначен num если первое логическое выражение True. Присваивание должно быть заключено в круглые скобки, иначе вы получите синтаксическую ошибку.

num = 10
someBoolValue = True

someBoolValue and (num := 20)
print(num) # 20

num = 10
someBoolValue = False

someBoolValue and (num := 20)
print(num) # 10
num1 = 10 + 10*(someBoolValue == True)

Это мой новый окончательный ответ. Предыдущий ответ был следующим и был излишним для указанной проблемы. Getting_too_clever == not Good, Вот предварительный ответ... все еще хорошо, если вы хотите добавить одну вещь для True конд и другой для 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

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

if someBoolValue:
    num1 = 20

Если вы хотите вызвать метод, если какое-то логическое значение истинно, вы можете поставить 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
>>>
num1 = 20 * someBoolValue or num1

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

Код:

num2 =20 if someBoolValue else num1
num1=num2

Вы можете определенно использовать num1 = (20, если someBoolValue еще num1), если хотите.

По-другомуnum1 = (20*boolVar)+(num1*(not boolVar))

Вы можете сделать это так.

try:
    a = [i for i in [20] if False][0]
except IndexError:
    print("Do what ever you want here")

Вы можете решить свою проблему таким образом, но использование блока try/except - не лучшая практика для python.

Другие вопросы по тегам