Python有三元条件运算符吗?

Dev*_*ted 5591 python operators ternary-operator conditional-operator

如果Python没有三元条件运算符,是否可以使用其他语言结构模拟一个?

Vin*_*vic 6566

是的,它是在2.5版本中添加的.表达式语法是:

a if condition else b
Run Code Online (Sandbox Code Playgroud)

首先condition进行评估,然后根据布尔值对它们中的任何一个进行评估ab评估并返回.如果求值为,则进行求值并返回但忽略,否则何时求值并返回但忽略.conditionconditionTrueabba

这允许短路,因为何时condition为真仅a被评估并且b根本不被评估,但是当condition为假时仅b评估并且a根本不评估.

例如:

>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'
Run Code Online (Sandbox Code Playgroud)

请注意,条件语句表达式,而不是语句.这意味着您不能在条件表达式中使用赋值语句pass或其他语句:

>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您必须使用普通if 语句而不是条件表达式.


请记住,由于以下几个原因,一些Pythonist对此不满意:

  • 参数的顺序condition ? a : b与许多其他语言(例如C,C++,Go,Perl,Ruby,Java,Javascript等)的经典三元运算符的顺序不同,当人们不熟悉Python时,这可能会导致错误.令人惊讶的"行为使用它(它们可能会颠倒参数顺序).
  • 有些人觉得它"笨拙",因为它与正常的思维流程相反(首先考虑条件然后再考虑影响).
  • 文体的原因.

如果您在记住订单时遇到问题,请记住,当您大声朗读时,您(几乎)会说出您的意思.例如,if大声朗读为x = 4 if b > 8 else 9.

