如何优化(= 缩短)我的 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
。就像上面我说的,我正在做下面给出的四种变体:-
如果单位介于 1-150 之间,则它将乘以 2.50 并计算价格。
如果单位介于 151-300 之间,则它将前 150 个单位乘以价格 2.50,剩下低于 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计算价格。
这是我寻求优化的代码,即缩短:
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
'''
我的用例如下:
我想制作一个电费生成器,不同的单位有不同的价格。在下面的程序中,如果用户在 1-150
之间输入单位,那么为了计算价格值,它将与 2.50
相乘并计算价格。如果用户单位在 151-300
之间,那么它会将第一个 150
单位乘以 2.50
,左边的单位将乘以 3.60
意味着如果用户输入 155
然后对于第一个 150 150 * 2.50
和左边的单元 5 它将做乘法 5 * 3.60
。就像上面我说的,我正在做下面给出的四种变体:-
如果单位介于 1-150 之间,则它将乘以 2.50 并计算价格。
如果单位介于 151-300 之间,则它将前 150 个单位乘以价格 2.50,剩下低于 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计算价格。
这是我寻求优化的代码,即缩短:
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
'''