我的用例如下:
我想制造一个具有不同价格的不同单位的电费生成器。在下面的程序中,如果用户在1-150
之间输入单位,则为了制作价格值,它将与2.50
进行乘法并得出价格。如果用户单位介于151-300
之间,则它将前150
个单位乘以2.50
,而左边单位将乘以3.60
表示用户输入了{{ 1}},然后对于前150个155
,对于左单位5,它将进行乘法150 * 2.50
。就像上面我说过的,我正在像下面给出的这四个变化:-
如果单位在1-150之间,则它将乘以2.50并计算价格。
如果单位在151-300之间,则它将首先乘以价格2.50乘以150,然后将剩余的300以下的单位乘以3.60并计算价格。
如果单位在301-450之间,则它将首先将150个单位乘以2.50,然后将其他150个单位乘以3.60,将剩余的单位乘以4.75并计算价格。
如果单位在451-600之间,则它将首先将150个单位乘以2.50,其他150个单位将乘以3.60,其他150个单位乘以4.75,剩下的单位乘以5并计算价格。
如果单位大于600,则它将首先将150个单位乘以2.50,其他150个单位将乘以3.60,其他150个单位乘以4.75,然后再将150个单位乘以5和左边的单位乘以6并计算价格。
这是我要优化的代码,即缩短代码:
5 * 3.60
任何人都可以帮助我简短地编写程序。
感谢您的宝贵时间
答案 0 :(得分:2)
关于优化,要优化代码,您可以做的工作很少……
您绝对可以通过使用 if-elif-else 条件语句来优化它,而不仅仅是使用 if :
if(1<=units and 150>=units):
...
elif(151<=units and 300>=units):
...
:
:
else:
...
这样做时,请确保在达到正确的条件后不进行条件检查。从而减少了比较次数并优化了程序。
答案 1 :(得分:2)
如果我很了解您的问题,那么我认为您的代码在最后两种情况下做的都不正确。看起来像是先前案例的错误复制/粘贴;)
我认为对于最后两种情况,您应该:
if(451<=units and 600>= units):
firstSum = 150 * 2.50
subUnits1 = units - 150
firstSum += 150 * 3.60
subUnits1 -= 150
firstSum += 150 * 4.75
subUnits = subUnits1 - 150
secondSum = firstSum + subUnits * 5
print(secondSum)
if(601<=units):
firstSum = 150 * 2.50
subUnits1 = units - 150
firstSum += 150 * 3.60
subUnits1 -= 150
firstSum += 150 * 4.75
subUnits2 = subUnits1 - 150
firstSum += 150 * 5
subUnits = subUnits2 - 150
secondSum = firstSum + subUnits * 6
print(secondSum)
要回答您的问题,如果我理解得很好,您可以执行以下操作:
units = int(input("Enter the units : "))
factor_list = [2.5, 3.6, 4.75, 5]
last_factor = 6
upper_bound = 600
step = 150
SUM = 0
if (units > upper_bound):
SUM += (units-upper_bound)*last_factor
units = upper_bound
nb150 = units/step
for i in range(0,int(nb150)):
SUM += step*factor_list[i]
if(int(nb150) < len(factor_list)):
SUM += (units-int(nb150)*step)*factor_list[int(nb150)]
print(SUM)
此解决方案通过计算if
的欧几里得除法来避免使用多个units
语句。这样,您就可以轻松更改系数或添加其他系数,而无需编写其他案例。
第一个if
语句将处理所有大于上限的单位。基本上,将600以上的所有单位乘以6,然后从要处理的单位中删除它们。
通过nb150 = units/step
行并取整数部分,得出150个单位的组数。然后,我可以将它们乘以for
循环中的相应系数。
最后,如果单位数小于600,但不是150的倍数,则代码需要处理其余部分。因此,它将删除150个组:(units-int(nb150)*step)
,然后将其余部分乘以相应的因数factor_list[int(nb150)]
。
如果您需要进一步的解释,请随时提问!
答案 2 :(得分:1)
为什么需要缩短它的特殊原因?无论如何,您都可以通过将重复的代码块重构为方法来开始。例如
/api
发生3次。
对于所有的if语句而不是elif,还有特殊的原因吗?并不是说它会使代码更短。
答案 3 :(得分:1)
您要在换行符中一次又一次地将值添加到变量中,而不是将它们绑定在一起。您的短代码可以是:
units = int(input("Enter the units: "))
if 1<=units and 150>=units:
print("First sum:-", units * 2.50)
elif 300>=units:
print((150 * 2.50) + ((units - 150) * 3.60))
elif 450>=units:
print(((150 * 2.50)+150 * 3.60) + ((units - 300) * 4.75))
elif 600>= units:
print((((150 * 2.50) + 150 * 3.60) + (units - 300) * 4.75) + ((units - 300) - 150 ) * 5)
else:
print(((((150 * 2.50) +150 * 3.60)+(units - 300) * 4.75)+150 * 5) + (((units - 300) - 150) - 150) * 6)
答案 4 :(得分:1)
如果您不介意无法阅读,这里是您的一句话:
print(units * 2.5 + max(0, units - 150) * 1.1 + max(0, units - 300) * 1.15 + max(0, units - 450) * 0.25 + max(0, units - 600))
另外,您的示例代码在第23行(firstSum += subUnits1 * 4.75
)上存在错误,应该在此处再乘以150。
答案 5 :(得分:1)
给出您的代码(无论您的描述如何);您可以通过数学运算来缩短代码,例如:
def bill_generator(units):
firstSum = min(units, 150) * 2.5
if units <= 300:
secondSum = firstSum + units * 3.60 - 540.0
elif units <= 450:
firstSum += 540
secondSum = firstSum + units * 4.75 - 1425.0
elif units <= 600:
firstSum = 540 + units * 4.75 - 1425.0
secondSum = firstSum + units * 5.0 - 2250.0
else:
firstSum = 150.0 * 11.1 + units * 4.75 - 1425.0
secondSum = firstSum + units * 6.0 - 3600.0
print("FirstSum:-{}".format(firstSum))
if units > 150:
print(secondSum)
if __name__ == '__main__':
inp_units = int(input("Enter the units: "))
while inp_units < 1:
print("invalid input, units must be greater than zero")
inp_units = int(input("Enter the units"))
测试了边境案件:
def bill_generator(units):
firstSum = min(units, 150) * 2.5
if units <= 300:
secondSum = firstSum + units * 3.60 - 540.0
elif units <= 450:
firstSum += 540.0
secondSum = firstSum + units * 4.75 - 1425.0
elif units <= 600:
firstSum += 540.0 + units * 4.75 - 1425.0
secondSum = firstSum + units * 5.0 - 2250.0
else:
firstSum = 1665.0 + units * 4.75 - 1425.0
secondSum = firstSum + units * 6.0 - 3600.0
print("FirstSum:-{}".format(firstSum))
if units > 150:
print(secondSum)
if __name__ == '__main__':
for ii in [1, 150, 151, 300, 301, 450, 451, 600, 601, 1200]:
print('Testing for unit input "{}"'.format(ii))
bill_generator(ii)
'''
Testing for unit input "1"
FirstSum:-2.5
Testing for unit input "150"
FirstSum:-375.0
Testing for unit input "151"
FirstSum:-375.0
378.6
Testing for unit input "300"
FirstSum:-375.0
915.0
Testing for unit input "301"
FirstSum:-915.0
919.75
Testing for unit input "450"
FirstSum:-915.0
1627.5
Testing for unit input "451"
FirstSum:-1632.25
1637.25
Testing for unit input "600"
FirstSum:-2340.0
3090.0
Testing for unit input "601"
FirstSum:-3094.75
3100.75
Testing for unit input "1200"
FirstSum:-5940.0
9540.0
'''