官方文件:

  • 编码器的顺序可能看起来很奇怪,但是`f(x)= | x | = x if x> 0 else -x`对于数学家来说听起来很自然.在大多数情况下,您也可以像A一样理解它,除非C然后你应该做B而不是...... (232认同)
  • 使用时请注意操作顺序.例如,行'z = 3 + x如果x <y else y`.如果`x = 2`和'y = 1`,你可能会期望得到4,但它实际上会产生1.`z = 3 +(x,如果x> y,否则y)`是正确的用法. (102认同)
  • 关键是如果你想在评估条件之后执行额外的评估*,比如在结果中添加一个值,你需要在两边添加额外的表达式(`z = 3 + x if x <y否则3 + y`),或者将条件分组(`z = 3 +(x if x <y else y)`或`z =(x if x <y else y)+ 3`) (8认同)
  • @MrGeek,我明白你的意思,所以你会基本上被嵌套操作:`"富"如果布尔其他("酒吧",如果布尔其他"FOOBAR")` (3认同)
  • 程序员甚至比数学家更需要精确正确的公式化,因为在数学中总是诉诸于基础概念。一个令人信服的参数是%运算符,模仿数学中使用“ mod”的方式将是一场灾难。所以不,我不接受你的论点。就像坚持帝国单位一样。Groetjes Albert (3认同)
  • @KalZekdor 我读到了这篇文章并期望 1...我花了几秒钟才明白你必须如何阅读它才能使 4 成为可能。 (3认同)
  • 很好的答案,但是,这种语法对我来说看起来很糟糕。他们应该以 C# 方式“结果=条件?”来实现它。conditiontrue_expression : conditionfalse_expression` 而不是滥用 `if` 来实现这一点。`If​​` 看起来根本不像一个运算符。 (2认同)
  • Python 尽量避免使用符号运算符。对于*你*来说,“if”可能看起来不够像一个运算符,但是“...”?... : ...` 假设熟悉 C 才能真正有意义。 (2认同)

Lan*_*uhn 738

您可以索引到元组:

(falseValue, trueValue)[test]
Run Code Online (Sandbox Code Playgroud)

test需要返回TrueFalse.
总是将它实现为以下可能更安全:

(falseValue, trueValue)[test == True]
Run Code Online (Sandbox Code Playgroud)

或者您可以使用内置bool()来确保布尔值:

(falseValue, trueValue)[bool(<expression>)]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这个总是评估所有内容,而if/else构造只评估获胜表达式. (558认同)
  • `(lambda:print("a"),lambda:print("b"))[test == true]()` (110认同)
  • 应该注意的是,`[]`中的内容可以是任意表达式.另外,为了安全起见,您可以通过编写`[bool(<expression>)]来明确地测试真实性.`bool()`函数自v2.2.1起已经存在. (15认同)
  • 这对于代码高尔夫而言非常有用,而不是实际的代码.虽然我已经习惯了它,但是当我做一些明显的事情(比如在两个字符串常量之间选择)时,我有时会使用它来简洁. (14认同)
  • 我做了一个类似的技巧 - 只做了一次或两次,但做到了 - 通过索引到一个带有'True`和`False`作为键的字典:`{True:trueValue,False:falseValue} [test]`我不知道这是否效率低,但它至少避免了整个"优雅"与"丑陋"的争论.你没有处理布尔值而不是int的歧义. (12认同)
  • 毫无疑问,这是一个“酷”且有趣的想法。但现实生活中的代码应该易于阅读并且最不容易出错。如果我的一位开发人员使用了这个,我会要求他更改它。由于恕我直言,这不应该在生产代码中使用,因此我对答案投了反对票。 (3认同)
  • 这是python中的惯用语吗?似乎令人困惑,但也许是它的惯例 (2认同)
  • [与单身人士的比较应始终使用is / is而非==](https://www.python.org/dev/peps/pep-0008/#programming-recommendations) (2认同)
  • 如果此技巧始终评估两种可能的结果,并避免跳过代码(“ if”跳过),则可能有助于避免基于定时的算法攻击。 (2认同)

Jam*_*ady 314

对于2.5之前的版本,有诀窍:

[expression] and [on_true] or [on_false]
Run Code Online (Sandbox Code Playgroud)

on_true 具有false布尔值时,它可能会给出错误的结果.1
虽然它确实有从左到右评估表达式的好处,但在我看来更清楚.

1. 是否有相当于C的"?:"三元运算符?

  • 解决方法是使用(test和[true_value]或[false_value])[0],这可以避免这个陷阱. (63认同)
  • @volcano你有我的来源吗? (5认同)
  • 三元运算符通常执行得更快(有时为10-25%). (4认同)
  • @OrangeTux [这是反汇编代码](https://tio.run/##bcoxCoAwEETRPqeY0kCwsPQ2kmR1QZOwWQtPH4OClQO/GV65dMtpao2PkkURuBoTIoEG76AOZGeDPol6SoKCCR5xrxH0yvVfeiwpdJ/lgVzH3kDWFOGk37Ha1m4).使用ThomasH建议的方法会更慢. (3认同)

Sim*_*ann 237

expression1 if condition else expression2

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
Run Code Online (Sandbox Code Playgroud)

  • 这一点强调了三元运算符的主要意图:价值选择.它还表明,不止一个三元可以链接在一起形成一个表达式. (81认同)
  • @Craig,我同意,但知道在没有括号时会发生什么也是有帮助的.在实际代码中,我也倾向于插入明确的parens. (5认同)

Mic*_*urr 140

文档:

条件表达式(有时称为"三元运算符")具有所有Python操作的最低优先级.

表达式x if C else y首先评估条件C(不是x); 如果C为真,则计算x并返回其值; 否则,评估y并返回其值.

有关条件表达式的更多详细信息,请参阅PEP 308.

自2.5版以来的新版本.


ken*_*orb 103

作为Python Enhancement Proposal 308的一部分,2006年添加了Python中条件表达式的运算符.它的形式与普通?:运营商不同,它是:

<expression1> if <condition> else <expression2>
Run Code Online (Sandbox Code Playgroud)

这相当于:

if <condition>: <expression1> else: <expression2>
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

result = x if a > b else y
Run Code Online (Sandbox Code Playgroud)

可以使用的另一种语法(与2.5之前的版本兼容):

result = (lambda:y, lambda:x)[a > b]()
Run Code Online (Sandbox Code Playgroud)

操作数被懒惰评估的地方.

另一种方法是索引一个元组(与大多数其他语言的条件运算符不一致):

result = (y, x)[a > b]
Run Code Online (Sandbox Code Playgroud)

或明确构造的字典:

result = {True: x, False: y}[a > b]
Run Code Online (Sandbox Code Playgroud)

另一个(不太可靠)但更简单的方法是使用andor运算符:

result = (a > b) and x or y
Run Code Online (Sandbox Code Playgroud)

但如果x这样做,这将无法奏效False.

可能的解决方法是制作xy列出或元组,如下所示:

result = ((a > b) and [x] or [y])[0]
Run Code Online (Sandbox Code Playgroud)

要么:

result = ((a > b) and (x,) or (y,))[0]
Run Code Online (Sandbox Code Playgroud)

如果您正在使用词典,而不是使用三元条件,您可以利用get(key, default),例如:

shell = os.environ.get('SHELL', "/bin/sh")
Run Code Online (Sandbox Code Playgroud)

资料来源:?:维基百科的Python

  • `result = {1: x, 0: y}[a &gt; b]` 是另一种可能的变体(`True` 和 `False` 实际上是值为 `1` 和 `0` 的整数) (2认同)

gor*_*sky 89

@up:

不幸的是,

(falseValue, trueValue)[test]
Run Code Online (Sandbox Code Playgroud)

解决方案没有短路行为; 因此,无论条件如何,都会评估falseValue和trueValue.这可能是次优的甚至是错误的(即trueValue和falseValue都可能是方法并且有副作用).

对此的一个解决方案是

(lambda: falseValue, lambda: trueValue)[test]()
Run Code Online (Sandbox Code Playgroud)

(执行延迟到获胜者已知;)),但它引入了可调用和不可调用对象之间的不一致.另外,它没有解决使用属性时的情况.

故事如此 - 在3个提到的解决方案之间进行选择是在具有短路功能,至少使用python 2.5(恕我直言不再是问题)之间进行权衡,而不是倾向于"trueValue-evaluates-to-false"错误.

  • 虽然 lambdas 技巧的元组有效,但它大约需要三元运算符的 3 倍。如果它可以替换一长串“if else if”,它可能只是一个合理的想法。 (3认同)

Sim*_*ans 62

三元运算符在不同的编程语言中

在这里,我试着展示一些ternary operator编程语言之间的一些重要区别.

Javascript中的三元运算符

var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0
Run Code Online (Sandbox Code Playgroud)

Ruby中的三元运算符

a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0
Run Code Online (Sandbox Code Playgroud)

Scala中的三元运算符

val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0
Run Code Online (Sandbox Code Playgroud)

R编程中的三元运算符

a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0
Run Code Online (Sandbox Code Playgroud)

Python中的三元运算符

a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
Run Code Online (Sandbox Code Playgroud)

  • 这[博客发现python的三元运算符与大多数其他语言不必要地不同](https://archive.is/yqwSh). (12认同)
  • 听起来似乎很固执;但是从本质上说的是,一个从未见过三元运算符的人很可能会理解Python语法,而除非首先被告知含义,否则很少有人会理解更常见的语法。 (4认同)
  • Ruby也可以使用`a = true?1:0` (3认同)
  • Algol68:a=.if。。真的。。然后。1.其他。0 .fi。这也可以表示为 a=(.true.|1|0) 像往常一样,Algol68 是对其继任者的改进。 (2认同)
  • @VarunGarg但是当然你可以在Python中说“print(a或'alt text')”。 (2认同)

Pao*_*olo 59

对于Python 2.5及更高版本,有一个特定的语法:

[on_true] if [cond] else [on_false]
Run Code Online (Sandbox Code Playgroud)

在较旧的Pythons中,没有实现三元运算符,但可以模拟它.

cond and on_true or on_false
Run Code Online (Sandbox Code Playgroud)

但是,有一个潜在的问题,如果cond评估Trueon_true评估False然后on_false返回而不是on_true.如果你想要这种行为方法是好的,否则使用这个:

{True: on_true, False: on_false}[cond is True] # is True, not == True
Run Code Online (Sandbox Code Playgroud)

可以包装:

def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用:

q(cond, on_true, on_false)
Run Code Online (Sandbox Code Playgroud)

它与所有Python版本兼容.

  • 为什么不`bool(cond)`而不是'cond'是真的?前者检查`cond`的真实性,后者检​​查指针与'True`对象的相等性.正如@AndrewCecil强调的那样,``blob'`是真的,但它不是真的. (5认同)
  • 行为不一样 - `q("blob",on_true,on_false)`返回`on_false`,而`on_true如果cond else on_false`返回`on_true`.解决方法是在这些情况下用`cond is not None'替换`cond`,尽管这不是一个完美的解决方案. (2认同)

小智 38

你可能经常会发现

cond and on_true or on_false
Run Code Online (Sandbox Code Playgroud)

但这在on_true == 0时会导致问题

>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1
Run Code Online (Sandbox Code Playgroud)

你可以期望正常的三元运算符得到这个结果

>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1
Run Code Online (Sandbox Code Playgroud)


Aar*_*all 32

Python有三元条件运算符吗?

是.从语法文件:

test: or_test ['if' or_test 'else' test] | lambdef
Run Code Online (Sandbox Code Playgroud)

感兴趣的部分是:

or_test ['if' or_test 'else' test]
Run Code Online (Sandbox Code Playgroud)

因此,三元条件操作的形式如下:

expression1 if expression2 else expression3
Run Code Online (Sandbox Code Playgroud)

expression3将被懒惰地评估(即,仅expression2在布尔上下文中为false时进行求值).而且由于递归定义,你可以无限地链接它们(虽然它可能被认为是糟糕的风格.)

expression1 if expression2 else expression3 if expression4 else expression5 # and so on
Run Code Online (Sandbox Code Playgroud)

使用说明:

请注意,每个if必须遵循一个else.人们学习列表推导和生成器表达式可能会发现这是一个难以学习的课程 - 以下将无法工作,因为Python期望第三个表达式为else:

[expression1 if expression2 for element in iterable]
#                          ^-- need an else here
Run Code Online (Sandbox Code Playgroud)

提出了一个SyntaxError: invalid syntax.所以上面要么是一个不完整的逻辑(也许用户期望在错误条件下没有操作),或者可能的目的是使用expression2作为过滤器 - 注意以下是合法的Python:

[expression1 for element in iterable if expression2]
Run Code Online (Sandbox Code Playgroud)

expression2作为列表推导的过滤器,不是三元条件运算符.

更窄的案例的替代语法:

您可能会发现编写以下内容有点痛苦:

expression1 if expression1 else expression2
Run Code Online (Sandbox Code Playgroud)

expression1必须使用上述用法进行两次评估.如果它只是一个局部变量,它可以限制冗余.然而,这个用例的常见和高性能的Pythonic习语是使用or的快捷行为:

expression1 or expression2
Run Code Online (Sandbox Code Playgroud)

这在语义上是等价的.请注意,某些样式指南可能会在明确的基础上限制此用法 - 它确实在很少的语法中包含了很多含义.


Wal*_*oss 26

Python条件表达式的替代方案之一

"yes" if boolean else "no"
Run Code Online (Sandbox Code Playgroud)

如下:

{True:"yes", False:"no"}[boolean]
Run Code Online (Sandbox Code Playgroud)

它具有以下不错的扩展名:

{True:"yes", False:"no", None:"maybe"}[boolean_or_none]
Run Code Online (Sandbox Code Playgroud)

最短的选择仍然是:

("no", "yes")[boolean]
Run Code Online (Sandbox Code Playgroud)

但别无选择

yes() if boolean else no()
Run Code Online (Sandbox Code Playgroud)

如果你想避免对yes() and 的评估no(),因为在

(no(), yes())[boolean]  # bad
Run Code Online (Sandbox Code Playgroud)

no()yes()评估。


Sas*_*ddi 20

模拟python三元运算符.

例如

a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()
Run Code Online (Sandbox Code Playgroud)

输出:

'b greater than a'
Run Code Online (Sandbox Code Playgroud)

  • @GrijeshChauhan因为在"compliated"表达式上,例如涉及函数调用等,这将在两种情况下执行.这可能不是想要的. (5认同)
  • 使用“lambda”函数对于这个问题来说是多余的 (2认同)

Nat*_*hat 18

你可以这样做 :-

[condition] and [expression_1] or [expression_2] ;

例:-

print(number%2 and "odd" or "even")

如果数字是奇数,这将打印"奇数"或如果数字是偶数则打印"偶数".


结果: - 如果条件为真,则执行exp_1,否则执行exp_2.

注意: - 0,None,False,emptylist,emptyString计算结果为False.并且除0之外的任何数据都评估为True.

以下是它的工作原理:

如果条件[条件]变为"真",那么将评估expression_1但不计算表达式_2.如果我们"和"带0(零)的东西,结果总是很明显.所以在下面的陈述中,

0 and exp
Run Code Online (Sandbox Code Playgroud)

表达式exp将不会被评估,因为"和"0将始终求值为零,并且不需要计算表达式.这是编译器本身在所有语言中的工作方式.

1 or exp
Run Code Online (Sandbox Code Playgroud)

表达式exp将不会被评估,因为"或"1总是为1.所以它不会费心去评估表达式exp,因为结果将是1.(编译器优化方法).

但是如果是的话

True and exp1 or exp2
Run Code Online (Sandbox Code Playgroud)

第二个表达式exp2将不会被计算,因为True and exp1当exp1不为false时,它将为True.

同样地

False and exp1 or exp2
Run Code Online (Sandbox Code Playgroud)

表达式exp1将不会被计算,因为False相当于写0并且0表示"和"本身是0但是在使用"或"之后的exp1之后,它将在"或"之后计算表达式exp2.


注意: -这种使用"或"和"和"的分支只能在expression_1的Truth值不为False(或0或None或emptylist []或emptystring''时使用.)因为expression_1变为如果为false,则将评估expression_2,因为exp_1和exp_2之间存在"或".

如果您仍然想让它适用于所有情况,无论exp_1和exp_2的真值是什么,请执行以下操作: -

[condition] and ([expression_1] or 1) or [expression_2] ;


Ali*_*aji 17

三元条件运算符只允许在单行中测试条件替换多行if-else使代码紧凑.

句法 :

[on_true] if [expression] else [on_false]

1-使用三元运算符的简单方法:

# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10
Run Code Online (Sandbox Code Playgroud)

2-直接使用元组,字典和lambda的方法:

# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10
Run Code Online (Sandbox Code Playgroud)

3-三元运算符可以写为嵌套if-else:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")
Run Code Online (Sandbox Code Playgroud)

以上方法可写为:

# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a
Run Code Online (Sandbox Code Playgroud)


Fra*_*ank 15

正如已经回答的那样,是的,python 中有一个三元运算符:

<expression 1> if <condition> else <expression 2>
Run Code Online (Sandbox Code Playgroud)

附加信息:

如果<expression 1>是条件,您可以使用Short-cirquit 评估

<expression 1> if <condition> else <expression 2>
Run Code Online (Sandbox Code Playgroud)

PS:当然,短路评估不是三元运算符,但通常在短路足够的情况下使用三元。


Tod*_*kov 14

更多的提示而不是答案(不需要在hundreth时间重复显而易见的事情),但我有时会将其用作此类构造中的oneliner快捷方式:

if conditionX:
    print('yes')
else:
    print('nah')
Run Code Online (Sandbox Code Playgroud)

,成为:

print('yes') if conditionX else print('nah')
Run Code Online (Sandbox Code Playgroud)

有些(很多:)可能会把它当作unpythonic(甚至是ruby-ish :),但我个人认为它更自然 - 即你如何正常表达它,以及在大块代码中更具视觉吸引力.

  • 我更喜欢`print('yes',如果conditionX别'nah')`你的答案.:-) (5认同)

小智 14

Vinko Vrsalovic 的回答已经足够好了。还有一件事:

请注意,条件是一个表达式,而不是一个语句。这意味着您不能在条件表达式中使用赋值语句pass或其他语句

Python 3.8 中的海象运算符

在 Python 3.8 中引入了海象运算符之后,发生了一些变化。

(a := 3) if True else (b := 5)
Run Code Online (Sandbox Code Playgroud)

a = 3b is not defined,

(a := 3) if False else (b := 5)
Run Code Online (Sandbox Code Playgroud)

a is not definedb = 5,和

c = (a := 3) if False else (b := 5)
Run Code Online (Sandbox Code Playgroud)

给出c = 5a is not definedb = 5

即使这可能很丑陋,在 Python 3.8 之后可以条件表达式中完成赋值。无论如何,在这种情况下最好使用普通语句if

  • @AndrewAnderson 不,这并不多余。您应该比较第一个和第二个示例。您可以将它们结合起来并考虑:`(a := 3) if x else (b := 5)`,您总是会分配到`a`或`b`,而不是两者都分配。但是,考虑 `a = 3 if x else (b := 5)`,当 `x == False` 时,您将得到 `a = 5` 和 `b = 5`,它们都被赋值。 (2认同)

shi*_*tej 12

a if condition else b
Run Code Online (Sandbox Code Playgroud)

如果您在记忆中遇到问题,请记住这个金字塔:

     condition
  if           else
a                   b 
Run Code Online (Sandbox Code Playgroud)


Geo*_*ili 12

Python 中三元运算符的语法为:

\n

[on_true] if [expression] else [on_false]

\n

使用该语法,我们将如何使用 Python\xe2\x80\x99s 三元运算符重写上面的代码:

\n
game_type = \'home\'\nshirt = \'white\' if game_type == \'home\' else \'green\'\n\n
Run Code Online (Sandbox Code Playgroud)\n

它仍然很清楚,但要短得多。请注意,表达式可以是任何类型的表达式,包括返回计算结果为 True 或 False 的值的函数调用。

\n


rea*_*rma 10

是的,python有一个三元运算符,这里是语法和示例代码来演示相同:)

