Python中的?:表达式语法

在java中我们可以通过?:表达式简洁地进行判断和赋值。
例如:

x = ((p != None) ? p.val:0)
y = ((q != None) ? q.val:0)

但是在Python中语法稍有不同,以下代码可以实现相同效果。
但是这种方法必须确定and后的第一个值为TRUE

x = ((p != None) and p.val or 0)
y = ((q != None) and q.val or 0)

用“and”替代“?”并且用 “or” 替代“:”

另一种写法:

x = p.val if (p != None) else 0
y = q.val if (q != None) else 0

这种方法更为保险。

补充:摘自https://www.cnblogs.com/xxiong1031/articles/7099901.html侵删

局限性

不难看出,三元运算在python中事实上可以通过借用布尔求值表达。然后,有时会有点小问题。
举个例子,char *ret = x ? "" or "VAL"。根据前面的例子,我们很自然想到在python里应该这样写,ret = x and "" or "VAL"
错了!不管x的布尔求值是真还是假,ret得到的总是"VAL"。因为在python中对空字符串的布尔求值为false,这样x and ""永远都是false,所以ret得到的自然总是"VAL"了。
解决这个问题有两种办法,
第一种,ret = not x and "VAL" or ""
第二种,ret = x and [""] or ["VAL"],然后每次取ret[0]作为返回值,这是因为[""]在布尔求值时值为true。

讨论一:
第一种方法代码明显要简洁,效率也高,那么还有必要使用第二种么?当然,第一种办法有局限性,只有当我们非常明确其中一个值布尔求值时不可能为false时才能使用。在我们的示例中,由于"VAL"肯定返回true所以可以使用。如果是两个变量呢,像这样ret=x and val1 or val2,你就只能老老实实写成ret=x and [val1] or [val2],然后取ret[0]作为结果了。因为这行语句所表达的不是“当x为真返回val1,否则返回val2”,而是“当x为真并且val1为真返回val2,否则返回val2”。

讨论二:
大家都知道python里有list和tuple,前面这行代码ret=x and [""] or ["VAL"]我们就是通过list解决,有的人可能偏爱tuple,于是就会这样写ret=x and ("") or ("VAL")。错了!这里ret[0]永远都是空字符串(在2.5上测试)。这是我比较faint的一点,为啥[""]为真而("")为假呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,770评论 0 10
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,216评论 0 38
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,868评论 0 13
  • 说起帆布鞋,很多人会马上想到Converse,它几乎是所有人的第一双帆布鞋。 入门以后,会发现帆布鞋的世界远比你想...
    卡飒生活创造所阅读 539评论 0 4
  • 初读仓央嘉措只是觉得的他的诗歌散文需要清奇很是喜欢,再读呢就总是觉得莫名的喜欢。 其实他要的不多,只是想和平常人一...
    流烟远逝阅读 526评论 0 2

友情链接更多精彩内容