Python中的三元操作

2010-10-17

许多 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”三元操作符功能。

知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
分类: 编程 标签: Python
前一篇: 不用HTML5/CSS3如何在网页上画机器猫
后一篇: 涂鸦之看电视的老婆

相关文章:

评论:

结婚请柬
在 2010-10-17 21:10 写道:

博主也喜欢python,python很漂亮的说

回复
AKara
在 2011-02-14 13:44 写道:

学习了

回复
苏岳宁
在 2012-05-21 16:57 写道:

学习了。很喜欢博主的博客!

回复

发表评论:

电子邮件地址不会被公开。 必填项已用 * 标注。