Python 函数

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')

 

posted @ 2017-11-28 17:59  smartwen  阅读(142)  评论(0编辑  收藏  举报