如果Python没有三元条件运算符,是否可以使用其他语言结构来模拟它?
是的,它是在2.5版中添加的。表达式语法为:
1 | a if condition else b |
首先计算
这允许短路,因为当
例如:
1 2 3 4 | >>> 'true' if True else 'false' 'true' >>> 'true' if False else 'false' 'false' |
注意,条件句是表达式,而不是语句。这意味着您不能在条件表达式中使用赋值语句或
1 2 3 4 5 | >>> pass if False else x = 3 File"<stdin>", line 1 pass if False else x = 3 ^ SyntaxError: invalid syntax |
在这种情况下,必须使用普通的
请记住,一些毕达哥拉斯学派的人不赞成这样做有以下几个原因:
参数的顺序与许多其他语言(如C、c++、Go、Perl、Ruby、Java、Javascript等)中的经典如果你记不住顺序,那么请记住,当你大声朗读时,你(几乎)说出了你的意思。例如,
官方文档:
条件表达式是否存在C的等价物?:"三元操作符?你可以索引成一个元组:
1 | (falseValue, trueValue)[test] |
1 | (falseValue, trueValue)[test == True] |
或者您可以使用内置的
1 | (falseValue, trueValue)[bool(<expression>)] |
对于2.5之前的版本,有一个技巧:
1 | [expression] and [on_true] or [on_false] |
当
<子> 1。是否存在C的等价物?:"三元操作符? < /订阅>
if条件else
1 2 3 4 5 6 | >>> a = 1 >>> b = 2 >>> 1 if a > b else -1 -1 >>> 1 if a > b else -1 if a < b else 0 -1 |
从文档:
Conditional expressions (sometimes called a"ternary operator") have the lowest priority of all Python operations.
The expression
x if C else y first evaluates the condition, C (not x); if C is true, x is evaluated and its value is returned; otherwise, y is evaluated and its value is returned.See PEP 308 for more details about conditional expressions.
自2.5版以来的新版本。
作为Python增强建议308的一部分,在2006年添加了一个Python条件表达式的运算符。它的形式不同于普通的
1 | <expression1> if <condition> else <expression2> |
即等于:
1 | if <condition>: <expression1> else: <expression2> |
举个例子:
1 | result = x if a > b else y |
可以使用的另一种语法(与2.5之前的版本兼容):
1 | result = (lambda:y, lambda:x)[a > b]() |
操作数是惰性计算的。
另一种方法是索引一个元组(这与大多数其他语言的条件运算符不一致):
1 | result = (y, x)[a > b] |
或显式构造字典:
1 | result = {True: x, False: y}[a > b] |
另一种(不太可靠)但更简单的方法是使用
1 | result = (a > b) and x or y |
但是,如果
一种可能的解决方法是如下所示制作
1 | result = ((a > b) and [x] or [y])[0] |
或者:
1 | result = ((a > b) and (x,) or (y,))[0] |
如果你使用字典,而不是使用三元条件句,你可以利用
1 | shell = os.environ.get('SHELL',"/bin/sh") |
Source: ?: in Python at Wikipedia
@up:
不幸的是,
1 | (falseValue, trueValue)[test] |
解决方案不具有短路行为;因此,无论条件如何,都要对假价值和真价值进行评估。这可能是次优的,甚至是错误的(例如,真值和假值都可能是方法并有副作用)。
一个解决办法是
1 | (lambda: falseValue, lambda: trueValue)[test]() |
(延迟执行,直到知道赢家;)),但它引入了可调用对象和不可调用对象之间的不一致性。此外,当使用属性时,它也不能解决这个问题。
因此,在上面提到的3个解决方案中进行选择是在具有短路特性(至少使用python 2.5)和不容易出现"真值-值-假"错误之间进行权衡。
对于Python 2.5及更新版本,有一个特定的语法:
1 | [on_true] if [cond] else [on_false] |
在较老的python中,三元运算符没有实现,但是可以模拟它。
1 | cond and on_true or on_false |
但是,有一个潜在的问题,如果
1 | {True: on_true, False: on_false}[cond is True] # is True, not == True |
可以用以下方法包装:
1 2 | def q(cond, on_true, on_false) return {True: on_true, False: on_false}[cond is True] |
用这种方式:
1 | q(cond, on_true, on_false) |
它兼容所有Python版本。
不同编程语言的三元运算符
在这里,我只是想展示几个编程语言之间在
Ternary Operator in Javascript
1 2 3 4 | var a = true ? 1 : 0; # 1 var b = false ? 1 : 0; # 0 |
Ternary Operator in Ruby
1 2 3 4 | a = true ? 1 : 0 # 1 b = false ? 1 : 0 # 0 |
Ternary operator in Scala
1 2 3 4 | val a = true ? 1 | 0 # 1 val b = false ? 1 | 0 # 0 |
Ternary operator in R programming
1 2 3 4 | a <- if (TRUE) 1 else 0 # 1 b <- if (FALSE) 1 else 0 # 0 |
Ternary operator in Python
1 2 3 4 | a = 1 if True else 0 # 1 b = 1 if False else 0 # 0 |
你可能经常会发现
1 | cond and on_true or on_false |
但是当on_true == 0时,就会出现问题
1 2 3 4 5 6 | >>> x = 0 >>> print x == 0 and 0 or 1 1 >>> x = 1 >>> print x == 0 and 0 or 1 1 |
对于一个普通的三元运算符,这个结果在哪里
1 2 3 4 5 6 | >>> x = 0 >>> print 0 if x == 0 else 1 0 >>> x = 1 >>> print 0 if x == 0 else 1 1 |
当然,这非常容易理解。
1 2 3 4 | general syntax : first_expression if bool_expression_is_true else second_expression Example: x= 3 if 3 > 2 else 4 # assigns 3 to x if the boolean expression evaluates to true or 4 if it is false |
Does Python have a ternary conditional operator?
是的。从语法文件中:
1 | test: or_test ['if' or_test 'else' test] | lambdef |
兴趣部分为:
1 | or_test ['if' or_test 'else' test] |
因此,三元条件运算的形式是:
1 | expression1 if expression2 else expression3 |
1 | expression1 if expression2 else expression3 if expression4 else expression5 # and so on |
使用说明:
注意,每个
1 2 | [expression1 if expression2 for element in iterable] # ^-- need an else here |
这就产生了一个
1 | [expression1 for element in iterable if expression2] |
你可能会觉得写下面这些有点痛苦:
1 | expression1 if expression1 else expression2 |
1 | expression1 or expression2 |
这在语义上是等价的。注意,一些样式指南可能会出于清晰的原因限制这种用法——它确实将大量的意思压缩到很少的语法中。
模拟python三元运算符。
例如
1 2 | a, b, x, y = 1, 2, 'a greather than b', 'b greater than a' result = (lambda:y, lambda:x)[a > b]() |
输出:
1 | 'b greater than a' |
三元条件运算符只允许在一行中测试一个条件,而不是多行if-else,这使得代码更紧凑。
语法:
[on_true] if [expression] else [on_false]
1-使用三元运算符的简单方法:
1 2 3 4 5 | # 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 |
2-直接使用元组、字典和lambda:的方法
1 2 3 4 5 6 7 8 9 10 11 | # 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 |
3-三元运算符可以写成嵌套if-else:
1 2 3 4 | # 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") |
上述方法可以写成:
1 2 3 4 5 6 7 8 9 10 | # 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 |
你可以这样做:-
[condition] and [expression_1] or [expression_2] ;
例子:-
print(number%2 and"odd" or"even")
如果数字是奇数,则打印"奇数";如果数字是偶数,则打印"偶数"。
结果:-如果条件为true,则执行exp_1,否则执行exp_2 .注意:- 0,None, False, emptylist, emptyString的计算结果为False。除0外的任何数据都为真。
它是这样工作的:如果条件[condition]变成"True",那么将计算expression_1,而不是expression_2。如果我们用"and"表示某个值为0(0),那么结果总是fasle。
1 | 0 and exp |
表达式exp根本不需要求值,因为带0的"and"总是求值为零,所以不需要求表达式的值。在所有语言中,编译器都是这样工作的。
在
1 | 1 or exp |
表达式exp根本不会被求值,因为带有1的"or"总是1。所以不必对表达式exp求值,因为结果总是1。(编译器优化方法)。
但是万一
1 | True and exp1 or exp2 |
第二个表达式exp2不会被求值,因为当exp1不为false时,
同样在
1 | False and exp1 or exp2 |
表达式exp1不会被求值,因为False等价于写0,用0做"and"本身就是0,但是在使用了"or"之后,它将在"or"之后求表达式exp2的值。
注意:——这种分支使用"或"和"和"时只能使用expression_1没有假的真值(或0或没有或emptylist[]或emptystring ' ')。因为如果expression_1变得虚假,那么expression_2将评估由于存在"或"exp_1和exp_2之间。
如果您仍然想让它适用于所有的情况,无论exp_1和exp_2真值是什么,请执行以下操作:-
[condition] and ([expression_1] or 1) or [expression_2] ;
更多的是一个提示而不是一个答案(不需要重复明显的100次),但有时我在这样的结构中使用它作为一个单一的快捷方式:
1 2 3 4 | if conditionX: print('yes') else: print('nah') |
,变成了:
1 | print('yes') if conditionX else print('nah') |
有些(许多:)可能会认为它不符合python(甚至ruby-ish:),但我个人认为它更自然——即您通常如何表达它,加上在大代码块中的视觉吸引力。
1 2 3 4 5 6 7 8 9 | In [1]: a = 1 if False else 0 In [2]: a Out[2]: 0 In [3]: b = 1 if True else 0 In [4]: b Out[4]: 1 |
是的,你可以这样用:
1 2 | is_fat = True state ="fat" if is_fat else"not fat" |
Read more about ternary conditional operator
1 | a if condition else b |
如果你记不住,就记住这个金字塔:
1 2 3 | condition if else a b |
是的,python有一个三元运算符,下面是语法和示例代码来演示相同的操作符:)
1 2 3 4 5 6 7 8 | #[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") |
语法:三元运算符为:
1 | [on_true] if [expression] else [on_false] |
如
1 2 3 | x, y = 25, 50 big = x if x < y else y print(big) |
许多源自
1 | <condition> ? <expression1> : <expression2> |
At first, the
Python Benevolent Dictator For Life (I mean Guido van Rossum, of course) rejected it (as non-Pythonic style), since it's quite hard to understand for people not used toC language. Also, the colon sign: already has many uses inPython . After PEP 308 was approved,Python finally received its own shortcut conditional expression (what we use now):
1 | <expression1> if <condition> else <expression2> |
首先,它对条件求值。如果返回
下面是一些例子(条件将从左到右计算):
1 2 3 4 | pressure = 10 print('High' if pressure < 20 else 'Critical') # Result is 'High' |
三元运算符可以串联:
1 2 3 4 | pressure = 5 print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical') # Result is 'Normal' |
下一条与前一条相同:
1 2 3 4 5 6 7 8 9 10 11 | pressure = 5 if pressure < 20: if pressure < 10: print('Normal') else: print('High') else: print('Critical') # Result is 'Normal' |
希望这个有帮助。
是的。
1 2 3 | >>> b = (True if 5 > 4 else False) >>> print b True |
Python条件表达式的一种替代方法如下:
< pre > <代码>{真的:"是的",错误的:"没有 n操作符是"有条件的"。三元只是意味着它需要三个操作数。我们不叫+"二进制"+运算符。没有理由用条件句继续这样做。无论它比else更快还是更紧凑,都无关紧要。重要的是它是一个表达式,允许它嵌入到其他表达式中。如果使用得当,它可以减少冗余和难以发现差异的机会。
是的:
假设你想给变量x一个值如果某个bool为真,同理
如果变量被定义了你想要检查它是否有值你可以使用
1 2 3 4 5 6 7 8 9 10 | def test(myvar=None): # shorter than: print myvar if myvar else"no Input" print myvar or"no Input" test() test([]) test(False) test('hello') test(['Hello']) test(True) |
将输出
1 2 3 4 5 6 | no Input no Input no Input hello ['Hello'] True |