一:print函数简述
使用python的print函数十分便利,因为无论是什么类型的数据,数值,字符串,列表…都可以通过print函数直接输出,或者赋值给变量以后再输出。print函数中常出现的问题是自动附加空格和多个print函数自动提行,都可以利用end=’ ‘和sep=’ '来解决。但是,如果在print函数中加入了自定义的函数,那么最后的结果就有可能出现None乱入和顺序错误的问题,且由于python与C语言和C++的不同,可能一时无法发现问题所在。
二:问题描述
下面以我编写的一个python程序为例,这个程序的目的是实现输入秒数转换成具体时间,我的代码截图如下:
可以看到,从逻辑上来说,程序并没有问题,当测试用例数值较小时也没有出现问题
但是当测试用例数值超过一定范围(准确说是超过3600)时却出现了令人感到意外的情况
不难发现,print函数调用自定义函数时出现了错误,那么问题出现在哪呢?
三:问题原因
这个问题的出现是print函数的内部机制导致的 ,print函数会先计算传递给他的参数再返回打印,当使用print(function_name())时,python会找到def function_name()片段,执行此自定义函数,取得返回值并返回给print函数并产生输出结果。这也就是为什么,明明字符串排在自定义函数之前,输出结果却是自定义函数内容在前。同理,若print函数中中包含的自定义函数A中调用了函数B,函数B调用了函数C,那么,最终执行的顺序将是C-B-A。
现在我们明白了顺序错误的原因,那么为什么会出现None这个我们没有定义的字符串呢?这就是定义函数的原因了,不同与C语言和C++等语言在定义自定义函数时会在前面加上void,int,float等返回值类型,如果我们在python的自定义函数末尾不加上return关键字,那么自定义函数就会变成void型,而void函数仅执行函数体内部内容,不产生返回值,那么print函数得不到返回值,当然就会输出None咯!
四:解决方法
这个问题最简单的方法当然是使用return关键字了!如我的用例中,将代码改为
即可避开None和顺序错误问题。但是这样又会因为返回值又有int型又有字符串而出现一些问题
所以,最好在返回值存在字符类型混杂时将返回值统一强制类型转化,如
这样就能完美解决问题
同时,根据自身处理问题的需要,也可以不使用返回值,而是在print函数中不使用自定义函数来解决,但是只涉及到一些特殊情况,这样的方法是不适用的,所以应该根据自己的需要选择方法。