如何将JavaScript中含.reduce的二进制转十进制函数转为Python实现?
把JavaScript的
bin2dec转换为Python代码 先理清原JavaScript代码的逻辑
原JS代码的核心是用.reduce计算二进制转十进制的结果,步骤拆解:
num.split(''):把二进制字符串拆成单个字符的数组(比如"101"变成["1","0","1"]).reverse():反转数组,让原二进制的最低位(最右边)对应索引0.reduce(...):从初始值0开始遍历反转后的数组:- 累计值
x记录当前总和 y是当前遍历的字符,i是它的索引- 如果
y是'1',就把2^i加到x上;否则x保持不变
- 累计值
你的Python代码的问题
map(int, listNum)在Python3中返回迭代器,不能直接用listNum[-1],需要先转成列表:listNum = list(map(int, listNum))- 初始值
x = listNum[-1]错误,应该和JS一样从0开始累计 - 循环里
2**listNum[i]逻辑错误,应该是2**i(索引i对应二进制位的权重,listNum[i]只是用来判断要不要加这个权重)
正确的Python实现
方法1:用functools.reduce(对应JS的.reduce)
需要导入functools模块,逻辑和JS完全对应:
from functools import reduce def bin2dec(num): def reducer(acc, current): index, char = current return acc + (2 ** index if char == '1' else 0) return reduce(reducer, enumerate(reversed(num)), 0)
方法2:用普通循环(新手更易理解)
直接模拟.reduce的累计逻辑,不用依赖额外模块:
def bin2dec(num): total = 0 # 反转字符串,遍历每个字符并获取其索引 for i, char in enumerate(reversed(num)): if char == '1': total += 2 ** i return total
测试验证
运行以下代码验证结果:
print(bin2dec("101")) # 输出5 print(bin2dec("110")) # 输出6 print(bin2dec("1001")) # 输出9
偷懒的Python内置方法
如果不需要手动实现逻辑,Python内置的int函数直接支持二进制转十进制:
def bin2dec(num): return int(num, 2)
内容的提问来源于stack exchange,提问作者Chau Loi
相关产品推荐
相关产品推荐

