代码简化。在积极和消极条件之间

2024-09-30 20:34:21 发布

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

我有一个问题,如何简化这个代码?我的印象是,它可以在3个有条件的指示,而不是在6

if (PID > 10 and self.last_pid > 0):
    if (PID >= self.last_pid):
            self.setKp(self.Kp+self.increase_val)
            self.increase_val = self.increase_val*2
    else:
        percent_last = PID/self.last_pid*100
        self.increase_val + (percent_last/100*self.increase_val)
        self.setKp(self.Kp+self.increase_val)


if (PID < -10 and self.last_pid < 0):
    if (PID <= self.last_pid):
            self.setKp(self.Kp+self.increase_val)
            self.increase_val = self.increase_val*2
    else:
        percent_last = PID/self.last_pid*100
        self.increase_val + (percent_last/100*self.increase_val)
        self.setKp(self.Kp+self.increase_val)

(可以简化为:)

if A > 10 and B > 0:
    if A >= B:
        # do block A
    else:
        # do block B

if A < -10 and B < 0:
    if A <= B):
        # do block A
    else:
        # do block B

Tags: and代码selfifvalblockpiddo
2条回答

虽然有点长,但行数较少:

if (A > 10 and B > 10 and A>=B) or (A < -10 and B < 0 and A<= B):
  #do block a
else:
  #do block b

如果您不喜欢它这么长,我建议将第一行or的每一侧都转换为布尔变量,然后在if语句中使用该变量。像这样:

condA = A > 10 and B > 10 and A>=B
condB = A < -10 and B < 0 and A<= B
if condA or condB:
  #do block a
else:
  #do block b

这应该相当于正值和负值的两种情况:

if abs(A) > 10 and A * B > 0:
    if abs(A) >= abs(B):
        # do block A
    else:
        # do block B

说明:

  • abs(A)分别对应于A > 10A < -10
  • A * B > 0表示两者具有相同的符号和B != 0
  • abs(A) >= abs(B)如果两者都是{},则表示{};如果两者都是{},则表示{}

现在,它更短,重复性更少,但是否更容易理解由你决定。在任何情况下,您都应该添加一条注释来解释代码以及它应该做的事情

使用原始变量和过程,这将是:

if abs(PID) > 10 and PID * self.last_pid > 0:
    if abs(PID) >= abs(self.last_pid):
        self.setKp(self.Kp+self.increase_val)
        self.increase_val = self.increase_val*2
    else:
        percent_last = PID/self.last_pid*100
        self.increase_val + (percent_last/100*self.increase_val)
        self.setKp(self.Kp+self.increase_val)

我刚才还注意到了一些要点:

  • 您的行self.increase_val + (percent_last / 100 * self.increase_val)没有任何作用。我猜+应该是=或者+=
  • 首先* 100获得百分比,然后再/ 100是没有意义的
  • 奇怪的是,在一种情况下,在增加它之前,你将increase_val添加到KP,但在另一种情况下,在增加它之后,;这是故意的吗

事实上,我认为这可以进一步简化为这一点,前提是使用内部if来限制increase_val的增加;但是,不确定是否应该在其自身增加之前或之后将其添加到Kp,或者这是否应该取决于具体情况

if abs(PID) > 10 and PID * self.last_pid > 0:
    self.setKp(self.Kp + self.increase_val)
    self.increase_val *= 1 + min(PID/self.last_pid, 1)

相关问题 更多 >