有没有更优雅的方法来减少这种积极/消极的逻辑?
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)。
如果left
和right
是浮点数,请使用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。"以上是关于有没有更优雅的方法来减少这种积极/消极的逻辑?的主要内容,如果未能解决你的问题,请参考以下文章