前面已经讲了5个函数今天准备再讲几个函数准备结束这一小章节,这次知识点内容可能比较多,请同学们认真阅读。
6.自定义虚函数详解:
我们先写一个计算x2的函数:
def chen(x):
return x * x
对于chen(x)函数,参数x就是一个位置参数。
当我们调用chen函数时,必须传入有且仅有的一个参数x
对于这个函数的扩展:
def chen(x, n): #注意这是自定义函数用来求x的n次方
s = 1
while n > 0:
n = n - 1
s = s * x
return s
>>> chen (2,2)
4 #这是输出结果
这个写法是使用了原来的while语句所以输入时必须输入两个参数,不然会出现错误。
现在写一个关于注册类的自定义函数:
>>> def chen(sex,name,age=20,weight='50kg'):
... print('name',name)
... print('sex',sex)
... print('age',age)
... print('weight',weight)
...
>>> chen('nan','zhuan') #输出结果
name zhuan
sex nan
age 20
weight 50kg
7.递归函数
def fact(n): #定义一个函数fact
if n==1: #if循环结构 判断n是否等于1
return 1 #当等于1是输出1
return n * fact(n - 1) #否则输出这个函数
使用递归函数要注意防止栈溢出,计算机中函数递归调用是通过栈(stict)这种数据结构实现的每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。可以试试fact(1000):
File "", line 4, in fact
File "", line 4, in fact
File "", line 4, in fact
File "", line 4, in fact
File "", line 4, in fact
File "", line 4, in fact
RuntimeError: maximum recursion depth exceeded
在这里先讲解一下什么是尾递归:尾递归就是说在函数返回的时候在调用本身,并且,return语句不可以包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧。
解决递归调用栈溢出的方法是通过尾递归优化。事实上尾递归和循环递归的效果是一样的,所以,把循环看作一种特殊的尾递归函数也是可以的。
def fact(n):
return fact_iter(n, 1)
def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)