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返回值. 下面列举了三种写法,如果想成功获取到返回值,参考第 ...
随机推荐
- Eclipes更改主题及字体
1.打开Eclipse的Help->Eclipse Marketplace 2.在Find里搜索Eclipse Color Theme,点击Install按钮(lz已经安过了所以没有) 3.打开 ...
- PAT_A1100#Mars Numbers
Source: PAT A1100 Mars Numbers (20 分) Description: People on Mars count their numbers with base 13: ...
- Rust <10>:宏导出、导入
源 crate 中使用 #[macro_export] 属性标记的宏,调用者可在导入此 crate 时添加 #[macro_use] 属性使用. 没有 #[macro_export] 的宏,外部不可见 ...
- Django框架(二十)—— Django rest_framework-认证组件
目录 Django rest_framework-认证组件 一.什么是认证 二.利用token记录认证过的用户 1.什么是token 2.token的原理 3.cookie.session.token ...
- cocos2d之创建自己的场景类
| 版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 首先创建.h的头文件,然后在将一些图片声音素材加到resource文件夹内,最后在创建.cpp文件: .h头文件中创 ...
- Jmeter脚本如何在Linux通过no GUI的方式运行 命令行传递参数
本文主要介绍Jmeter脚本如何在Linux通过no GUI的方式运行.总共分三部分: 1.Linux下JDK的安装及环境变量的配置 2.Linux下Jmeter的安装及环境变量的配置 3.运行结果的 ...
- 《Hadoop学习之路》学习实践
(实践机器:blog-bench) 本文用作博文<Hadoop学习之路>实践过程中遇到的问题记录. 本文所学习的博文为博主“扎心了,老铁” 博文记录.参考链接https://www.cnb ...
- 牛客练习赛53 C 富豪凯匹配串
思路: bitset的简单题,不幸的是当时的我并不知道bitset, C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间, ...
- ASP.NET MVC 学习笔记之View 和Redriect的区别
首先先说一下Redriect 和RedirectToAction 两个没什么区别,都是向浏览器发送302 Found相应,再有浏览器向对应的url进行请求 只是参数的意义不同而已 再说Redirect ...
- Windows 下安装 nvm 管理 nodejs 版本
摘自https://segmentfault.com/a/1190000007612011 1. 下载安装与使用 Github: Download nvm-windows --- nvm-setup. ...