如何改进此if-else语句?

2024-06-08 09:04:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个函数,用于在笛卡尔平面上寻找光线的方向:

def direction(self):
    if 180 > self.angle > 90:
        return (-1, +1)
    elif 90 > self.angle > 0:
        return (+1, +1)
    elif 0 > self.angle > -90:
        return (+1, -1)
    elif -90 > self.angle > -180:
        return (-1, -1)

这看起来有点笨重。有没有更简单的表达方式?它只是给了我一个射线基于角度的象限


Tags: 函数selfreturnifdef方向平面角度
3条回答

您可以将角度转换为象限数(0、1等),并在数组中使用索引:

return [(1,1), (-1,1), (-1,-1), (1,-1)]\\
       [int(self.angle % 360) // 90]

即使当self.angle不是整数时,这也有效

看起来不错,你可以用一个else来代替最后一个elif

def direction(self):
        if 180>self.angle>90:
            return (-1,+1)
        elif 90>self.angle>0:
            return (1,1)
        elif 0>self.angle>-90:
            return (1,-1)
        else:
            return (-1,-1)

如果使用^{}和基本trig函数,则根本不需要条件语句:

from math import copysign, sin, cos, pi

def direction(angle):
    angle *= pi / 180
    return copysign(1, cos(angle)), copysign(1, sin(angle))

如果坚持使用条件句,则可以将比较分为两种情况,而不是四种情况:

def direction(angle):
    angle %= 360
    x = -1 if 90 < angle < 270 else +1
    y = -1 if 180 < angle else +1
    return x, y

事实上,您可以使用boolint的子类这一事实,以完全不同的方式删除条件:

def direction(angle):
    angle %= 360
    x = 1 - 2 * (90 < angle < 270)
    y = 1 - 2 * (180 < angle)
    return x, y

使用循环函数,如sincos和模(%),将使代码处理更全面

这些公式也将更好地处理角落案件。原始函数将返回None,角度为90。这两个版本不适用。您可以调整条件(例如,有时将<替换为<=),以使拐角案例精确地按照您想要的方式工作

相关问题 更多 >