转角频率 发表于 2020-4-12 00:14:03

如何使循环中的循环写的更加简便

以下是我代码的核心部分,当number为1的时候有1层循环,2的时候有两层循环,以此类推,每层循环中又有自身的循环,我需要如何简化我的代码,这样写下去我觉得越来越复杂
希望能得到好心人的回复,多谢!

if math.floor(xstart)==math.floor(xend) and math.floor(ystart)==math.floor(yend):
    way = dis(xstart, xend, ystart, yend, zstart, zend)
else:
    (boundx,boundy) = bound(xstart, xend, ystart, yend)
    number = len(boundx)
    for i in range(number):
      zmay.append(zdep)
    if number==1:
      for i1 in range(len(zdep)):
            way0 = dis(xstart, boundx, ystart, boundy, zstart, zmay)
            way1 = dis(boundx, xend, boundy, yend, zmay, zend)
            time0 = time(way0, max(zmay, zstart))
            time1 = time(way1, max(zmay, zend))
            waysum.append(way0+way1)
            timesum.append(time0+time1)
            waypos.append((i1))
    elif number==2:
      for i1 in range(len(zdep)):
            for i2 in range(len(zdep)):
                way0 = dis(xstart, boundx, ystart, boundy, zstart, zmay)
                way1 = dis(boundx, boundx, boundy, boundy, zmay, zmay)
                way2 = dis(boundx, xend, boundy, yend, zmay, zend)
                time0 = time(way0, max(zmay, zstart))
                time1 = time(way1, max(zmay, zmay))
                time2 = time(way2, max(zmay, zend))
                waysum.append(way0+way1+way2)
                timesum.append(time0+time1+time2)
                waypos.append((i1,i2))
    elif number==3:
      for i1 in range(len(zdep)):
            for i2 in range(len(zdep)):
                for i3 in range(len(zdep)):
                  way0 = dis(xstart, boundx, ystart, boundy, zstart, zmay)
                  way1 = dis(boundx, boundx, boundy, boundy, zmay, zmay)
                  way2 = dis(boundx, boundx, boundy, boundy, zmay, zmay)
                  way3 = dis(boundx, xend, boundy, yend, zmay, zend)
                  time0 = time(way0, max(zmay, zstart))
                  time1 = time(way1, max(zmay, zmay))
                  time2 = time(way2, max(zmay, zmay))
                  time3 = time(way3, max(zmay, zend))
                  waysum.append(way0+way1+way2+way3)
                  timesum.append(time0+time1+time2+time3)
                  waypos.append((i1,i2,i3))

leon_xinxin 发表于 2020-4-12 04:56:43

提供一个思路,可以把要循环的写成一个函数,然后多次循环的时候用递归就好了

_2_ 发表于 2020-4-12 08:36:40

把可以在循环外完成的操作放到外层
可以优化时间复杂度来简化

永恒的蓝色梦想 发表于 2020-4-12 11:10:02

用 itertools.product

转角频率 发表于 2020-4-12 12:58:10

leon_xinxin 发表于 2020-4-12 04:56
提供一个思路,可以把要循环的写成一个函数,然后多次循环的时候用递归就好了

谢谢思路

转角频率 发表于 2020-4-12 12:59:14

永恒的蓝色梦想 发表于 2020-4-12 11:10
用 itertools.product

可是随着number的增加,参数也会增加呀

转角频率 发表于 2020-4-12 12:59:46

_2_ 发表于 2020-4-12 08:36
把可以在循环外完成的操作放到外层
可以优化时间复杂度来简化

谢谢意见

永恒的蓝色梦想 发表于 2020-4-12 12:59:50

转角频率 发表于 2020-4-12 12:59
可是随着number的增加,参数也会增加呀

product可以指定repeat

_2_ 发表于 2020-4-12 14:27:55

用列表推导式来优化代码复杂度,你可以嵌套多个for
页: [1]
查看完整版本: 如何使循环中的循环写的更加简便