Break and return inside multiple for-loops with conditional statement
我创建了一个长代码,由for循环中的多个列表组成。计算没有任何问题。它确实获得了预期的结果。列表的代码和构造工作正常。问题是当它运行时,我已经在匹配某个条件时定义了一个中断。但它不会在第一次运行时中断,继续并运行第一个循环的范围函数内的所有值。我希望实现在条件匹配时返回真值,并且根据第一循环中的范围值停止并且不会继续增长。
我会解释代码是如何工作的!
代码:
第一部分是一致的,是投入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | import math import numpy as np Ned = -500 fcd = 20 fyd = 435 E = 2e5 h = 200 cb = 35 ct = 35 ca = 35 b= 150 y = 12 d = h - cb ds = ct a = 25 yb = 8 ecu = 0.0035 rebarnumber = math.floor((b-(2*cb+2*yb+y))/a) PI_Y2_4 = int(math.pi/4*(y)**2) disc = [] dis = [] Asi = [] Asci = [] Esc = [] Esci = [] Sc = [] Sci =[] ############################# # Calculation starts here ############################# for n in range(0,10): # <------- First for-loop cbb = cb + yb + y/2 ctt = ct + yb + y/2 if 0 < n <= rebarnumber: Asi.append(PI_Y2_4) dis.append( h - cbb) Asci.append(PI_Y2_4) disc.append( ctt ) if rebarnumber < n <= (2 * rebarnumber): Asi.append(PI_Y2_4) dis.append( h - cbb - ca) Asci.append(PI_Y2_4) disc.append(cbb + ca) if (2*rebarnumber) < n <= (3 * rebarnumber): Asi.append(PI_Y2_4) dis.append( h - cbb - 2*ca) Asci.append(PI_Y2_4) disc.append(cbb + 2*ca) if (3*rebarnumber) < n <= (4 * rebarnumber): Asi.append(PI_Y2_4) dis.append( h - cbb - 3*ca) Asci.append(PI_Y2_4) disc.append(cbb + 3*ca) if (4*rebarnumber) < n <= (5 * rebarnumber): Asi.append(PI_Y2_4) dis.append( h - cbb - 4*ca) Asci.append(PI_Y2_4) disc.append(cbb + 4*ca) if (5*rebarnumber) < n <= (6 * rebarnumber): Asi.append(PI_Y2_4) dis.append( h - cbb - 5*ca) Asci.append(PI_Y2_4) disc.append(cbb + 5*ca) if (6*rebarnumber) < n <= (7 * rebarnumber): Asi.append(PI_Y2_4) dis.append( h - cbb - 6*ca) Asci.append(PI_Y2_4) disc.append(cbb + 6*ca) if (7*rebarnumber) < n <= (8 * rebarnumber): Asi.append(PI_Y2_4) dis.append( h - cbb - 7*ca) Asci.append(PI_Y2_4) disc.append(cbb + 7*ca) for i in range(0,len(dis)): Esc.insert(i, dis[i]) Esci.insert(i, disc[i]) Sc.insert(i, dis[i]) Sci.insert(i, disc[i]) for x in np.linspace(1,h,10000): # <-------- Second for-loop for k, _ in enumerate(Esc): try: if x < dis[k]: Esc[k]=( ecu/x*(dis[k]-x) ) else: Esc[k]=(- ecu/x*(x-dis[k] ) ) if x < disc[k]: Esci[k]=( -ecu/x*(x-disc[k]) ) else: Esci[k]=(- ecu/x*(x-disc[k]) ) except (ZeroDivisionError, RuntimeWarning): Esc[k]=( 0 ) Esci[k]=( 0 ) for k, _ in enumerate(Sc): # <-------- Third for-loop ss = Esc[k]*E if ss <= -fyd: Sc[k]= -fyd elif ss >= -fyd and ss < 0: Sc[k]=ss else: Sc[k]=min(ss,fyd) for k, _ in enumerate(Sci): sci = Esci[k]*E if sci <= -fyd: Sci[k]= -fyd elif sci >= -fyd and sci < 0: Sci[k]=sci else: Sci[k]=min(sci,fyd) FS = 0 FSC = 0 for a, _ in enumerate(Sc): FS += Sc[a]*Asi[a] FSC+=Sci[a]*Asci[a] MS = 0 MSC = 0 for m, _ in enumerate(Sc): MS += Sc[a]*Asi[a]*(dis[m]-h/2) MSC+= Sci[a]*Asci[a]*(h/2-disc[m]) Nrd = 0 Mrd = 0 Nrd = int((-0.8*x*b*fcd+FSC+FS)/1000) Mrd = (0.8*x*b*fcd*(h/2-0.4*x)+MS-MSC)/1000000 if 0 <= (float(Nrd) - Ned) <= 1: print(Nrd, x, Asi) break break |
它是如何工作的?
第一个for循环创建一个索引为0的列表,即
我的问题是当代码运行时,我得到那些输出。
1 2 3 4 5 6 7 8 9 10 11 | Nrd x Asi --------------------------------------------------- -499 181.84938493849384 [113] -499 162.36533653365336 [113, 113] -499 147.3990399039904 [113, 113, 113] -499 137.48784878487848 [113, 113, 113, 113] -499 130.72117211721172 [113, 113, 113, 113, 113] -499 126.10391039103911 [113, 113, 113, 113, 113, 113] -499 122.7006700670067 [113, 113, 113, 113, 113, 113, 113] -499 120.01390139013901 [113, 113, 113, 113, 113, 113, 113, 113] -499 119.71537153715371 [113, 113, 113, 113, 113, 113, 113, 113, 113] |
以上输出都是真正的多解决方案。但我希望通过第一场比赛停止(休息),而不是给出所有解决方案。
我使用过
这里的第二个问题是第二个for-loop
也许将上面的代码行定义为函数会更有效。
最简单,最直接的解决方案是将所有代码移到函数中
1 2 3 4 5 6 7 8 | def calculate_results(...args...): # Bad name, use a more suitable one ... for n in range(0, 10): # <------- First for-loop ... for x in np.linspace(1,h,10000): # <-------- Second for-loop ... if 0 <= (float(Nrd) - Ned) <= 1: return Nrd, x, Asi |
然后调用该函数
1 2 | Nrd, x, Asi = calculate_results(...) print(Nrd, x, Asi) |
使用一个功能名称,它真正描述了函数正在执行的操作的本质,并且只执行函数中的单个操作。 然后