美文网首页
2018-10-17 018 函数Def B

2018-10-17 018 函数Def B

作者: 杜若飞er | 来源:发表于2018-10-17 19:37 被阅读3次

    今天写一写函数的(相对)高级用法,主要是递归、嵌套、作用域和匿名函数的东西;

    函数嵌套

    函数在定义时,内部可以再写完整的函数体,两个函数就形成了嵌套关系,逻辑很简单,实现也很直观,没什么好说的;

    函数递归

    如果一个函数在内部的代码段里调用了其自身,我们就称之为这是一个递归函数,而这种算法就叫做递归算法;递归是一个相对来说很普遍的解决问题的方式,高端一点说就是不断把复杂的问题“降维”,最后直接降为一个易于处理甚至结果显然的小问题;
    在计算机还没出现时,我们的Ade女神在自己的小册子就设计了很多重要的基础算法,其中就包括循环、递归等等现在看起来几乎是构成计算机语言基石的部分,关于女神还有很多人的故事,我也很有兴趣讲一讲(等学习手记部分告一段落……)
    递归函数有两大要点:其一就是递归是有结束的,当问题降为降低到一定程度,必须有合适的算法让递归结束,否则就会形成一个死循环,用全宇宙的计算能力也不可能算出哪怕最简单的一个无穷嵌套的结果;其二是大问题的分解方法,也被称为递归体;
    举个例子:

    def Func(a):
    # 求斐波那契数列的第n项
        if (a == 1) or (a == 2) :
            return 1
        else :
            result = Func(a-1) + Func(a-2)
            return result
    print(Func(3))
    

    正如注释所言,这是一个求斐波那契数列的函数,其递归边界就是当消解到数字1或2时(斐波那契数列前两项),直接返回1就可以,除此之外,则要用第n-1和n-2项相加以获得第n项,n-1项和n-2项也同样是这样分解,就可以求出结果;
    函数递归一般可以应用于以下问题:
    数据通过递归定义,或者问题可以通过递归解决,或者要处理的数据结构有递归的特点(学过数据结构这门课应该就明白了)
    从本质上,递归的生效需要调用工作栈,但是计算机系统分配的工作栈深度是有限的,所以递归不只是解决不了无限问题,在递归次数太多了也会有问题;

    Lambda函数

    Lambda函数是一种匿名表达式——严格来说也是函数的一种,但其只能包装一些简单的逻辑,而且不能由多行代码构成;
    举个例子:

    sum = lambda num1,num2 : num1 + num2
    print(sum(2,3))
    

    这里就用lambda语法封装了一个加法操作,这样做的好处是比一般的函数执行速度要快,让人想起C++的init函数,但其实本质上实现方法是不同的,lambda函数有自己的命名空间,而init函数则是避免调用系统栈内存;
    因为独立的命名空间的原因,匿名函数不能访问自已定义的参数列表之外的任何参数;

    变量作用域

    变量作用域书里唠唠叨叨写了很多,但Python的变量无非就是全局变量和局部变量两个——和其他任何做如此区分的高级语言没区别:全局的全局可用,局部的局部可用,同名时调用局部;

    相关文章

      网友评论

          本文标题:2018-10-17 018 函数Def B

          本文链接:https://www.haomeiwen.com/subject/vjorzftx.html