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
三元操作符功能。
发表评论:
电子邮件地址不会被公开。必填项已用 * 标注。
评论:
博主也喜欢python,python很漂亮的说
学习了
学习了。很喜欢博主的博客!