在日常情况,可能会涉及到一个数据模型,就是前两个数字相加的所得之和,等于第三个数字,这里我们可以引用斐波拉数列数据模型;例如有如下数字
0,1,1,2,3,5,13,13,21,34,55,144,233,377,610
#打印出如上述数列,前两个数相加等于后面的数(这里做一个限制条件如果arg3>10,则返回arg3,否则就是一个无限制的循环)
#顶一个函数funcdef func(arg1,arg2):
if arg1 == 0:
pass
arg3 = arg1 + arg2
if arg3 >10:
return arg3
func(arg2,arg3)
result = func(0,1)
print result
运行结果如下:
None
对上述代码进行剖析,我们先看如下代码:#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = "ryan"
def fun5():
return 13
def fun4():
fun5():
def fun3():
fun4()
def fun2():
fun3()
def fun1():
fun2()
result =fun1()
print result
该代码是一个函数调用另外一个函数的例子,运行该代码,结果如下:None
即result的结果为None,该代码中所有的地方都是函数,最后的定义是将函数func1()赋给变量result,输出变量为None时,说明函数func1没有返回值,或者定义返回值为None,由上述代码可以发现func1没有定义返回值None,所以默认返回None;所以对该代码解释如下:
当我们执行result=func1()时,func1就会执行如下代码:def fun1():
fun2()
当执行完def func1()就会执行func2(),而func2内容如下:def fun2():
fun3()
同样,当执行完def func2():就会再执行func3(),如果func2中有返回值,则此返回值就返回给调用它的函数func1
同样再去执行func3(),即:def fun3():
fun4()
接着执行func4(),即:def fun4():
fun5()
而函数func5代码如下:
def func5():
return 13
从以上代码可以发现,在func4()调用func5的时,func5会返回一个数字13,该值是函数func5的返回值,该返回值会赋给调用他的函数,这里调用func5的函数时func4,所以此时func4里的func5其实就是return 13 语句返回的结果,即13的结果,所以func4有一个数字13(返回值 13),即:def func4(): def func4():
func5() ======================================> 13
此时的func4并没有返回值,所以实际代码为:def func3():
func4
故此次调用也就没有返回值,由于func3没有返回值,所以后面的func2调用也就没有返回值,所以上述最终结果为None
所以代码的实质为:#!/usr/bin/env python
# -*- coding:utf-8 -*-
def fun5():
return 13
def fun4():
ret = fun5():
#return None
#因为func4默认没有返回值,即返回值为None,所以13到达这一步就停止了继续传递了,
def fun3():
fun4()
#return None
#此处func3获取func4的返回值None
def fun2():
fun3()
#return None
#此处func2获取func3的返回值None
def fun1():
fun2()
#return None
#此处func1获取func2的返回值None
#resut=func1(),即result等于func1的返回值None,所以输出None
result =fun1()
print result
要实现该代码返回值,只需要做如下修改即可:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
def fun5():
return 13
def fun4():
ret = fun5():
#return None
return ret
#因为func4默认没有返回值,即返回值为None,所以13到达这一步就停止了继续传递了,
def fun3():
return fun4()
#return None
#此处func3获取func4的返回值None
def fun2():
return fun3()
#return None
#此处func2获取func3的返回值None
def fun1():
retrun fun2()
#return None
#此处func1获取func2的返回值None
#resut=func1(),即result等于func1的返回值None,所以输出None
result =fun1()
print result
解释:func5有返回值13,在func4中我们赋给了变量ret = func5(),所以ret=13,然后在后面加一句return ret,这样func4返回值即return ret 返回结果,即13,而func3下调用的func4,所以只需要在func3下将func4()改为return func4()就可以实现func3有返回值,同样在func2下调整fun3()为return func3()是func2具备返回值,再最后的func1中将func2()改为return func2()这样func1就有返回值,该过程的实质就是讲func5中的return 13经过传递最终传递到func1,从而输出出来。所以运行以上代码结果为:13
所以再回过头来看第一次的代码:def func(arg1,arg2):
if arg1 == 0:
pass
arg3 = arg1 + arg2
if arg3 > 10:
return arg3
return func(arg2,arg3)
result = func(0,1)
print result
输出结果为:13
解释:将0,1放进函数内进行执行:
arg1=0,arg2=1,arg3 = 0 + 1=1,
当执行到if语句时,就不会继续执行,因为此时的arg3<10,所以执行下面的func(arg2,arg3)语句此时func(arg2,arg3)为func(1,1),arg2=1,arg3=1,即func(1,1),arg3=1+1=2,arg3<10,
继续执行
func(arg2,arg3),arg2=1,arg3=2,即func(arg1=1,arg2=2),arg3=1+2=3,arg3<10,
继续执行
func(arg2,arg3),arg2=2,arg3=3,即func(arg1=2,arg2=3),arg3=arg1+arg2=2+3=5,arg3<10,
继续执行
func(arg2,arg3),arg2=3,arg3=5,即func(arg1=2,arg2=5),arg3 =arg1+arg2=3+5=8,arg3<10,
继续执行
func(arg2,arg3),arg2=5,arg3=13,即func(arg1=5,arg2=13),arg3=arg1+arg2=5+8=13,arg3>10,
此时返回arg3,即13,if语句成立后,运行return arg3,此时只是在arg3>10时作为本次调用结果返回,但是我们要求的本次返回的结果要返回给上一次调用,才可以正常输出否则结果显示为None,这里可以参考上面的fun1.....fun5函数的例子理解,所以在最后要有一次要将结果赋值给上次调用,这里可以将代码再做修改看下进行分析:def func(arg1,arg2):
if arg1 == 0:
pass
arg3 = arg1 +arg2
#print arg3
if arg3 >10:
return arg3
print arg3
print "###########"
return func(arg2,arg3)
result =func(0,1)
print result
运行结果:1
###########
2
###########
3
###########
5
###########
8
###########
13
如果将return func(arg2,arg3)改为func(arg2,arg3)再看下运行结果:def func(arg1,arg2):
if arg1 == 0:
pass
arg3 = arg1 +arg2
#print arg3
if arg3 >10:
return arg3
print arg3
print "###########"
func(arg2,arg3)
result =func(0,1)
print result
运行结果:1
###########
2
###########
3
###########
5
###########
8
###########
None
从这里可以看出当arg3<10的时候,都可以输出的arg3,而当arg3>10的时并没有arg3的值输出,其根本原因是没有将arg3返回给func函数体,即arg3的值就停留在return arg3这里,没有进一步传递,因为是递归调用,本次的返回值应该返回给上次调用的函数体本身,即func(arg),所以此时的返回值却停留在return arg3这里,所以返回值为默认值(即None),故这里应该在func(arg2,arg3)前面添加return
def func(arg1,arg2):
if arg1 == 0:
pass
arg3 = arg1 +arg2
#print arg3
if arg3 >10:
return arg3
print arg3
print "###########"
return func(arg2,arg3)
result =func(0,1)
print result
原文地址:http://rookies.blog.51cto.com/10837891/1729259