当我偶然发现以下几行时,我正在对一些遗留代码进行现代化改造:
rounded_val = (len(src_string) / 2) * 2
它正在做的是利用Python's weird integer division来将字符串的长度值(如果是奇数)舍入到之前的第一个偶数值。但整数除法即将在Python 3上改变,我需要改变这一行。起初我想到了这个:
rounded_val = len(src_string) if len(src_string)%2 == 0 else len(src_string)-1
但是这会召唤len()
3次。然后我想到了使用原始想法,但是使用了地板除法运算符//
,并认为这样做可能不太兼容,我应该使用math.floor()
代替(但后来我需要)要为math
进行另一次导入。
我可能会过度思考这个问题,但在Python中用最佳方法做什么呢?
PS:输出必须是整数。
答案 0 :(得分:19)
如果您不喜欢依赖整数操作数的Python 2 //
行为,请使用/
分区代码:
rounded_val = (len(src_string) // 2) * 2
答案 1 :(得分:10)
也许
rounded_val = len(src_string) & ~1
这简单地清除1s位,这正是您所需要的。仅适用于int
s,但len应始终为整数。
答案 2 :(得分:4)
这个怎么样:
rounded_val = len(src_string) & (-2)
虽然对不熟悉二进制算术的人来说有时并不明显。
答案 3 :(得分:2)
//
运算符可能是您最好的选择,但您也可以使用divmod
函数:
rounded_val = divmod(len(src_string), 2)[0] * 2
答案 4 :(得分:1)
为什么不这样:
rounded_val = len(src_string) - len(src_string) % 2