有没有更好的方法来写这些if语句

2024-10-04 09:17:35 发布

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

基本上,当一个物体经过时,这些if语句会迅速改变cv2线的颜色,问题是有4条线,我想在颜色变为绿色前后保持红色。你知道吗

这不仅看起来很糟糕,而且可能是无效的

if counter is 1:
    cv2.line(input_frame, (line_pos1, 0), (line_pos1, height), line_col_green, line_size)
    cv2.line(input_frame, (line_pos2, 0), (line_pos2, height), line_col_red, line_size)
    cv2.line(input_frame, (0, line_pos4), (width, line_pos4), line_col_red, line_size)
    cv2.line(input_frame, (0, line_pos5), (width, line_pos5), line_col_red, line_size)
    lct1 += 1
if counter is 2:
    cv2.line(input_frame, (line_pos1, 0), (line_pos1, height), line_col_red, line_size)
    cv2.line(input_frame, (line_pos2, 0), (line_pos2, height), line_col_green, line_size)
    cv2.line(input_frame, (0, line_pos4), (width, line_pos4), line_col_red, line_size)
    cv2.line(input_frame, (0, line_pos5), (width, line_pos5), line_col_red, line_size)
    lct2 += 1
if counter is 3:
    cv2.line(input_frame, (line_pos1, 0), (line_pos1, height), line_col_red, line_size)
    cv2.line(input_frame, (line_pos2, 0), (line_pos2, height), line_col_red, line_size)
    cv2.line(input_frame, (0, line_pos4), (width, line_pos4), line_col_green, line_size)
    cv2.line(input_frame, (0, line_pos5), (width, line_pos5), line_col_red, line_size)
    lct3 += 1
if counter is 4:
    cv2.line(input_frame, (line_pos1, 0), (line_pos1, height), line_col_red, line_size)
    cv2.line(input_frame, (line_pos2, 0), (line_pos2, height), line_col_red, line_size)
    cv2.line(input_frame, (0, line_pos4), (width, line_pos4), line_col_red, line_size)
    cv2.line(input_frame, (0, line_pos5), (width, line_pos5), line_col_green, line_size)
    lct4 += 1
if counter is 0:
    cv2.line(input_frame, (line_pos1, 0), (line_pos1, height), line_col_red, line_size)
    cv2.line(input_frame, (line_pos2, 0), (line_pos2, height), line_col_red, line_size)
    cv2.line(input_frame, (0, line_pos4), (width, line_pos4), line_col_red, line_size)
    cv2.line(input_frame, (0, line_pos5), (width, line_pos5), line_col_red, line_size)

Tags: inputsizeiflinecountercolredwidth
3条回答

使用dict(或list)怎么样?你知道吗

colors = {1: (line_col_green, line_col_red, line_col_red, line_col_red),
         2: (line_col_red, line_col_green, line_col_red, line_col_red),
         ... }

c1, c2, c3, c4 = colors[counter]
cv2.line(input_frame, (line_pos1, 0), (line_pos1, height), c1, line_size)
cv2.line(input_frame, (line_pos2, 0), (line_pos2, height), c2, line_size)
cv2.line(input_frame, (0, line_pos4), (width, line_pos4), c3, line_size)
cv2.line(input_frame, (0, line_pos5), (width, line_pos5), c4, line_size)

以及lct变量的Counter。你知道吗

扩展我的评论。 下面是一些简单的例子来说明如何使用函数来实现这一点。这可能不是唯一的方法,也许还有更好的方法,但是你可以从这样的方法开始。你知道吗

def set_line_colour(counter):
    line_colours = [line_col_red] * 4 #makes a list of 4 "Reds"
    if counter != 0: #or more simply, if counter: (because 0 is "falsey")
        line_colours[counter - 1] = line_col_green #sets one of the "Reds" to green instead.
    cv2.line(input_frame, (line_pos1, 0), (line_pos1, height), line_colours[0], line_size)
    cv2.line(input_frame, (line_pos2, 0), (line_pos2, height), line_colours[1], line_size)
    cv2.line(input_frame, (0, line_pos4), (width, line_pos4), line_colours[2], line_size)
    cv2.line(input_frame, (0, line_pos5), (width, line_pos5), line_colours[3], line_size)

一般的经验法则可以帮助你:如果你发现自己在写代码的时候复制粘贴行,停下来想想你是否可以把它变成一个函数。你知道吗

另外,请注意:使用==与int进行比较,而不是使用is。你知道吗


免责声明:此代码未经测试,请在使用前验证并进行必要的更改。你知道吗

主要有两件事:

  • 如果多个if是独占的,则使用elif而不是多个if。你知道吗
  • 如果某些代码重复,请使用函数来遵循DRY原则。你知道吗

您还可以(但不是必须)使用“custom”switch-case in python

相关问题 更多 >