zoukankan      html  css  js  c++  java
  • 孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归

    孤荷凌寒自学python第十九天python函数嵌套与将函数作为返回对象及闭包与递归

    (完整学习过程屏幕记录视频地址在文末,手写笔记在文末)

    Python函数非常的灵活,今天学习了python函数的以下几个知识点:

    一、在函数中可以定义子函数,并且可以将子函数作为函数的返回对象返回给外部

    测试:

    def myconnecttostring(*args):

        def fin():

            strResult=''

            for strA in args:  #这儿函数fin使用的是它的父函数myconnecttostring的形式参数(也就是myconnecttostring的局部变量),那么fin这个函数是闭包的。

                strResult+=strA

            return strResult

        return fin

     

    lstA=list('孤荷凌寒的QQ号是:578652607')

    print(lstA)

    f=myconnecttostring(*lstA)

    print(f)   #打印此作为函数返回对象的函数f在内存中的地址,下面重复执行一次,将发现每次返回的函数对象并不是同一个

    strA=f()  #f既然是一个函数,那么就可以执行它

    print(strA)

    f=myconnecttostring(*lstA) #完全相同地再调用一次函数myconnecttostring,但作为对象返回的函数f与之前不是同一个对象!!

    print(f)  #再看看这个新的函数f在内存中的地址与前一个是不一样的。

    运行结果 :

    ['孤', '荷', '凌', '寒', '的', 'Q', 'Q', '号', '是', ':', '5', '7', '8', '6', '5', '2', '6', '0', '7']

    <function myconnecttostring.<locals>.fin at 0x00000290DC75A2F0>

    孤荷凌寒的QQ号是:578652607

    <function myconnecttostring.<locals>.fin at 0x00000290DC77D400>

    二、递归

    一个函数 体的内部代码块中的代码 再次调用 自己,则称之为递归。

    递归是一种特殊的循环。

    这种循环的终止在于达到设定的条件时就不再调用自己,那么递归循环结束。

    测试阶乘:

    def jiecheng(intMax):

        if intMax==1:

            return 1

        return intMax * jiecheng(intMax-1)

     

    intM=10

    intResult=jiecheng(intM)

    print(intResult)

    运行结果:

    3628800

    测试函数jiecheng的核心语句是:

    intMax * jiecheng(intMax-1)

    也就是说不断递归调用函数jiecheng自己来做intMax-1的阶乘

    最后一个递归调用函数jiecheng时其实是一次性完成了:

    10x9x8x7x6x5x4x3x2x1

    的计算。

    如果 intMax的值设置得非常大,那么让cpu一次执行这样的运算,可能会造成系统算力崩溃。

    于是这种把所有计算全部堆到最后一次调用递归函数 时才一次计算的方法是不可取的,我们应当使用

    尾递归

    测试:

    def jiecheng(intMax):

        if intMax==1:

            return 1

        return jiechengsub(intMax,1)  #函数 jiechengsub 才是真正的递归调用的函数,给jiechengsub的形参intLastResult传递的实参为1,是因为,第一次调用jiechengsub时,之前的递归计算结果还没有,就是1,因为1乘以任何数还等于任何数。

     

    #函数 jiechengsub 的第一个形参intCurBig表示当前阶乘计算到最大值的哪一个数来了;第二个形参intLastResult表示在本次调用之前已经计算过的阶乘的积

    def jiechengsub(intCurBig,intLastResult):

        intCur=intCurBig * intLastResult #先计算当前最大数intCurBig与之前已经取得的部分阶乘结果intLastResult相乘,这儿就把计算分解到每次递归都计算一次

        if intCurBig!=1:

            intSub=jiechengsub(intCurBig-1,intCur) #然后再次递归调用的时候,已经将本次调用的计算结果 intCur作为形参intLastResult的实参传递给下次调用了

            return intSub

        else:

            return intCur #如果intCurBig已经为1,则递归过程已经结束,不再递归调用,返回最终结果 。

    intM=10

    intResult=jiecheng(intM)

    print(intResult)

    运算结果:

    3628800

    尾递归将庞大的计算分解到每次计算中都计算一点,这样分散的计算才不会对电脑CPU造成过重的负担,是比较科学的递归设计方案。

    ——————————

    今天整理的学习笔记完成,最后例行说明下我的自学思路:

    根据过去多年我自学各种编程语言的经历,认为只有真正体验式,解决实际问题式的学习才会有真正的效果,即让学习实际发生。在2004年的时候我开始在一个乡村小学自学电脑 并学习vb6编程语言,没有学习同伴,也没有高师在上,甚至电脑都是孤岛(乡村那时还没有网络),有的只是一本旧书,在痛苦的自学摸索中,我找到适应自己零基础的学习方法:首先是每读书的一小节就作相应的手写笔记,第二步就是上机测试每一个笔记内容是否实现,其中会发现书中讲的其实有出入或错误,第三步就是在上机测试之后,将笔记改为电子版,形成最终的修订好的正确无误的学习笔记 。

    通过反复尝试错误,在那个没有分享与交流的黑暗时期我摸黑学会了VB6,尔后接触了其它语言,也曾听过付费视频课程,结果发现也许自己学历果然太低,就算是零基础的入门课程,其实也难以跟上进度,讲师的教学多数出现对初学者的实际情况并不了解的情况,况且学习者的个体也存在差异呢?当然更可怕的是收费课程的价格往往是自己难以承受的。

    于是我的所有编程学习都改为了自学,继续自己的三步学习笔记法的学习之路。

    当然自学的最大问题是会走那么多的弯路,没有导师直接输入式的教学来得直接,好在网络给我们带来无限搜索的机会,大家在网络上的学习日志带给我们共享交流的机会,而QQ群等交流平台、网络社区的成立,我们可以一起自学,互相批评交流,也可以获得更有效,更自主的自学成果。

    于是我以人生已过半的年龄,决定继续我的编程自学之路,开始学习python,只希望与大家共同交流,一个人的独行是可怕的,只有一群人的共同前进才是有希望的。

    诚挚期待您的交流分享批评指点!欢迎联系我加入从零开始的自学联盟。

    这个时代互联网成为了一种基础设施的存在,于是本来在孤独学习之路上的我们变得不再孤独,因为网络就是一个新的客厅,我们时刻都可以进行沙龙活动。

    非常乐意能与大家一起交流自己自学心得和发现,更希望大家能够对我学习过程中的错误给予指点——是的,这样我就能有许多免费的高师了——这也是分享时代,社区时代带来的好福利,我相信大家会的,是吧!

    根据完全共享的精神,开源互助的理念,我的个人自学录制过程是全部按4K高清视频录制的,从手写笔记到验证手写笔记的上机操作过程全程录制,但因为4K高清文件太大均超过5G以上,所以无法上传至网络,如有需要可联系我QQ578652607对传,乐意分享。上传分享到百度网盘的只是压缩后的720P的视频。

    我的学习过程录像百度盘地址分享如下:(清晰度:1280x720)

    链接:https://pan.baidu.com/s/1RRaZNetFkH5MlEx8c6Mnvw  密码:5j4c

    Bilibili:

    https://www.bilibili.com/video/av35845811/

    喜马拉雅语音笔记:

    https://www.ximalaya.com/keji/19103006/139702269

    欢迎大家添加我为好友: QQ: 578652607
  • 相关阅读:
    发送带有正文以及附件的邮件
    软件测试笔记
    java开发 中台
    postman测试带有json数据格式的字段
    maven详解之仓库
    Maven与nexus关系
    占位
    Vue项目碰到"‘webpack-dev-server’不是内部或外部命令,也不是可运行的程序或批处理文件"报错
    了解facade设计模式
    postman使用
  • 原文地址:https://www.cnblogs.com/lhghroom/p/10022865.html
Copyright © 2011-2022 走看看