#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")
Run Code Online (Sandbox Code Playgroud)


use*_*967 7

其他答案正确地谈论了 Python 三元运算符。我想通过提及一个经常使用三元运算符但有更好的习惯用法的场景来补充。这是使用默认值的场景。

假设我们想使用option_value默认值(如果未设置):

run_algorithm(option_value if option_value is not None else 10)
Run Code Online (Sandbox Code Playgroud)

或者,如果option_value从未设置为falsy值(0""等),简单地

run_algorithm(option_value if option_value else 10)
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,更好的解决方案是简单地编写

run_algorithm(option_value or 10)
Run Code Online (Sandbox Code Playgroud)

  • 至于它看起来很奇怪,我想知道它对你来说是否看起来很奇怪,因为你注意到了不精确性(它并不真正等效)。对我来说,这听起来很自然,因为它让我想起用英语说:“使用这个或那个(如果第一个选项不可用)”。但这当然是主观的。知道它对每个人来说看起来并不自然是很有用的。 (4认同)
  • 一个有价值的补充,但我不同意:“option_value or 10”*不*比“option_value if option_value is not None else 10”更好。它确实更短,但对我来说看起来很奇怪,并且可能会导致错误。例如,如果“option_value = 0”会发生什么?第一个片段将运行“run_algorithm(0)”,因为“option_value”不是“None”。然而,第二个和第三个片段将运行“run_algorithm(10)”,因为“0”是一个假值。这两个片段并不等同,因此一个片段并不比另一个片段更好。并且显式的比隐式的要好。 (3认同)
  • 好多了!感谢您对“或”习语的解释。这对我来说看起来很奇怪,因为我倾向于将“or”视为将两个参数映射到布尔值的函数,因此我希望它返回“True”或“False”(这在许多其他编程语言中都会发生)。但“使用这个或那个”是一个很好的助记符,肯定会帮助我(也希望其他人)记住这个模式。 (2认同)

