繁体   English   中英

使用最小值和最大值将值限制在 Python 中的范围内

[英]Using min and max to limit values to a range in Python

我有我在 Python 2.7.9 中编写的这个小 python 文件,现在我正在 Python 3.4.3 中对其进行测试。

一切正常,因为我能够向我的 RPI 发送命令。 但是当我发送命令改变扬声器的音量(范围为 1-100)时,它们都被 python 脚本读取为 100%。

例子:

Volume 26 ,被视为第 100 卷。我用 volume =... 注释掉了这一行,现在它可以工作了,但我无法阻止人们将音量发送到最大 @ 100%。

代码:

def setVolume(volume):
    volume = max(60, min(30, volume)) #Volume Spam Protection
    sendPost(speakerAddress+"volume","<volume>"+str(volume)+"</volume>")

我猜想,当您说volume 26被视为100% ,您是说它达到60

那是因为线路-

max(60, min(30, volume))

这大致表示为,最小为30到最大体积,最大为60到最大体积,所以您总是会得到60,因为如果体积大于30,则内部min()和外部max()会得到30您将获得60。您可以考虑小于30的交易量。

您实际上想做的是-

volume = min(60, max(30, volume))

我不确定这在Python 2.7中如何工作,根据上述条件,Python 2.7也应该存在该问题。

更具可读性的是根本不使用minmax 它们对于找到任意数量的参数的极有效,但是对于两个参数而言却过于杀伤力。

if volume < 30:
    volume = 30
elif volume > 60:
    volume = 60

(这将具有修复由于您使用的嵌套结构而导致的任何逻辑错误的副作用。)

我想,您真正想要的是您的音量在30..60范围内。 在这种情况下,您应该将最小/最大行交换为:

volume = min(60, max(30, volume))

因此,您得到的最大音量为30(至少30)(最小),结果为最小值(60)(最大60)。

为此,我编写了一个可读性好的 function limit

def limit(iMin, iVal, iMax):
   return min(iMax, max(iMin, iVal))

volume = limit(30, volume, 60)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM