根据我的阅读,我发现内置的三元运算符不存在(我很乐意了解它).
我发现以下代码作为替代:
def val(): var = float(raw_input("Age:")) status = ("Working","Retired")[var>65] print "You should be:",status
我无法理解这段代码是如何工作的; 任何人都可以解释我实际上代码是如何工作的?我也很想知道为什么三元运算符不存在; 任何关于此的参考或链接都是有用的.
我在Windows Vista上运行Python 2.6.4.
Python有一个类似于C等人的三元运算符的结构.它的工作原理如下:
my_var = "Retired" if age > 65 else "Working"
并且相当于这个C代码:
my_var = age > 65 ? "Retired" : "Working";
至于你发布的代码如何工作,让我们一步一步:
("Working","Retired")
创建一个2元组(一个不可变列表),其元素"Working"在索引0处,"Retired"在索引1处.
var>65
如果var大于65则返回True,否则返回False.应用于索引时,它将转换为1(True)或0(False).因此,此布尔值提供在同一行上创建的元组的索引.
为什么Python一直没有三元运算符?简单的答案是,Python的作者Guido van Rossum不喜欢/不想要它,显然认为这是一个不必要的结构,可能导致令人困惑的代码(以及任何看过大量嵌套的三元运算符的人) C可能会同意).但对于Python 2.5,他心软了并添加了上面的语法.
Python(2.5及以上版本)确实具有您正在寻找的语法:
x = foo if condition else bar
如果condition
为True,x
则将设置为foo
,否则将设置为bar
.
例子:
>>> age = 68 >>> x = 'Retired' if age > 65 else 'Working' >>> x 'Retired' >>> age = 35 >>> y = 'Retired' if age > 65 else 'Working' >>> y 'Working'
因为True转换为1而False转换为0所以如果var = 70
("Working","Retired")[var>65]
变
("Working", "Retired")[1]
一个不错的小捷径...但我发现除了一个简单的条件外,它可能有点令人困惑,所以我会选择TM的建议
"Retired" if var > 65 else "Working"
指某东西的用途
[expression_when_false, expression_when_true][condition] # or (expression_when_false, expression_when_true)[condition]
利用Python中的事实True等于(但不是!)1和False等于(但不是!)0.上面的表达式构造了两个元素的列表,并使用条件的结果来索引列表并只返回一个表达式.该方法的缺点是两个表达式都被评估.
自从创建Python以来,有一种形式的操作:
condition and expression_when_true or expression_when_false
这需要一个快捷方式并且只评估一个表达式,但是有一个容易出错的缺点:expression_when_true 不能求值为非真值,否则结果为expression_when_false.and
并且or
在Python中"短路",并且以下规则适用:
a and b #? a if a is false, else b a or b #? a if a is true, else b
如果条件不成立,则expression_when_true从未评估,结果是expression_when_false.OTOH,如果条件为真,则结果为(expression_when_true或expression_when_false)的结果; 请参考上表.
当然,从Python 2.5开始,有一个三元条件运算符:
expression_when_true if condition else expression_when_false
奇怪的(如果你习惯于C类三元条件运算符)操作数的顺序归因于很多东西 ; 一般意图是条件在大多数时候应该是真实的,因此最常见的输出是第一个并且是最明显的.