今天写了一个函数,执行之后打印出来的结果是None,不明白,之后百度了一下,这里记一下过程,免得之后再踩坑
#!/usr/bin/python3# -*- coding:utf-8 -*-def binarysystem_to_decimalsystem(): '''实现二进制转十进制''' binarysystem = input('请输入数据:') decimalsystem_sum = 0 try: binarysystem = float(binarysystem) except ValueError: print('输入错误,请重新输入') binarysystem_to_decimalsystem() else: binarysystem = str(binarysystem) if len(binarysystem.replace('1', '').replace('0', '').replace('.', '')) == 0: binarysystem = binarysystem.split('.') binarysystem_int = binarysystem[0] # 整数部分 binarysystem_int = binarysystem_int[::-1] binarysystem_float = binarysystem[1] # 小数部分 for i, index in zip(binarysystem_int, range(0, len(binarysystem_int))): decimalsystem_sum = int(i) * 2 ** index + decimalsystem_sum for j, secondar in zip(binarysystem_float, range(1, len(binarysystem_float) + 1)): decimalsystem_sum = int(j) * 2 ** (-1 * secondar) + decimalsystem_sum return decimalsystem_sum else: print('输入错误,请重新输入') binarysystem_to_decimalsystem()if __name__ == '__main__': print(binarysystem_to_decimalsystem())
上面是刚写完的代码,按照想法,应该会输出正确的值,结果却输出了None按照函数的定义,在没有返回值或是return语句没有接收到返回值的时候,才会出现None之后debug了一下,发现函数在执行之后得到了正确的结果,但是却没有直接结束,而是回到了判断分支的地方之后在网上百度了一下,也看了一些文章,了解到这是递归函数的一个坑,当同时使用判断语句、递归函数、return语句的时候,这个坑就会出现比如下面这个函数
def test_recursion(x): if x > 9: x -= 3 test_recursion(x) else: return xprint(test_recursion(20))这个执行出来的结果也是None,改用print打印的写法,结果就是正确的
def test_recursion(x): if x > 9: x -= 3 return test_recursion(x) else: print(x)test_recursion(20)
要使用递归函数,return语句的正确的写法是下面这个
def test_recursion(x): if x > 9: x -= 3 return test_recursion(x) else: return xprint(test_recursion(20))这里面的逻辑是这样:这个函数被重复调用了4次,在最后一次调用的时候得到了正确结果,然后回到了倒数第二次调用的地方,之后倒数第三。。。。。。。也即是说,第一种写法,因为递归的时候缺少了return语句,返回的结果是第一次被调用的结果,不是最后一次的正确结果第二种写法,加上了return语句,返回的是最后一次的结果,逻辑是最后一次的结果用return语句给了倒数第二次调用,倒数第二又给了倒数第三。。。