有没有更优雅的方法来减少这种积极/消极的逻辑?

Posted

技术标签:

【中文标题】有没有更优雅的方法来减少这种积极/消极的逻辑?【英文标题】:Is there any more elegant way to reduce this positive/negative logic? 【发布时间】:2019-03-13 14:23:34 【问题描述】:

有没有更优雅的方法来减少下面的代码,它应该根据行的大小从左到右反转一个方向,反之亦然?

if right_length > left_length:
    direction = -1
elif right_length < left_length:
    direction = 1
else:
    direction = 0

【问题讨论】:

Python 2:docs.python.org/2/library/functions.html#cmp ? @G_M,对不起,我更正了这个问题,它适用于 Python 3。 也许numpy.sign 是一个选项(使用left_length - right_length)。 【参考方案1】:

如果使用math.copysign 函数,可以将 3 个分支语句减少到 2 个:

import math
direction = 0 if left == right else math.copysign(1, left - right)

copysign 将复制left - right 的符号并将其应用于左操作数(在本例中为 1)。

如果leftright 是浮点数,请使用math.isclose 来检查是否考虑到浮点数的不准确性。

direction = 0 if math.isclose(left, right) else math.copysign(1, left - right)

如果你有 numpy,你可以使用 np.sign 来处理 left == right 的特殊情况:

import numpy as np
direction = np.sign(left - right)

【讨论】:

【参考方案2】:

可能是这样的:

def direction(right_length, left_length):
    diff = left_length - right_length
    return int(abs(diff) / diff) if diff else 0

print(direction(5, 10)) # 1
print(direction(10, 5)) # -1
print(direction(1, 1)) # 0

【讨论】:

我认为这是最优雅的,因为它不依赖于其他库,并且以同样的方式将逻辑与主代码分开,从而产生更简单和更直观的代码。谢谢! 你不需要在这里显式检查== 0,只需使用return 0 if not diff else int(abs(diff) / diff)return int(abs(diff) / diff) if diff else 0 两者都更短但仍然非常可读。【参考方案3】:

简洁优雅的函数定义,如果需要复用代码,可以是这样:

f = lambda x,y: 1 if x<y else -1 if x>y else 0

direction = f(right_length, left_length)

【讨论】:

谢谢!欢迎!【参考方案4】:

您可以将 print 与两个条件表达式一起使用

print(1 if r_len > l_len else -1 if l_len > r_len else 0)

【讨论】:

这个答案不包含生成器函数。它只是使用了两个条件表达式。 @user2357112 抱歉措辞错误【参考方案5】:

您需要math 包中的cmp(比较)功能。在其他语言中,类似的函数称为sign。 Python 社区对边缘情况没有明确的共识,到目前为止,已经将sign 排除在语言之外。

direction = cmp(left_length, right_length)

我认为这在 Python 3 中已被弃用。在这种情况下,请使用 numpy.sign

对于 Python 3 没有 numpy,你可以这样做

diff = left_length - right_length
print (math.copysign(1, diff) if diff else 0)

【讨论】:

AttributeError: module 'math' has no attribute 'cmp'? @coldspeed:谢谢……我在沙箱里留下了一些垃圾。 "对不起,我更正了这个问题,它适用于 Python 3。"

以上是关于有没有更优雅的方法来减少这种积极/消极的逻辑?的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 复杂判断的更优雅写法

命题逻辑 - 减少运算次数

确定语句/文本的积极或消极程度的算法

[高项]消极风险VS积极风险

php 高并发下数据同步的问题

JavaScript 复杂判断的更优雅写法