Я попробовал один с моим проектом. Это позволяет номерам с + | -
знаками.
/^(\+|-)?[0-9]{0,}((\.){1}[0-9]{1,}){0,1}$/
Да, это было , добавил в версии 2.5. Синтаксис выражения:
a if condition else b
Первый condition
оценен, затем точно, один из a
или b
оценен и возвращен на основе булевская переменная значение condition
. Если condition
оценивает к True
, то a
оценен и возвращен, но b
проигнорирован, или иначе когда b
оценен и возвращен, но a
проигнорирован.
Это позволяет закорачивать, потому что то, когда condition
верно, что только [1 115] оценены и b
, не оценено вообще, но когда condition
ложь только [1 118] оценены, и a
не оценен вообще.
, Например:
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Примечание, что условные выражения выражение , не оператор . Это означает, что Вы не можете использовать операторы присваивания или pass
или другой операторы в условном выражении выражение :
>>> pass if False else x = 3
File "<stdin>", line 1
pass if False else x = 3
^
SyntaxError: invalid syntax
можно, однако, использовать условные выражения для присвоения переменной как так:
x = a if True else b
Думают об условном выражении как переключающийся между двумя значениями. Очень полезно, когда Вы находитесь в 'одном значении или другой' ситуации, этом, но еще не делает многого.
, Если необходимо использовать операторы, необходимо использовать нормальное if
оператор вместо условного выражения , выражение .
Имеет в виду, что осуждено некоторым Pythonistas по нескольким причинам:
condition ? a : b
тернарный оператор со многих других языков (таких как C, C++, Пойдите, Perl, Ruby, Java, JavaScript, и т.д.), который может привести к ошибкам, когда люди, незнакомые с "удивительным" поведением Python, используют его (они могут инвертировать порядок аргументов). if
' может быть действительно полезны, и сделать Ваш сценарий более кратким, он действительно усложняет Ваш код) при наличии затруднений при запоминании порядка затем помните, что при чтении вслух Вы (почти) говорите, что Вы имеете в виду. Например, x = 4 if b > 8 else 9
читается вслух как [1 125].
Официальная документация:
Можно индексировать в кортеж:
(falseValue, trueValue)[test]
test
потребности возвратиться Верный или Ложь .
могло бы быть более безопасно всегда реализовать его как:
(falseValue, trueValue)[test == True]
или можно использовать встроенное bool()
для уверения булевская переменная значение:
(falseValue, trueValue)[bool(<expression>)]
От документация :
Условные выражения (иногда названный “ternary operator”) имеют самый низкий приоритет всех операций Python.
выражение
x if C else y
сначала оценивает условие, C ( не x ); если C верен, , x оценен, и его значение возвращено; иначе y оценен, и его значение возвращено.См. PEP 308 для получения дополнительной информации об условных выражениях.
Новый начиная с версии 2.5.
Для версий до 2,5, существует прием:
[expression] and [on_true] or [on_false]
Это может дать неправильные результаты, когда on_true
имеет ложное булево значение. <глоток> 1 глоток>
, Хотя это действительно обладает преимуществом оценки выражений слева направо, который более ясен, по-моему.
Как уже отвечено, да в Python существует тернарный оператор:
<expression 1> if <condition> else <expression 2>
Дополнительная информация:
, Если <expression 1>
условие, можно использовать Короткая-cirquit оценка :
a = True
b = False
# Instead of this:
x = a if a else b
# You could use Short-cirquit evaluation:
x = a or b
пз: Конечно, Короткая-cirquit оценка не является тернарным оператором, но часто троичное используется в случаях, где короткое замыкание было бы достаточно.
is_spacial=True if gender = "Female" else (True if age >= 65 else False)
**
это может быть вложено как Ваша потребность. всего наилучшего
**
Unfortunately, the
(falseValue, trueValue)[test]
solution doesn't have short-circuit behaviour; thus both falseValue
and trueValue
are evaluated regardless of the condition. This could be suboptimal or even buggy (i.e. both trueValue
and falseValue
could be methods and have side-effects).
One solution to this would be
(lambda: falseValue, lambda: trueValue)[test]()
(execution delayed until the winner is known ;)), but it introduces inconsistency between callable and non-callable objects. In addition, it doesn't solve the case when using properties.
And so the story goes - choosing between 3 mentioned solutions is a trade-off between having the short-circuit feature, using at least Зython 2.5 (IMHO not a problem anymore) and not being prone to "trueValue
-evaluates-to-false" errors.
a = 1
b = 2
1 if a > b else -1
# Output is -1
1 if a > b else -1 if a < b else 0
# Output is -1