如何在Python中计算百分比增减乘数而不使用if语句

0 投票
3 回答
7147 浏览
提问于 2025-04-18 12:38

我有一个情况,用户输入一个正数、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 个回答

1

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)

这样就可以了。

2

其实,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)
7

你只需要用到除法的分配律:

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

撰写回答