如何优化(=缩短)我的Python代码?

时间:2018-08-17 05:59:21

标签: python calculation

我的用例如下:

我想制造一个具有不同价格的不同单位的电费生成器。在下面的程序中,如果用户在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

任何人都可以帮助我简短地编写程序。

感谢您的宝贵时间

6 个答案:

答案 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
    '''