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

How to optimize (= shorten) my Python code?

我的用例如下:

我想制作一个电费生成器,不同的单位有不同的价格。在下面的程序中,如果用户在 1-150 之间输入单位,那么为了计算价格值,它将与 2.50 相乘并计算价格。如果用户单位在 151-300 之间,那么它会将第一个 150 单位乘以 2.50,左边的单位将乘以 3.60 意味着如果用户输入 155 然后对于第一个 150 150 * 2.50 和左边的单元 5 它将做乘法 5 * 3.60。就像上面我说的,我正在做下面给出的四种变体:-

这是我寻求优化的代码,即缩短:

units = int(input("Enter the units"))
if(1<=units and 150>=units):
    firstSum = units * 2.50
    print("First sum:-", firstSum)
if(151<=units and 300>=units):
    firstSum = 150 * 2.50
    subUnits =  units - 150
    secondSum = firstSum + (subUnits * 3.60)
    print(secondSum)
if(301<=units and 450>=units):
    firstSum = 150 * 2.50
    subUnits1 = units - 150
    firstSum += 150 * 3.60
    subUnits = subUnits1 - 150
    secondSum = firstSum + subUnits * 4.75
    print(secondSum)
if(451<=units and 600>= units):
    firstSum = 150 * 2.50
    subUnits1 = units - 150
    firstSum += 150 * 3.60
    subUnits1 -= 150
    firstSum += subUnits1 * 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 += subUnits1 * 4.75
    subUnits2 = subUnits1 - 150 
    firstSum += 150 * 5
    subUnits = subUnits2 - 150
    secondSum = firstSum + subUnits * 6
    print(secondSum)

任何人都可以帮助我简短地制作我的程序。

感谢您的宝贵时间

为什么需要缩短它的特殊原因?无论如何,您可以从将重复代码块重构为方法开始。例如

firstSum = 150 * 2.50
subUnits1 = units - 150
firstSum += 150 * 3.60
subUnits = subUnits1 - 150

发生了三次。

另外,所有的 if 语句而不是 elif 语句是否有特殊原因?并不是说它会使代码更短。

您在换行中一次又一次地将您的值添加到变量中,而不是将它们绑定在一行中。您的短代码可以是:

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)

谈到优化,为了优化代码,您可以做的很少......

您绝对可以通过使用 if-elif-else 条件语句而不是仅使用 if 来优化它:

if(1<=units and 150>=units):
    ...

elif(151<=units and 300>=units):
    ...

:
:

else:
    ...

这样做是为了确保在达到正确条件后不会进行条件检查。从而减少比较次数,优化程序。

如果您不介意这里的不可读性,这是您的单行:

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。

如果我很了解你的问题,我认为你的代码在最后两种情况下没有做正确的事情。它看起来像以前案例中的错误 copy/paste ;)

我认为对于最后两种情况你应该有:

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)

此解决方案通过计算 units 的欧氏除法简单地避免了多个 if 语句。这样您就可以轻松更改系数或添加其他系数,而无需编写其他案例。

第一个 if 语句处理所有大于上限的单位。基本上是把所有600以上的单位都乘以6,从要处理的单位中去掉。

通过nb150 = units/step行并取整数部分,我得到了150个单元的组数。然后我可以在 for 循环中将它们乘以它们相应的系数。

最后,如果单元数低于 600 但不是 150 的倍数,则代码需要处理其余部分。所以它删除了 150 的组:(units-int(nb150)*step),然后将其余的乘以相应的因子 factor_list[int(nb150)]

如果您需要进一步的解释,请随时询问!

鉴于您的代码(无论您的描述如何);您可以通过计算来缩短代码,例如:

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