python3 递归函数return返回None
今天写了一个函数,执行之后打印出来的结果是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的更多相关文章
- PHP递归函数return返回null的问题
前段时间在写递归函数的时候碰到个问题,返回值一直为null,这里记录一下. 写个小例子: /** * @param $i * @return mixed */ function recursion($ ...
- Python3入门系列之-----return返回值,我终于懂了
前言 初学者学习return的用法有点蒙,不知道它的作用是什么?返回的是什么?在什么时候要用?小伙伴也可能会遇到和我同样的困扰,给大家举个例子,马上就明白了. 同一段代码,函数中带return和没有r ...
- C# 调用存储过程操作 OUTPUT参数和Return返回值
本文转载:http://www.cnblogs.com/libingql/archive/2010/05/02/1726104.html 存储过程是存放在数据库服务器上的预先编译好的sql语句.使用存 ...
- 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 ...
- MSSQL - 存储过程Return返回值
1.存储过程中不使用外部参数. 存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========================== ...
- C#获取存储过程的 Return返回值和Output输出参数值
1.获取Return返回值 程序代码 //存储过程//Create PROCEDURE MYSQL// @a int,// @b int//AS// return @a + ...
- Java中的方法(形参及实参)return返回类型
如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...
- return 返回值
# ### return 返回值 """ (1) return + 数据类型 : 将这个数据弹到函数的调用处,后面除了可以接六大标准数据类型之外,还可以返回类 对象 函数 ...
- 用jquery的ajax方法获取return返回值的正确姿势
如果jquery中,想要获取ajax的return返回值,必须注意两方面,ajax的同步异步问题,在ajax方法里面还是外面进行return返回值. 下面列举了三种写法,如果想成功获取到返回值,参考第 ...
随机推荐
- webstorm 插件安装
1.打勾的表示已经安装 2.没有安装的插件,可以在plugins搜索,在右边搜索结果里点install,然后重启webstorm 3.这里有常用插件 http://blog.csdn.net/xs20 ...
- 阻抗匹配 及 SI9000 使用
1. 阻抗匹配 1. 波长 * 频率 = 光速(3*10^8) 2. PCB走线什么时候需要做阻抗匹配? 不主要看频率,而关键是看信号的边沿陡峭程度,即信号的上升/下降时间,一般认为如果信号的上升/下 ...
- openstack部署安装
OpenStack实战 准备环境 controller 10.0.0.11 compute1 10.0.0.31 常用服务端口 mariadb:3306 memcached:11211 消息队列:56 ...
- C语言函数指针用法
#include <stdio.h> #include <string.h> static void sayHello(); static void salute(); voi ...
- 制作 macOS High Sierra U盘
制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统) 随着苹果 macOS High Sierra 正式版发布,很多使用 Mac 电脑的同学都已升级到最新 ...
- Raspberry Pi 开机启动QT程序
https://blog.csdn.net/coekjin/article/details/52498212 https://blog.csdn.net/dubuzherui/article/deta ...
- Python之os.path.join()
os.path.join()函数用于路径拼接文件路径. os.path.join()函数中可以传入多个路径: 会从第一个以”/”开头的参数开始拼接,之前的参数全部丢弃. 以上一种情况为先.在上一种情况 ...
- 2019-8-31-How-to-parse-version-range
title author date CreateTime categories How to parse version range lindexi 2019-08-31 16:55:58 +0800 ...
- Python3:_pickle使用方法
常遇到的问题: python3使用pickle读取文件提示TypeError或者UnicodeDecodeError的解决办法 “ModuleNotFoundError: No module name ...
- DBCP重连的问题及解决办法(转)
本文转载:http://lc87624.iteye.com/blog/1734089,欢迎大家阅读原文. 使用数据库连接池时,免不了会遇到断网.数据库挂掉等异常状况,当网络或数据库恢复时,若无法恢复连 ...