小智 7

Pythonic 的做事方式:

"true" if var else "false"
Run Code Online (Sandbox Code Playgroud)

但也总是存在一种不同的方法来处理三元条件:

"true" and var or "false"
Run Code Online (Sandbox Code Playgroud)


Tod*_*odd 6

Python 有一个三元形式的赋值;然而,人们应该知道甚至可能有更短的形式。

需要根据条件为变量分配一个或另一个值是很常见的。

>>> li1 = None
>>> li2 = [1, 2, 3]
>>> 
>>> if li1:
...     a = li1
... else:
...     a = li2
...     
>>> a
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

^ 这是完成此类作业的长格式。

下面是三元形式。但这不是最简洁的方式 - 见最后一个例子。

>>> a = li1 if li1 else li2
>>> 
>>> a
[1, 2, 3]
>>> 
Run Code Online (Sandbox Code Playgroud)

使用 Python,您可以简单地or用于替代分配。

>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 
Run Code Online (Sandbox Code Playgroud)

上面的工作是因为li1None,并且 interp 在逻辑表达式中将其视为 False 。然后 interp 继续并计算第二个表达式,它不是None,也不是空列表 - 所以它被分配给 a。

这也适用于空列表。例如,如果您想分配a具有项目的任何列表。

>>> li1 = []
>>> li2 = [1, 2, 3]
>>> 
>>> a = li1 or li2
>>> 
>>> a
[1, 2, 3]
>>> 
Run Code Online (Sandbox Code Playgroud)

