Одна строка, если-условие-присваивание
У меня есть следующий код
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 работает немного по-другому.
Для будущих путешественников во времени из 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
>>>
Вот что я могу предложить. Используйте другую переменную, чтобы получить предложение if и присвоить его num1.
Код:
num2 =20 if someBoolValue else num1
num1=num2
Вы можете определенно использовать num1 = (20, если someBoolValue еще num1), если хотите.
Вы можете сделать это так.
try:
a = [i for i in [20] if False][0]
except IndexError:
print("Do what ever you want here")
Вы можете решить свою проблему таким образом, но использование блока try/except - не лучшая практика для python.