• 返回值

return语句是从python 函数返回一个值,在讲到定义函数的时候有讲过,每个函数都要有一个返回值。Python中的return语句有什么作用,今天小编就依目前所了解的讲解一下。python 函数返回值 return,函数中一定要有return返回值才是完整的函数。如果你没有python 定义函数的返回值,那么会得到一个结果是None对象,而None表示没有任何值,不起作用。这也说明参数与返回值共同组成了函数模块与外界沟通的桥梁。当然返回的数据也可以是多个(其实只是将不同数据放在了一个元组或序列中而已),返回的对象也可以是多种类型(list,tulple,dict,整数,函数...)。

 

例如:

def fun1(a1,a2):
     a=a1*2
     b=a2+a1
     return [a,b]

当调用函数为x,y=fun1(2,3)时,得到的结果为:

>>>print(x,y)
4,5

其实返回的只是一个元组,在语法上元组是可以省略圆括号的。

 

  • 递归函数

上面讲返回值也讲到,函数是可以返回函数的。那么所谓的递归其实就是函数调用自身。当然递归也可以理解成自身在不断地循环,之所以引用递归是因为在一些事上,它相对与循环语句更简明,高效。例如求一个数的阶乘,使用递归就可以达到更好的效果。

 

例如:

def fun1(n):
       if n==1:
          return 1
       return n*fun1(n-1)

 

当我们n取5时,其运算过程是这样的:

>>>fun1(5)
>>>5*fun1(4)
>>>5*(4*fun1(3))
>>>5*(4*(3*fun1(2)))
>>>5*(4*(3*(2*fun1(1))))
>>>5*(4*(3*(2*1)))
>>>5*(4*(3*2))
>>>5*(4*6)
>>>5*24
>>>120

 

  • 递归函数的缺陷

函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。所以并不是所有循环都能用递归来实现,有时为了控制循环次数,我们还可以设置递归深度。

import sys 
sys.setaddlimit(100)

 

#这是最多循环一百次的意思

  • 解决方法

解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。