方法介绍
Python 原生是不支持三元运算符: (expresion):val1?val2
但 Python 提供了一些语法糖在模拟三元运算符的操作
就以下面这样一个用例来看看 Python 中可以怎么处理三元运算
运算含义: val 值为正则返回 1, 为负则返回 -1, 为 0 则返回 0
IF 块1
这个是最笨拙的方法. 用 if...else...
块实现
写出来后代码如下:
因为是直接用 if...else...
描述出三元描述符的运算过程.
所以这种实现方法是最容易理解的.
逻辑运算
IF 块
的方法虽然很容易理解, 但是相对的代码行数略微多了点.
那能不能一行就搞定呢.
当然是可以的.
用逻辑运算
来处理它
这种方法阅读起来并不是那么的直观, 但是三种方法中最接近原始表达.
其中逻辑符号
和运算符
对应关系如下表
不过…
这种方法有一个缺点, and
后的值对应的布尔值必须为真.
像下面这个条件, 返回值总会是 -1
嘛, 毕竟它只是逻辑运算
内联 IF
虽然用逻辑运算
去 hack 是最接近三元运算最原始的表达的. 但毕竟有一个缺陷.
于是, 就是最后一种内联IF的写法. 很类似列表表达式
就可读性来说, 这种写法是比较差的, 但没有逻辑运算那样的缺陷.
同时, 也不像 block 版那样写三遍 return
基准测试
既然有三种不同的写法, 那三种写法的执行效率是否一样呢.
于是写了如下测试脚本:
脚本执行结果如下:
可以很清楚的看到, 三种写法编译后的指令数是一样的.
执行时间相差也不大, 多次执行时会有一定浮动
(果然应该把 timeit 次数设置大一点么)
if_block
最后多出来 2 条指令是因为 Python 中函数最后默认返回 None. 实际调用时, 不可能会执行到这两条指令