python - 如何在Python中使用 `is None`编写一行三元表达式?

标签 python if-statement

我对使用单行三元表达式而不是传统的多行 if-else block 感兴趣。但是,比较 is None 的表达式会给出不同的结果。

下面是一个比较谓词条件表达式两种形式多行单行变体的示例:

  1. 如果 pred 不是 None
  2. 如果 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 multilineis not None one-lineis None multilineis None one-line )。

问题

尚不清楚为什么等效的三元表达式返回函数而不是计算值。

  1. 有人可以解释为什么谓词不以第二种形式求值 - 单行 pred is None 表达式吗?
  2. 如何在一行中正确书写 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/

相关文章:

python - MySQLdb安装问题

javascript - 使用 for 和 if 语句隐藏/显示多个图像的迭代函数

python - 如何使用 python 有条件地对值进行装箱?

python - python获取过期域名的方法

android - 如果检测到已插入耳机,请执行某些操作

java - 如何在 Android studio 中一次运行多个案例

javascript - 高级 if else javascript 语句在代码保护中的使用

python - 从目录中的多个文本文件加载停用词

python - 通过网络同时运行 python 脚本。这个可以吗?

python - Python 中的优化问题