2.2定义函数:
函数体内部使用return 返回函数结果;
函数没有返回时,自动使用return None;
函数可以同时返回多个值,但其实就是一个tuple。
2.3 函数的参数,有位置参数 有默认参数
一是必选参数在前,默认参数在后,否则Python的解释器会报错
二是如何设置默认参数 默认参数可以简化函数的调用,降低了函数调用的难度
def power(x,n=2):
s = 1
while n > 0:
n = n-1
s = s*x
return s
测试power(5),power(5,4)
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
定义默认参数要牢记一点:默认参数必须指向不变对象!
def add_end(L=None):
if L is None:
L = []
L.append('end')
return L
add_end() add_end()
2.4 递归函数
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的
解决递归调用栈溢出的方法是通过尾递归优化,尾递归是指,在函数返回的时候,调用自身本身,并且,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)
Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
汉诺塔: 保持上小下大的顺序,每次移动一个棋子 借助y=buff缓冲
def hanoi(n,x,y,z):
if n==1:
print(x,'-->',z)
else:
hanoi(n-1,x,z,y)#将前n-1个盘子从x移动到y上
hanoi(1,x,y,z)#将最底下的最后一个盘子从x移动到z上
hanoi(n-1,y,x,z)#将y上的n-1个盘子移动到z上
n=int(input('请输入汉诺塔的层数:'))
hanoi(n,'x','y','z')