Python中的三元操作

许多 C 语言风格的语言中都有三元操作符,形如:

<condition> ? <expression1> : <expression2>

但是 Python 中没有这个操作符。不过,这并不代表 Python 不能实现类似的功能,比如,Python 2.4 及之前的版本中可以这样写:

# 较老的写法,不建议使用
(X, Y)[C]

其中 C 为条件,如果 C 为假,则元组 (X, Y) 中的第一个元素 X 将被返回,如果 C 为真,则元素中的第二个元素 Y 将被返回,可以看到,这儿的 C 起到了元组的索引的作用。

但这有一个明显的不足,即表达式 X 和 Y 都会被执行,尽管事实上我们只需要其中一个的值。这在 X、Y 比较简单时没什么问题,不过如果 X、Y 都是比较复杂的函数,开销就大了。

从 Python 2.5 开始,一个新的更好的方法终于被引入了(具体的讨论见 Python 官网的 PEP 308):

# 较好的写法,建议使用
X if C else Y

这种方式中,只有当条件 C 为真时,表达式 X 才会被执行并返回,同样地只有当 C 为假时 Y 才会被执行并返回。这样,X 和 Y 就只有一个会被执行,不用担心资源被浪费了。

如果还不放心,可以看一下下面的代码:

# -*- coding: utf-8 -*-
# https://oldj.net/

def f1():
	print "f1!"
	return 1

def f2():
	print "f2!"
	return 2

if __name__ == "__main__":
	v = f1() if True else f2() # 表达式(1)
	print "v =", v

	print "-" * 10

	v2 = f1() if False else f2() # 表达式(2)
	print "v2 =", v2

执行结果为:

f1!
v = 1
----------
f2!
v2 = 2

可以看到,表达式(1)中只有 f1 被执行,表达式(2)中则只有 f2 被执行,因此,使用 X if C else Y 完全可以实现 C 语言风格语言中的“C ? X : Y”三元操作符功能。

3 Replies to “Python中的三元操作”

评论已关闭。