我对使用单行三元表达式而不是传统的多行 if-else
block 感兴趣。但是,比较 is None
的表达式会给出不同的结果。
下面是一个比较谓词条件表达式两种形式的多行和单行变体的示例:
如果 pred 不是 None
如果 pred 为 None
代码
import operator as op
# First form
def is_not_none_multiline(a, b, pred=None):
if pred is not None:
predicate = pred
else:
predicate = lambda x, y: x + y
return predicate(a, b)
def is_not_none_oneline(a, b, pred=None):
predicate = pred if pred is not None else lambda x, y: x + y
return predicate(a, b)
# Second Form
def is_none_multiline(a, b, pred=None):
if pred is None:
predicate = lambda x, y: x + y
else:
predicate = pred
return predicate(a, b)
def is_none_oneline(a, b, pred=None):
predicate = lambda x, y: x + y if pred is None else pred
return predicate(a, b)
测试
以下是多行和单行变体中可选参数的测试。最终的结果出乎意料:
assert is_not_none_multiline(1, 2) == 3
assert is_not_none_oneline(1, 2) == 3
assert is_not_none_multiline(1, 2, pred=op.mul) == 2
assert is_not_none_oneline(1, 2, pred=op.mul) == 2
assert is_none_multiline(1, 2) == 3
assert is_none_oneline(1, 2) == 3
assert is_none_multiline(1, 2, pred=op.mul) == 2
assert is_none_oneline(1, 2, pred=op.mul) == 2
# ----> 4 assert is_none_oneline(1, 2, pred=op.mul) == 2
# AssertionError:
虽然 pred 不是 None
作为一行工作:
predicate = pred if pred is not None else lambda x, y: x + y
pred is None
不能作为一行工作:
predicate = lambda x, y: x + y if pred is None else pred
详细信息
显然,当作为关键字传递给 is_none_oneline()
时,pred
函数不会被求值。相反,它被返回:
print(is_none_oneline(1, 2, pred=op.mul))
# <built-in function mul>
在执行第二种形式的两种变体时,此分析已在 Python Tutor 可视化中得到验证(请参阅此处的可视化 is not None
multiline 、 is not None
one-line 、 is None
multiline 、 is None
one-line )。
问题
尚不清楚为什么等效的三元表达式返回函数而不是计算值。
- 有人可以解释为什么谓词不以第二种形式求值 - 单行
pred is None
表达式吗? - 如何在一行中正确书写
pred is None
?
最佳答案
只是一个简单的运算符优先级例子。
你得到一个可调用的,它返回一个可调用的。我认为您想要这个,以确保条件以其他方式分组:
def is_none_oneline(a, b, pred=None):
predicate = (lambda x, y: x + y) if pred is None else pred
return predicate(a, b)
关于python - 如何在Python中使用 `is None`编写一行三元表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48328834/