00:00
刚刚我们说了我们第一种高阶函数啊,这种函数呢,是我们将这个函数作为参数传递,那我们说还有一种高阶函数,我们可以干嘛呢?将函数作为返回值返回,那这种函数呢,我们称为叫做一个B包啊,我们创建一个零九叫做一个B包,那B包呢,在这儿我们就是一个简单的介绍,在这我们不做过多的深入讲解,了解一下啊这种高阶函数啊B包,那咱们先说什么叫,还有刚才那种高阶函数是将函数作为参数传递的,那我们说了,哎将什么呀,将我们这个函数作为什么呢?哎,返回值返回,哎返回值返回,那也是什么呀?哎也是一种我们这个高阶函数啊,也是高阶函数,所以这种函数非常好定义啊,我们直接来一个定义,一个我们来一个FN,这时候来一个函数,那这里边呢,我在函数内部,哎,函数内部干嘛呢?哎,我来再,哎,再定义一个什么呀,再定一个函。
01:00
函数,那这个时候我们直接来一个这个def DeFine我们来一个FN2啊,FN2这里边我们直接print啊,Print来什么呢?哎,我是FN2,直接再定义个函数,那然后干嘛呢?哎,我们来将我们这个内部函数FN2,将我们这个哎内部函数或者我们不叫F2,我们叫做一个inner吧,哎,Inner inner就是内部的意思是吧,将内部函数inner,哎,作为我们这个返回值返回,直接return一个inner,那这里边还是注意要不要加括号,哎,可千万不要加括号,加括号是调用inner,我们这不需要调,只需要把它作为返回值返回,那现在我们FNN这个函数返回的是不是就这么一个函数,哎,函数,那现在我这如果去调FN的话,FN括号它返回的是谁?哎,返回的就是in的这个函数,我们直接打印啊,直接打印,直接一保存走一个,哎是不是一个inner啊,哎,Inner那这里注意了,我来干嘛呢,我来揭我来。
02:00
创建一个变量来保存一下,这我随便写一个直接R等于它RR等于它,那在这里我们来普润一下R,那R是不是就是这个内部函数,哎,内部函数那我问你了,能不能掉啊,哎,那既然是函数当然能掉了,直接R来一个括号,我这一执行函数是不是执行了?哎,我是FN2,那这也是一种高阶函数,为什么?因为它返回值是它的什么呀?内部函数啊,内部函数这也是一个高阶函数,哎,那我同学说,那老师你这么写有什么用啊?哎,有什么用啊,那首先在这我们来调了一个R这个函数,但是这个函数它是不是在全局作用语中定义的呢?哎,很明显不是,它不是在全局作用语中定义的,它在哪定义的?它是在我们的函数FN函数内部定义的吧,哎,FN函数内部定义的,所以注意啊,我们来说一下R是什么呢?是一个函数,它是什么呢?它是我们这个,哎,是我们这个调用FN。
03:00
后的什么呀?哎,返回的函数,也就是说什么呢?也就是说这个函数是在我们这个FN什么呀?哎内部定义的,并不是什么呢?哎,它并不是全局函数啊,并不是全局函数,那它有什么用,那它有什么用,那这个函数就有一个特点,它既然是在FN函数内部定义的,以什么呢?哎,所以这个函数总是能,哎访问到我们这个FN函数内的什么呀,变量,哎,FN函数内的变量什么意思,之前我们说了我们的这个。作用欲,我们的这个作用欲它对外部是封闭的,我们说它是什么呀?你一个大作用欲里边是不是套着一个一个小作用欲啊,哎,小作用我们说你从里边可以看到外边,你从局部可以看到全局,但是你从全局能不能看到局部呀,哎,就不行了啊,就不行了,但是现在来看我们这个R这个函数,它是不是在我们FN内部去定义的呀,所以这个时候它是可以访问到FN内部函数,我们来看一下啊内部的这个变量的,比如说我在这儿来一什么呢?我来一个这个A等于个十,随便写一个,那这个时候我这打印一下啊,打印一下A,这个时候我们来看啊,来看我直接一执行这个十能不能访问,诶这个十它是能访问到的,但是你如果是直接去打印一个A,直接打印A,这是不是在全局去访问啊,能不能访问,这是不能访问啊,这是不能访问的,也就是说现在我们的这个十实际上只有谁只有这个R能访问啊,只有R能访问,也就是说这个A只有他能看到,别的人能不能看到,哎,就不能看到了啊,就不能看。
04:41
啊,那这样这里实际上就形成了一个什么,就形成了一个叫做闭包的东西,为什么叫闭包,因为这个东西对于外部是封闭的,别人谁也看不见,只有谁能看到,只有内部函数in的能看到,啊,这个A只有in的能看到,只有in的能使用,所以这个时候就形成什么呀,形成了一个B包啊,形成壁包,所以注意这种高阶函数。
05:07
哎,高阶函数我们什么呢?哎,我们也称为叫什么呀,哎称为叫做一个B包啊也称叫做一个B包,那它有什么好处啊,有什么好处,那什么呢?哎通过B包,哎通过B包我们可以什么呢?哎我们可以创建一些哎只有我们这个当前函数,诶能访问的一个变量啊能访问变量,也就是说现在A这个变量只有什么,只有它能访问到,别人干嘛呀都访问到了,也就是说我可以什么呀,诶可以,诶将诶一些什么呀,诶私有的这个数据,诶藏到什么问呢?诶藏到我们这个B包中,诶也就是说什么时候用它,当你这个函数需要有些数据只有你自己能访问,别人访问不了的时候,这个时候你就可以创建一个什么呀,创建一个B包啊创建一个标,但是这个东西用的不多啊,用的不多啊,那我们这个B包到底有什么用呢?哎,我们这里来演示一下啊,来演示一下,那首先呢,我们先说这么一个虚。
06:08
求是吧?哎,我来干嘛呢?哎,我来求我们这个多个数的一个平均值啊,求我们个多个数的一个平均值,那这个东西我们要怎么求啊,怎么求,那首先呀,我们先整一列表啊,我直接来一个numbers numbers等于什么呢?等于一个中号里边放几个数啊,50 30 20,诶十,然后这来一个这个,诶这个77对吧,我有这么几个数,那我现在咱们先简单一点,我现在求这几个数的平均值,我要怎么求,那平均值肯定是什么呀,诶先求和对吧,然后求总数,我们先说怎么求和啊,怎么求和,那实际上在我们Python里边,我们有一个内置函数,就叫sum sum干嘛呢?诶用来求我们一个这个什么呀?哎,列表中,哎所有元素的什么呀?哎,所有元素的一个和,所以在这我们直接print print来什么呢?Sum里边我们来传一个numbers这一保存啊,这一保存我们这一执行是不是就是187啊,也就说他们的和是187,那要求平均值呢?哎,我再需要再干嘛呀,哎,除以它的一个什么呀?哎除以它的。
07:08
一个长度,哎,Le一个numbers是不是它的一个长度,我这一执行平均值就是一个37.4,也就是说我现在这几个数的平均值是37.4,对吧?好,那现在问题就来了,问题来了在哪呢?那现在我这种求的方式我是不是。每一次都要往里去加数啊,每每一就是我是求的是什么呀?固定几个数,我有六个数,就求的是六个数平均值,我有五个数,就求的是五个数平均值是不是固定这几个数,哎,那假如说我这几个值是经常变的,我可能干嘛呢?我可能要不断的去往里边去加值,对吧?不断往里去加值,不断的加值,可能我一会儿加一个,一会儿加一个,对吧?开始一个值都没有,我要干嘛呀,不断的往里面去加值,我要怎么办?那这个时候我就需要一个什么呀,需要一个函数啊,我们来干嘛呢?哎,我们来创建,我们先创建一个什么呢?列表,我们先说不用,不用我们这个必包的方式啊,我来创建一个列表,用来保存我们这个数值,我直接来一个numbers,等于这个中号啊,等于中号,然后呢,我们来干嘛呢?哎,我们来创建一个函数,哎创建一个函数用来干嘛呢?哎,用来计算我们这个平均值啊,平均值直接我们来一个DeFine,我们来一个函数名叫aver。
08:27
一啊,叫做一个average,我们这个求求平均的方,平均的意思啊,平均意思,那现在我们要求平均值,因为我要求值的话,我是不是需要先往这列表里去加值啊,哎,加值,所以在这我们需要一个参数叫N,这个N是什么?这个N是我们要往列表里边加的值啊,这个N是我们要往列表里去加的值,所以在这我们先做一件事儿,我们先干嘛呢?诶先将我们这个N来添加到我们这个列表中,直接来一个numbers添加怎么做怎么做,哎,我们叫做一个a pen的一个什么呀,N,现在这个N是不是就到列表中了,哎,到列表中了,然后添加完了以后,再接下来我们列表中多了一个新数,在这我是要求我们这个平均值啊,哎,求一下我们这个平均值,平均值我们要怎么求呢?我们在这儿来整一个吧,哎,整一个直接来一个这个,哎,Return return谁呢?哎,Return我们的是这个数,这个数是不就OK了,那现在我们来看一下这个函数的效果啊。
09:27
那现在我们这边没数了,对吧,我直接普润的,普润的一个这个,诶调一下这方法,我传一什么呢?我传十,现在是不是就一个数啊,哎,就一个数,所以平均值是不是就是就是十啊,哎,就是十好,我再传一个,还传一个11保存平均值是不是还是十啊好,这如我换了我换了我传一个,我传一什么呢?我复制一下,我传一个30,现在是不是三个数啊,三个数加一块是50,那平均值应该是50除以三是不是一个16啊哎,16.66啊六六,那我再来一个,来一个四个数,四个数呢,我来一个还来30,那这个数四个数是不是应该变成变成20了,哎,变成20了,那现在我是不是就可以去求平均值了,哎,你可以往上加数,加完数以后,它会自动给你显示这个什么呀,显示这个平均值啊,显这个平均值,那这个时候我们来说一下了,有什么问题吗?有什么问题吗?那注意了,现在我们这个numbers它是干嘛的,Numbers现在是用来保存我们的这个列表的,哎,保存我们这个数字的列表。
10:27
现在它是一个什么变量,诶,它是一个全局变量,那既然是全局变量,是不是就在任意位置都可以访问,哎,都可以访问,那也就是说别人也能看见,那也就是意味着别人能不能去修改这个numbers,哎,Numbers当然能改了,对吧?当然能改了,那这个时候假如说是这样的啊,我这有人改了,我这有人改了一个numbers,我在这改了一下啊,Numbers点了一个aend aend的一个hello,他往numbers里加了一个hello,加了一个hello,这时候我在执行干嘛了,这是不是就报错了,哎报错了告诉你什么呀,告诉你不支持这个这个这个int和这个字符串做加法运算啊,做加法运算就给你报错了,哎,懂这意思吧,因为这个numbers现在是一个全局的,谁都能看见的,所以现在你写到这儿,它是不是不安全呀,很容易被一些人不小心就给你干嘛了,改掉了,这一定不是成心的,因为他可能不知道,或者他也有一个东西跟这个名是一样的,甚至更可怕的什么呢?
11:27
他可能直接干嘛了,直接覆盖了numbers等于中块,它创建了一个新的列表,那这样是不是把这numbers给覆盖了,一覆盖那这更可怕,是不是直接就就出了一三十了,诶那结果什么就就不准了,就会导致我们把之前的数据全都丢失了,所以像我们这个numbers这个东西很明显它希不希望被别人看到,哎不希望,那这个东西是不是就应该是一个私有的,诶私有的那怎么办啊,那怎么办?那这个时候我们在这儿就可以来创建一个B包,怎么创建B包,那出现B包一定会有什么呀,函数签到,所以在这儿你要整B包非常简单,在它的外层再加一个函数,比如说我这来一个DEF,我们叫什么呢?叫做一个make make,一个AV,哎,Make啊,这个函数是干嘛呀,是创建我们函数的函数,然后干嘛呢,把这整体给它缩进一下,现在我们说了这一堆是不是都属于我们这个函数内部了,哎,内部了,然后最后不要忘了干嘛呢,返回我们这个函数AV,现在我们这个函数是不是。
12:27
作为返回值返回了,哎反回是返回了,那现在我问你这个numbers别人还能不能看见,哎,就看不到了,是不是只有这儿能看见,哎只有这能看见,好,那我们来看效果啊,来看效果,那我要获取到这函数,我是不是得先得调一下外层函数啊,所以在这儿啊,我直接来一个名字一样无所谓,因为它的作用欲不一样,等于一个叫做一个make,一个它直接一调用完事,那现在来看这个11直行10.0,我再调一个啊,再调一个,我来一个20 20应该变成15了,对吧?哎,15再来一个,来一个现在是15啊,现在是15,我来什么呢?哎,我来一个这个30 30应该变成什么了,变成了20了,对吧?诶你还可以再传是吧,你还再传,我再传一,20 20,这时候四个值了,四个值是不是变成,变成还是20对吧,还是20,因为你传20是不变的,那我来什么呢?我来一四十来40,来41直行,是不是变成25了,哎,25了,那这样是不是就可以正常去计算这个平均值了,哎,平均值了跟刚才用起来效果是一样的,好处是什么?好处是。
13:27
现在我在外边,我还能不能看到这个number,这个numbers能不能看到一直行是不是报错了,告诉你numbers is not DeFine,那你都看不到numbers,更不要提你都能改,哎,你说老师我这干嘛呀,我这复制一下,我来一个numbers等于中国号,等于新的列表有没有影响,诶注意它没有任何的影响,为什么?因为这个S在外边,而这个numbers是在里边,你这再怎么改,会不会对它产生影响?诶不会啊,那这就是我们对B包的一个应用,那这里就形成了个什么呀?哎,形成了一个壁包啊,形成壁包,那这里边我们来说一下怎么去形成壁包,哎,我们来说一下形成壁包的一个要件,哎,B包的一个要件,那我们来说一下,首先第一个我们要有什么有函数嵌套啊,什么叫函数嵌套,我是不是在外部函数里边定一个内部函数,哎,有函数嵌套,并且什么呢?哎,第二一个我们要干嘛?哎,我们要将我们这个内部函数作为。
14:27
什么呢?哎,作为返回值返回,你得返回,你不返回外边是不是永远看不见啊,哎,你得作为返回值返回啊,然后第三一个,第三一个叫什么呢?哎,我们这个内部函数必须什么呢?哎,要使用到我们这个,哎外部函数的一个什么呀变量,那现在来看我们在内部函数里边是不是就用了numbers,诶如果注意你这不用numbers,那它就没有意义了,因为你没有引用这个变量,就也没有形成比包,所以这三条缺一不可,第一个你得有函数签档,第二一个,哎你得干嘛呀,你得将内部函数作为返回之句返回,第三一个内部函数当中必须得使用什么呀?哎,外部函数的一个变量,这里我们用的是一个numbers,如果你没用,同样也没有B包啊,那所以还是再强调一下,什么时候用B包,当你有一些见不得人的东西需要藏起来的时候,就用一包,这样可以确保我们的数据安全啊,确保我们的数据安全,好,这里我们来停一下,你们来尝试把这个干嘛呀,好好的去写写啊,好好写。
我来说两句