如何在Python中计算百分比增减乘数而不使用if语句
我有一个情况,用户输入一个正数、0或负数,这个数字代表百分比的增加、不变或减少。比如说:2.5表示“增加2.5%”,-3表示“减少3%”。我们把这个用户输入的数字叫做U。
我需要在Python中把U应用到某个数字X上,也就是说,要把U指定的百分比增减应用到X上,得到可能改变后的X值。
我想到一种方法,就是先看U的值,然后算出一个可以和X相乘的倍数,比如:
if U == 0:
multiplier = 1
elif U > 0:
multiplier = U/100.0 + 1
else:
multiplier = (100 - (U * -1.0))/100.0
然后我可以用这个公式得到X的新值:X = X *倍数。
最后,比较难的部分是:有没有办法在不使用多个if语句的情况下算出这个倍数,就像我上面做的那样?
我之所以问这个,是因为我实际上需要写一段Python代码,而且这段代码必须写成一行(因为它会用exec()动态执行),所以我不能有多个代码块。
如果有任何想法,我会非常感激!
迈克尔
3 个回答
Kevin的回答在技术上是完全正确的,但从数学的角度来看,你的代码可以大大简化。
你不需要在这个数学运算上进行if-then-else的检查。比如说输入是“-3”:在你的代码中,这个值会进入第三个代码块,计算结果是(100 - (-3 * -1.0)) / 100.0 = (100 - 3.0) / 100.0 = 0.97。
这实际上和输入值U进入第二个代码块的结果是一样的,计算为(-3 / 100.0) + 1 = -0.03 + 1 = 0.97。
再考虑输入为0的情况:无论它进入哪个代码块,“乘数”的值都会是1。
所以你只需要把代码写成:
multiplier = 1 + (U / 100.0)
这样就可以了。
其实,if 和 else 可以在一行里用来写表达式,比如说:x = a if b else c
。不过,你不能用 elif,所以你得先把代码改一下,确保不使用它们:
if U == 0:
multiplier = 1
else:
if U > 0:
multiplier = U/100.0 + 1
else:
multiplier = (100 - (U * -1.0))/100.0
这可以简化成
if U == 0:
multiplier = 1
else:
multiplier = U/100.0 + 1 if U > 0 else (100 - (U * -1.0))/100.0
进一步简化成
multiplier = 1 if U == 0 else (U/100.0 + 1 if U > 0 else (100 - (U * -1.0))/100.0)
你只需要用到除法的分配律:
multiplier = 1 + U/100.0
其实你的代码就是在做这个。你只是把一个if
语句分成了三个分支,但它们做的事情是完全一样的。我们来一步一步简单算一下你原来的代码:
if U == 0:
multiplier = 1
elif U > 0:
multiplier = U/100.0 + 1
else:
multiplier = (100 - (U * -1.0))/100.0
if U == 0:
multiplier = 1 + 0 #sum 0 for convenience
elif U > 0:
multiplier = 1 + U/100.0 #swap order of addition
else:
multiplier = (100 + U)) / 100.0 #multiplying by -1 is just changing the sign
if U == 0:
multiplier = 1 + U/100.0 # since U is 0 in this branch, U/100.0 == 0
elif U > 0:
multiplier = 1 + U/100.0
else:
multiplier = 1 + U/100.0 # distributive property of division
因为这三个分支执行的代码是一样的,所以没有必要用if
语句:
multiplier = 1 + U/100.0