condition ? expression1 : expression2
,如果 condition 为真,则取 expression1,若不为真,则取 expression2。// 常规 if-else
if (a > b) {
result = x;
} else {
result = y;
}
// 简化后的写法
result = a > b ? x : y;
<condition> ? <expression1> : <expression2>
<condition> then <expression1> else <expression2>
(if <condition>: <expression1> else: <expression2>)
<condition> and <expression1> else <expression2>
<expression1> if <condition> else <expression2>
cond(<condition>, <expression1>, <expression2>)
(if <condition>: <expression1> else: <expression2>)
,它是常规 if-else 语法的扁平化,容易理解,但缺点是需要使用圆括号,容易跟生成器表达式混淆,而且需要解释器对冒号做特殊化处理。<expression1> if <condition> else <expression2>
,它是 PEP-308 最早版本的推荐方案,但是这种不将条件放在首位的风格让一些人感觉不舒服,而且,当“expression1”很长的时候,很容易就忽略掉它的条件。<condition> and <expression1> or <expression2>
的方式来实现条件判断与选择。但是这种写法在 Python 中的行为跟有些语言并不一样,使用不严谨的话,可能会酿成 Bug!a = True and True or "Python猫"
b = True and False or "Python猫"
<condition> and <expression1> or <expression2>
,若 condition 为假,则会直接对 expression2 求值并返回结果;若 condition 为真,则先对 expression1 求值,若也为真,则不会继续对 expression2 求值,若 expression1 不为真,则对 expression2 求值。X if C else Y
。因此,PEP-308 被重开和更新,并很快就在次年的 2.5 版本中实现了。X if C else Y
非常易于理解,可读性高。它延续了“明确优于隐式”的风格,使用了直观口语化的“if-else”,而不是引入可能引起混淆的标点符号,就像 Python 选择“and”和“or”两个单词,而不是“&&”和“||”两个符号,它们有着异曲同工之妙。(if <condition>: <expression1> else: <expression2>)
那样的繁琐。X if C else Y
的有效性,Guido 排查了标准库中所有“and-or”组合的写法,发现那些C and X or Y
写法都可以被X if C else Y
替换掉。标准库的情况,证明了这新的语法是可行的。X if C else Y
这种设计,主要的意图其实是消除“and-or”写法的隐患,这种设计简明易读,非常好用。?:
operator?”。Go 语言没有 ?: 运算符,因为语言的设计者们经常看到它被用来创建难以理解的复杂表达式。虽然 if-else 形式比较长,但是它无疑更清晰易懂。一个语言只需要一个条件控制流结构。
// 若条件为真,得到 5,否则 6
let number = if condition { 5 } else { 6 };
let x = 42;
let result = if x > 50 {
println!("x is greater than 50");
x * 2 // 这是一个表达式,将返回的值赋给 result
} else {
println!("x is less than or equal to 50");
x / 2 // 也是一个表达式,将返回的值赋给 result
};
val result = a ?: b
表示:如果 a
不为 null
,则赋值给 result
;否则将 b
赋给 result
)