python - 有没有办法自动化类似(几乎重复)的代码并使其像一个函数?
问题描述
这是代码:它可能没有多大意义,但我的问题与语法无关。
本质上......最多有 7 个图像,它以预定义的布局和其他内容排列......我如何使这个重复的、不可扩展的代码更加精简?
im1 = None
im2 = None
im3 = None
im4 = None
im5 = None
im6 = None
im7 = None
if com == 2:
# cv2.imshow("")
layout = int(input("Enter layout number: "))
im1 = im_1()
im2 = im_2()
while (im1 == im2):
print("Invalid")
im1 = im_1()
im2 = im_2()
elif com == 3:
# cv2.imshow("")
layout = int(input("Enter layout number: "))
im1 = im_1()
im2 = im_2()
im3 = im_3()
while (im1 == im2) | (im1 == im3) | (im2 == im3):
print("Invalid")
im1 = im_1()
im2 = im_2()
im3 = im_3()
elif com == 4:
# cv2.imshow("")
layout = int(input("Enter layout number: "))
im1 = im_1()
im2 = im_2()
im3 = im_3()
im4 = im_4()
while (im1 == im2) | (im1 == im3) | (im1 == im4) | (im2 == im3) | (im2 == im4) | (im3 == im4):
print("Invalid")
im1 = im_1()
im2 = im_2()
im3 = im_3()
im4 = im_4()
elif com == 5:
# cv2.imshow("Layouts: 5", l5)
layout = int(input("Enter layout number: "))
im1 = im_1()
im2 = im_2()
im3 = im_3()
im4 = im_4()
im5 = im_5()
while (im1 == im2) | (im1 == im3) | (im1 == im4) | (im1 == im5) | (im2 == im3) | (im2 == im4) | (im2 == im5) | (im3 == im4) | (im3 == im5) | (im4 == im5):
print("Invalid")
im1 = im_1()
im2 = im_2()
im3 = im_3()
im4 = im_4()
im5 = im_5()
elif com == 6:
# cv2.imshow("")
layout = int(input("Enter layout number: "))
im1 = im_1()
im2 = im_2()
im3 = im_3()
im4 = im_4()
im5 = im_5()
im6 = im_6()
while (im1 == im2) | (im1 == im3) | (im1 == im4) | (im1 == im5) | (im1 == im6) | (im2 == im3) | (im2 == im4) | (im2 == im5) | (im2 == im6) | (im3 == im4) | (im3 == im5) | (im3 == im6) | (im4 == im5) | (im4 == im6) | (im5 == im6):
print("Invalid")
im1 = im_1()
im2 = im_2()
im3 = im_3()
im4 = im_4()
im5 = im_5()
im6 = im_6()
elif com == 7:
# cv2.imshow("")
layout = int(input("Enter layout number: "))
im1 = im_1()
im2 = im_2()
im3 = im_3()
im4 = im_4()
im5 = im_5()
im6 = im_6()
im7 = im_7()
while (im1 == im2) | (im1 == im3) | (im1 == im4) | (im1 == im5) | (im1 == im6) | (im1 == im7) | (im2 == im3) | (im2 == im4) | (im2 == im5) | (im2 == im6) | (im2 == im7) | (im3 == im4) | (im3 == im5) | (im3 == im6) | (im3 == im7) | (im4 == im5) | (im4 == im6) | (im4 == im7) | (im5 == im6) | (im5 == im7) | (im6 == im7):
print("Invalid")
im1 = im_1()
im2 = im_2()
im3 = im_3()
im4 = im_4()
im5 = im_5()
im6 = im_6()
im7 = im_7()
这是一个比较图像的计算机视觉代码,但它最多只能工作 7 个,因为我必须事先预定义图像。com
实际上是用户输入的,如果它是 < 7 ... 内存仍然使用,因为定义了 7 个图像,并且不允许com
> 7。
此外,如果您看到,它只能工作到 7,因为图像比较没有被硬编码为 >7。但是 = n 的逻辑com
很容易硬编码,但很费力。有没有办法为 n 个图像/术语制作此代码,其中它定义了变量的确切数量,并在com
= n 的比较/布局部分中自我纠正?
同样,我们可以将其扩展到:
if i != 0:
if i == 1:
anim1 = cv2.imread("anim_1.jpg")
border_b = cv2.copyMakeBorder(anim1, bt, bt, bt, bt, cv2.BORDER_CONSTANT, value = c_b)
border_w = cv2.copyMakeBorder(border_b, wt, wt, wt, wt, cv2.BORDER_CONSTANT, value = c_w)
anim1 = border_w
if i == 2:
anim2 = cv2.imread("anim_2.jpg")
border_b = cv2.copyMakeBorder(anim2, bt, bt, bt, bt, cv2.BORDER_CONSTANT, value = c_b)
border_w = cv2.copyMakeBorder(border_b, wt, wt, wt, wt, cv2.BORDER_CONSTANT, value = c_w)
anim2 = border_w
if i == 3:
anim3 = cv2.imread("anim_3.jpg")
border_b = cv2.copyMakeBorder(anim3, bt, bt, bt, bt, cv2.BORDER_CONSTANT, value = c_b)
border_w = cv2.copyMakeBorder(border_b, wt, wt, wt, wt, cv2.BORDER_CONSTANT, value = c_w)
anim3 = border_w
if i == 4:
anim4 = cv2.imread("anim_4.jpg")
border_b = cv2.copyMakeBorder(anim4, bt, bt, bt, bt, cv2.BORDER_CONSTANT, value = c_b)
border_w = cv2.copyMakeBorder(border_b, wt, wt, wt, wt, cv2.BORDER_CONSTANT, value = c_w)
anim4 = border_w
if i == 5:
anim5 = cv2.imread("anim_5.jpg")
border_b = cv2.copyMakeBorder(anim5, bt, bt, bt, bt, cv2.BORDER_CONSTANT, value = c_b)
border_w = cv2.copyMakeBorder(border_b, wt, wt, wt, wt, cv2.BORDER_CONSTANT, value = c_w)
anim5 = border_w
if i == 6:
anim6 = cv2.imread("anim_6.jpg")
border_b = cv2.copyMakeBorder(anim6, bt, bt, bt, bt, cv2.BORDER_CONSTANT, value = c_b)
border_w = cv2.copyMakeBorder(border_b, wt, wt, wt, wt, cv2.BORDER_CONSTANT, value = c_w)
anim6 = border_w
if i == 7:
anim7 = cv2.imread("anim_7.jpg")
border_b = cv2.copyMakeBorder(anim7, bt, bt, bt, bt, cv2.BORDER_CONSTANT, value = c_b)
border_w = cv2.copyMakeBorder(border_b, wt, wt, wt, wt, cv2.BORDER_CONSTANT, value = c_w)
anim7 = border_w
和
if com == 2:
if im1 == 1:
im1 = anim1
im2 = anim2
elif im1 == 2:
im1 = anim2
im2 = anim1
elif com == 3:
if (im1 == 1) | (im1 == 2) | (im1 == 3):
if im1 == 1:
im1 = anim1
elif im1 == 2:
im1 = anim2
elif im1 == 3:
im1 = anim3
if (im2 == 1) | (im2 == 2) | (im2 == 3):
if im2 == 1:
im2 = anim1
elif im2 == 2:
im2 = anim2
elif im2 == 3:
im2 = anim3
if (im3 == 1) | (im3 == 2) | (im3 == 3):
if im3 == 1:
im3 = anim1
elif im3 == 2:
im3 = anim2
elif im3 == 3:
im3 = anim3
//skipped till end of 7 because too repetitive.
elif com == 7:
if (im1 == 1) | (im1 == 2) | (im1 == 3) | (im1 == 4) | (im1 == 5) | (im1 == 6) | (im1 == 7):
if im1 == 1:
im1 = anim1
elif im1 == 2:
im1 = anim2
elif im1 == 3:
im1 = anim3
elif im1 == 4:
im1 = anim4
elif im1 == 5:
im1 = anim5
elif im1 == 6:
im1 = anim6
elif im1 == 7:
im1 = anim7
if (im2 == 1) | (im2 == 2) | (im2 == 3) | (im2 == 4) | (im2 == 5) | (im2 == 6) | (im2 == 7):
if im2 == 1:
im2 = anim1
elif im2 == 2:
im2 = anim2
elif im2 == 3:
im2 = anim3
elif im2 == 4:
im2 = anim4
elif im2 == 5:
im2 = anim5
elif im2 == 6:
im2 = anim6
elif im2 == 7:
im2 = anim7
if (im3 == 1) | (im3 == 2) | (im3 == 3) | (im3 == 4) | (im3 == 5) | (im3 == 6) | (im3 == 7):
if im3 == 1:
im3 = anim1
elif im3 == 2:
im3 = anim2
elif im3 == 3:
im3 = anim3
elif im3 == 4:
im3 = anim4
elif im3 == 5:
im3 = anim5
elif im3 == 6:
im3 = anim6
elif im3 == 7:
im3 = anim7
if (im4 == 1) | (im4 == 2) | (im4 == 3) | (im4 == 4) | (im4 == 5) | (im4 == 6) | (im4 == 7):
if im4 == 1:
im4 = anim1
elif im4 == 2:
im4 = anim2
elif im4 == 3:
im4 = anim3
elif im4 == 4:
im4 = anim4
elif im4 == 5:
im4 = anim5
elif im4 == 6:
im4 = anim6
elif im4 == 7:
im4 = anim7
if (im5 == 1) | (im5 == 2) | (im5 == 3) | (im5 == 4) | (im5 == 5) | (im5 == 6) | (im5 == 7):
if im5 == 1:
im5 = anim1
elif im5 == 2:
im5 = anim2
elif im5 == 3:
im5 = anim3
elif im5 == 4:
im5 = anim4
elif im5 == 5:
im5 = anim5
elif im5 == 6:
im5 = anim6
elif im5 == 7:
im5 = anim7
if (im6 == 1) | (im6 == 2) | (im6 == 3) | (im6 == 4) | (im6 == 5) | (im6 == 6) | (im6 == 7):
if im6 == 1:
im6 = anim1
elif im6 == 2:
im6 = anim2
elif im6 == 3:
im6 = anim3
elif im6 == 4:
im6 = anim4
elif im6 == 5:
im6 = anim5
elif im6 == 6:
im6 = anim6
elif im6 == 7:
im6 = anim7
if (im7 == 1) | (im7 == 2) | (im7 == 3) | (im7 == 4) | (im7 == 5) | (im7 == 6) | (im7 == 7):
if im7 == 1:
im7 = anim1
elif im7 == 2:
im7 = anim2
elif im7 == 3:
im7 = anim3
elif im7 == 4:
im7 = anim4
elif im7 == 5:
im7 = anim5
elif im7 == 6:
im7 = anim6
elif im7 == 7:
im7 = anim7
tl;博士:我如何使这个不必要的重复代码更加精简?
解决方案
代码块 1:
看看你是否只能在需要时定义事物
代码块 2:
"anim_"+i+".jpg"
代码块 3:
if im1 == 1) | (im1 == 2) ... | (im1 == 7):
应该只是
if im1 <= 7:
对于长 elif 链,使用列表
Anim = [anim0, anim1, anim2]
im1 = Anim[0]
我认为您可以在创建大型项目之前节省时间学习更多基础知识
# example code
TmpLayout1 = [[1,0],[0,1]]
TmpLayout2 = [[0,1],[0,1]]
ImageLayouts = [TmpLayout1, TmpLayout2]
推荐阅读
- javascript - 是否可以使用纬度和对数坐标在自定义地球上设置地图标记?
- kubernetes - 如何在 AKS 中为 docker 层使用 Lsv2 nvme 存储?
- c - 如何解决 Codeforce “A. Way Too Long Words” 的问题?
- excel - 在 Excel 中根据单元格引用查找和打印文档
- azure - 我需要一个 Vnet 和子网来连接我的 App Servicce 和 SQL Server 吗?
- python - 熊猫在数据框中用不同颜色突出显示特定数字
- cypress - 单击按钮后如何等到页面重新加载
- apache-kafka - 生成的 WallclockTimestampExtractor 时间戳在处理时间戳之前
- php - 替换 eval 函数以在 php 中运行旧代码
- php - 如何将 laravel 刀片中的数据数组保存到数据库