知道了这一点,您可以在遇到此类任务时简单地进行此类分配。这也适用于字符串和其他可迭代对象。您可以分配a任何不为空的字符串。

>>> s1 = ''
>>> s2 = 'hello world'
>>> 
>>> a = s1 or s2
>>> 
>>> a
'hello world'
>>> 
Run Code Online (Sandbox Code Playgroud)

我一直喜欢 C 三元语法,但 Python 更进了一步!

我知道有些人可能会说这不是一个好的风格选择,因为它依赖于并非对所有开发人员都立即显而易见的机制。我个人不同意这种观点。Python 是一种语法丰富的语言,它有许多惯用技巧,但对于笨手笨脚的人来说,这些技巧并不是立即显而易见的。但是,您对底层系统的机制了解和了解得越多,您就越欣赏它。


ARG*_*Geo 5

许多派生自的编程语言C通常具有以下三元条件运算符的语法:

<condition> ? <expression1> : <expression2>
Run Code Online (Sandbox Code Playgroud)

起初,Python enevolent d ictator ˚F大号 IFE(我的意思是吉多·范罗苏姆,当然)拒绝了(非Python化风格),因为它是挺难理解不习惯的人C的语言。另外,冒号在中:已经有很多用途Python。在PEP 308批准后,Python最终收到了自己的快捷方式条件表达式(我们现在使用的是):

<expression1> if <condition> else <expression2>
Run Code Online (Sandbox Code Playgroud)

因此,首先它评估条件。如果返回True,则将对expression1求值以给出结果,否则将对expression2求值。由于懒惰的评估机制–仅执行一个表达式。

以下是一些示例(条件将从左到右评估):

pressure = 10
print('High' if pressure < 20 else 'Critical')

# Result is 'High'
Run Code Online (Sandbox Code Playgroud)

三元运算符可以串联在一起:

pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')

# Result is 'Normal'
Run Code Online (Sandbox Code Playgroud)

下一个与上一个相同:

pressure = 5

if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')

# Result is 'Normal'
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。