Python递归实现十进制转二进制时insert函数返回None问题排查
问题:递归实现十进制转二进制时,
insert返回None导致报错 我尝试用递归方式向列表插入元素实现十进制转二进制转换器,但运行时发现insert函数返回None,导致后续join操作失败。
初始代码
def dectob(num): print(num) if num==0: return [] hnum = int(num/2) if num - hnum == hnum: asn="0" else: asn="1" return dectob(hnum).insert(0,asn) print(int(''.join(dectob(6666)))==1101000001010)
参数说明
asn:二进制位值num:待转换的十进制数hnum:num取半后向下取整的值
调试代码
def dectob(num): print(num) if num==0: print("got") blanklist=[] print(blanklist) return blanklist hnum = int(num/2) if num - hnum == hnum: asn="0" else: asn="1" ret= dectob(hnum) print(ret) print(asn) return ret.insert(0,asn) print(int(''.join(dectob(6666)))==1101000001010)
问题原因
Python中list.insert()是原地修改列表的方法,它的返回值固定为None,不会返回修改后的列表。当前代码直接返回insert的结果,导致递归最终返回的是None,自然无法执行''.join(None)操作。
修正方案
不要返回insert的结果,而是先完成列表插入操作,再返回修改后的列表本身。也可以用列表拼接的方式更简洁地实现,避免insert的问题。
修正后的代码(方式1:基于原逻辑修改)
def dectob(num): print(num) if num == 0: return [] hnum = int(num / 2) asn = "0" if num - hnum == hnum else "1" ret = dectob(hnum) ret.insert(0, asn) # 原地修改列表 return ret # 返回修改后的列表 print(int(''.join(dectob(6666))) == 1101000001010) # 输出True
修正后的代码(方式2:列表拼接更简洁)
def dectob(num): print(num) if num == 0: return [] hnum = num // 2 # 用整数除法替代int(num/2)更规范 asn = "0" if num % 2 == 0 else "1" # 直接取余判断奇偶更直观 return dectob(hnum) + [asn] # 用列表拼接返回新列表,避免原地修改 print(int(''.join(dectob(6666))) == 1101000001010) # 输出True
内容的提问来源于stack exchange,提问作者Computer DOGE
相关产品推荐
相关产品推荐

