今天写了一个函数,执行之后打印出来的结果是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 x print(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 x print(test_recursion(20)) 这里面的逻辑是这样:这个函数被重复调用了4次,在最后一次调用的时候得到了正确结果,然后回到了倒数第二次调用的地方,之后倒数第三。。。。。。。
也即是说,第一种写法,因为递归的时候缺少了return语句,返回的结果是第一次被调用的结果,不是最后一次的正确结果
第二种写法,加上了return语句,返回的是最后一次的结果,逻辑是最后一次的结果用return语句给了倒数第二次调用,倒数第二又给了倒数第三。。。

python3 递归函数return返回None的更多相关文章

  1. PHP递归函数return返回null的问题

    前段时间在写递归函数的时候碰到个问题,返回值一直为null,这里记录一下. 写个小例子: /** * @param $i * @return mixed */ function recursion($ ...

  2. Python3入门系列之-----return返回值,我终于懂了

    前言 初学者学习return的用法有点蒙,不知道它的作用是什么?返回的是什么?在什么时候要用?小伙伴也可能会遇到和我同样的困扰,给大家举个例子,马上就明白了. 同一段代码,函数中带return和没有r ...

  3. C# 调用存储过程操作 OUTPUT参数和Return返回值

    本文转载:http://www.cnblogs.com/libingql/archive/2010/05/02/1726104.html 存储过程是存放在数据库服务器上的预先编译好的sql语句.使用存 ...

  4. try--catch--finally中return返回值执行的顺序(区别)

    1.try块中没有抛出异常,try.catch和finally块中都有return语句 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public static int ...

  5. MSSQL - 存储过程Return返回值

    1.存储过程中不使用外部参数. 存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========================== ...

  6. C#获取存储过程的 Return返回值和Output输出参数值

    1.获取Return返回值  程序代码 //存储过程//Create PROCEDURE MYSQL//     @a int,//     @b int//AS//     return @a + ...

  7. Java中的方法(形参及实参)return返回类型

    如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...

  8. return 返回值

    # ### return 返回值 """ (1) return + 数据类型 : 将这个数据弹到函数的调用处,后面除了可以接六大标准数据类型之外,还可以返回类 对象 函数 ...

  9. 用jquery的ajax方法获取return返回值的正确姿势

    如果jquery中,想要获取ajax的return返回值,必须注意两方面,ajax的同步异步问题,在ajax方法里面还是外面进行return返回值. 下面列举了三种写法,如果想成功获取到返回值,参考第 ...

随机推荐

  1. 15. Django连接Mysql数据库

    安装PyMySQL,打开cmd, pip install PyMySQL 在.../blog/init.py 目录下添加: import pymysql pymysql.install_as_MySQ ...

  2. EmWin 如何显示汉字 不用在文件中使用编码

    1. Font Converter for emWin 生成C文件字库 1.1 新建文件 1.2 选择字体 1.3 为了减小C文件体积,这里只加入自己需要的汉字,先把所有字体取消选择. 1.4 新建一 ...

  3. 13.JMeter 参数化、检查点、集合点

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...

  4. java.lang -> Object

    java.lang -> Object 是什么 Object 类是类层次结构的根,是 Java 中唯一一个没有父类的类,Java 中所有对象包括数组都继承了 Object 类中的方法. 重要方法 ...

  5. php &引用符的注意情况

  6. adb基本操作

    用途 命令 备注 安装app adb install xxx.apk -l 锁定该应用程序-r 替换已存在的应用程序,也就是说强制安装-t 允许测试包-s 把应用程序安装到sd卡上-d 允许进行降级安 ...

  7. ReentrantLock的相关方法使用

    获取锁定 void lock():常用获取锁定的方法 void lockInterruptibly():如果当前线程未被中断,则获取锁定:如果当前线程被中断,则出现异常 boolean tryLock ...

  8. 微信小程序のmina架构

  9. Aspose.Words转换为PDF的时候字体丢失的问题解决

    系统中明明有字体的,Word中显示也正常,就是转换为PDF以后不正常,字体丢失,被替换成了等线字体 好一番研究,终于找到原因 ,原因是Windows\Fonts下的文件,有些只是虚拟的路径,真正的字体 ...

  10. (转)Http和Https的区别

    1.什么是Http Http中文叫做超文本传输协议, 它完成客户端到服务端等一系列运作流程 1.1 与http关系密切的协议: IP, TCP和DNS 负责传输的IP协议 IP协议数据网络层, IP协 ...