有没有更好的方式编写这些if语句

时间:2019-08-23 09:25:32

标签: python python-3.x opencv

从本质上讲,这些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)

4 个答案:

答案 0 :(得分:7)

扩大我的评论。 这是一些可以快速说明如何使用功能的说明。这可能不是唯一的方法,并且可能会有更好的方法,但是您可以从类似的方法开始。

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)

可以帮助您的一般经验法则:如果您发现自己在编写代码时复制粘贴行,请停下来考虑是否可以将其转换为函数。

另外,请注意:使用==与整数进行比较,而不是is


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

答案 1 :(得分:3)

两件事:

  • 如果单独使用elif,而不要使用多个if
  • 如果重复执行某些代码,请使用函数来遵守DRY原则。

您也可以(但不是必须)使用“自定义” switch-case in python

答案 2 :(得分:2)

使用字典(或列表)怎么办?

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)

还有一个Counter代表lct变量。

答案 3 :(得分:0)

更好地使用字典,我将编写以下代码,以使变量保持完整。假设那行是我们使用的函数

col={'Line1':[line_col_red,line_col_green,line_col_red,line_col_red,line_col_red],'Line2':[line_col_red,line_col_red,line_col_green,line_col_red,line_col_red],'Line3':[line_col_red,line_col_red,line_col_red,line_col_green,line_col_red],'Line4':[line_col_red,line_col_red,line_col_red,line_col_red,line_col_green]}

cv2.line(input_frame, (line_pos1, 0), (line_pos1, height), col['Line1'][counter], line_size)
cv2.line(input_frame, (line_pos2, 0), (line_pos2, height), col['Line2'][counter], line_size)
cv2.line(input_frame, (0, line_pos4), (width, line_pos4), col['Line3'][counter], line_size)
cv2.line(input_frame, (0, line_pos5), (width, line_pos5), col['Line4'][counter], line_size)
if counter is 1:
    lct1 += 1
elif counter is 2:
    lct2 += 1
elif counter is 3:
    lct3 += 1
elif counter is 4:
    lct4 += 1
相关问题