00:00
好,刚刚呢,我们看了一下我们这个高阶函数,那也就是说一定注意啊,我们可以把函数作为参数传到我们这个函数中,那把函数作为参数的目的主要还是把我们这种诶已经编辑好的代码啊,传到我们这个函数里,这样我们就可以对我们的函数做一个诶高度的一个这个诶一个定制啊,我们可以根据自己的需要往里边传我们这个需要的一个代码,那并且我们也写这么一个函数的一个FN,对吧?FN它可以根据我们指定的函数来对我们的什么呀?哎,来对我们的这个列表或者说序列进行一个过滤啊进行过滤,那实际上这个函数呢,其实我们不用自己写,哎,实际上在我们的这个叫做Python里边,它实际上给我们提供这么一个函数,叫一个什么呢?诶叫做一个filter这个函数,这个函数我们可以通过我们的文档来看一下啊,直接打开官网。Python点一个这个O啊来do,诶,Do,我们这个PYTHON3啊,找到我们这个library的这个reference啊,我们来看谁呢?哎,看我们的叫做一个build in functions啊我们的内置函数,实际上我们会发现这里边有一个函数找到它叫做一个什么呀,Filter啊filter filter什么意思呀,Filter的意思叫做一个过滤器啊,过滤器它的意思就是什么呢?诶就是对我们的这个列表进行一个过滤,对我们这个序列进行过滤,但是这里边具体来讲,它这个东西它不叫序列,叫做一个以terrible叫一个,可叫做一个可迭代这么一个结构,那在这你就简单理解一下,就先把它当成什么呀,当成这个序列啊,当成序列,哎,人家跟你说了叫做construct an from those elements ofable for which function returns true什么意思?这里边你看它需要参数,一个是function,还有一个是可替代的,那你。
01:57
哎,现在暂时就把这个可迭亚结构当成是序列啊,暂时先当成序列,然后他就写了看的一个构建啊,构建构建一个新的什么呀,呃,新的一个序列啊,可迭代结构还是先把它当成序列啊,构建一个新的序列从什么呢?这些元素中啊,元素中什么呢?诶这些什么呀,函数返回处的啊,函数返回处的也就说什么呀,跟我们之前的一样,也是有一个回调函数,回调函数会根据我们这个函数的不同,是不是去检查我这元素,如果返回处我就把它放到这个新的序列中,如果返回的是false就不放,其实跟我们这是一样的,用法是一模一样的,所以在这儿我们来说一下filter过滤器的意思啊,过滤器的意思。
02:42
哎,它可以什么呢?哎,可以从我们这个序列中干嘛呢?哎,过滤出啊,过滤出我们这个符合条件的元素,然后干嘛呢?哎,然后保存到一个什么呀?哎,新的序列中啊,新的序列中它的方式是一样的啊我们来说一下参数,参数参数的第一个也是一个什么呀?哎第一个参数是一个什么呢?是一个函数啊函数它会什么呢?会根据诶该函数诶来过滤什么的,哎过滤我们这个哎序列啊序列这里的序列实际上说的是一个可迭代的结构啊,可迭代的一个结构,但是我们先理解为序列啊,暂时先理解为序列,然后第二一个参什么呢?诶第二一个参数是我们需要什么呀?哎,过滤的这个序列啊,需要过滤的序列,那这个也是一个可迭代的一个什么呀?哎,可迭代的一个结构啊,可迭代结构,然后第三一个我们有一个返回值,它的返回值是什么呢?诶返回值是我们这什么呀。
03:42
哎,是我们这个,哎过滤后的一个什么呀?哎,新的一个序列啊,新序列。这里其实也是我们说的一个可迭代结构,但是我们还是暂时先理解为序列,所以这样看来的话,其实我们这个filter也是不会对我们这个原变量产生影响啊,不会对原变量产生影响,好我们这里边直接试一下啊,直接试一下,那其实用法跟它一样,我们直接干嘛呀,调一个这个filter,第一个传一个函数,我们还是传我们这个FN4,第二个传一个可迭代结构,我们还是传什么呀,传L,那这样它就会干嘛呀,将L中符合LN4的这些诶值都会给你,诶过滤的啊,都会给你过滤的,那这个时候我们来打印一下结果,它这个打印结果你看起来可能不太一样,因为它打印的什么呀,一打印它是什么呀,它返回的是一个叫做object,一个对象filter object为什么是它呢?因为它返回的并不是一个序列,而是一个可迭代的结构。比如说你可以对它进行便利啊,给它便利,但是你直接打印的时候,它里边东西是看不到的,所以如果你希望看到的话,这里边我们还需要做一件事,就是你需要把它转换成一个什么呀?诶,转换成一个list。
04:50
这样你才能看到里边是不是也是369啊,诶也是3669,跟我们之前那个效果是一样的啊,所以注意这个filter就是我们之前那个其实效果是一样的啊,效果是一样的,或者我们也可以这么调啊,我们这么调直接来一个R,等于一个这个filter,我们里边传一个FN4,再传一个这个L,那这R是不是就是我们这个结果呀,哎,你通过list来转一下,这样其实是一样的啊,一样的好,那这就是我们说一个filter,然后再回过头来说,我们刚才这问题现在大家注意了啊,我们现在这个FN4,我们是作为一个参数传进来的啊,FN4是作为参数传进来的,这边我们来写一下FN4是诶作为我们这个参数啊。
05:33
传递进我们这个filter这个什么呀,函数中的啊,函数中的一定注意啊,我们是将这个FN4这个函数作为传参数传递,你可千万不要干嘛,不要加括号,加括号是不是等于调用函数,调用函数等于我这里传的是它的什么呀?返回值,而我们这里不要传返回值,我们要传的是什么?传的是函数对象,所以千万不要加括号啊,千万不要加括号,而什么呢?哎,那我们说这要说什么呢?而我们这个FN4实际上什么呀,实际上只有一个作用啊,只有一个作用就是作为什么呢?我们这个哎,Filter的什么呀,参数,诶就是作为我们这个filter的这个参数,那它作为参数以后,哎,那它就是作为参数,也是,也就是说什么呢?诶filter调用完毕以后,调用完毕以后,实际上FN4就什么了,哎,就已经没用了啊,就已经没用,也就是说我们的这个FN4,它就是干这个事儿用的啊,就是专门为他去服务。
06:33
的,除了他用,别人都不会再用了啊,都不会再用了,但是这个时候你其实你会发现我为了这么一个作用,我单独去定义一个函数,这样是不是很麻烦呀,并且这函数我是定到了全局里了,也就是说现在我的全局里边我还能不能有一个函数叫FN4了,很明显不行,如果有FN4了,要么是他覆盖别人,要么就是别人覆盖它,这样是不是都不好啊,哎,都不好,所以这个时候呢,我们这种方式就不好了,这种方式我们也不推荐使用啊,在外边定一个函数,然后把它作为参数传进来,这种方式我们也不推荐使用,那要怎么办?那那要怎么办?那这里边我们要说一种新的函数,我们叫什么呢?叫做一个匿名函数,对呢,一匿摸赢名啊,匿名函数啊,匿名函数我们也叫做一个lambda,叫做一个拉姆达函数表达式啊,拉姆DA,哎拉姆达函数达式,那这里边我们来说一下,那这个是一个什么呀?哎,那我们说一下,哎,它专门用来干嘛呢?哎。
07:33
我们说了拉曼达。Lamb DA LA姆DA函数表达式,诶专门用来干嘛呢?哎,用来创建一些什么呢?哎一些这个,哎简单的一个函数,诶它是什么呢?诶它是我们这个函数,诶创建的什么呢?诶又一种方式啊,又一种方式就说它实际上是一种简化版本的方式,那注意了,这里边我们说是实际上是另一种方式,但是实际上它跟我们这个DeFine这种它没有任何的区别啊,它就是方式不同,就是方式不同,它那种方式我们叫做一个什么呀?叫做一个语法藤,相当于是一个简写啊,相当于是一个简写,但是本质上是一样的啊,但是本质上是一样的,好,那现在我们来看一下它的一个语法,语法是怎么写的啊,首先是一个这个拉。
08:23
哎,拉曼达,诶然后呢,我们后边跟的是一个什么呢?后边跟的是我们这个参数列表,参数列表后边跟紧跟着一个冒号,然后是一个什么呀,返回值,所以这种我们这个拉姆达函数表啊式其实非常简单,它的构成是吧?诶首先拉姆达关键字,然后后边是一个参数列表,然后这是一个什么呀,返回值啊返回值,那现在啊,我们来整这么一个,我先写这么一个函数,写这么一个函数啊,我直接来一个什么呢?来一个DEF,我们来一个叫做FN5啊FN来一个A逗号一个B,我们来干嘛呢?诶直接在这来一个re TN return,一个A加B,那这个是一个什么呀?哎,求任意两个数和的一个函数,我们直接print一下,Print一下FN5,我们这来一个123逗号,一个4561执行走一个,它不是返回一个579啊,哎,我们return一个A加B,实际上是不是在这儿就是返回A加B的结果,诶A加B结果好,那同样的函数,我们如果用我们的拉姆达函数表达式去创建。
09:24
那怎么写呢?哎,我们来写一下啊,直接来一个这什么呢?哎,来一个这个拉姆DA啊拉姆DA,拉姆DA,然后后边我们紧跟的是我们参数列表,我有几个参数啊,一个A一个B,那我直接写A逗号什么呀,哎,A逗号B直接写就完了,然后后边冒号,冒号后边是不是紧跟着返回值啊,哎,注意这个返回值不用写准特,你写啥它都会自动给你返回,所以我直接写一个什么呀?哎,写一个A加B,那这个就是一个拉姆达函数表达式,这个东西跟上边这个事等价的啊,等价的我们先执行一下,走一个发现没有任何错误对吧?没有任何错误,那就证明这个语法是没问题的对吧?语法是没问题的,诶那同学说了,那老师这函数怎么用啊?哎,首先我们先确定一点,它是不是函数,怎么确定,我们来对它干嘛呀,进行一个打印啊,进行一个打印一保存,我们这一执行,诶你看function luda at什么什么什么东西是不是跟我们基别的函数打印的基本一样啊,哎,首先它就少了一个什么呀,少了一个函数名,然后这变成什么呀,Luda为什么变。
10:24
而拉姆达表示它是什么呀?没有名字的,所以它叫做什么呀,匿名函数,它是没有名字的函数,就这么一个,那这两个东西是一样的啊,是一模一样,是等价的,哎,那同学说了,那老师这函数怎么调啊?哎,这函数怎么调啊,那我们说了调用函数是不是就是一个函数对项加括号啊,哎,那我问你了,我在它后边我直接加括号行不行?哎,注意在它后边直接加括号是不行的,为什么?因为你这加了一个括号,它这个括号是不是分配给B了,哎,分配给B了,所以如果你要想这么调的话,你得先给这个整个函数俩式整体套一个括号啊,套一括号,然后你这来一个十,来一个20,这样才能去掉这个函数啊,在这我们来试一下啊,来试一下,来一个这个print套一块干嘛呀,我说来打印结果呀,哎,打印结果这一执行是不是30就算出来了,哎,所以注意这两个是等价的啊,我们但是一般啊这么用,一般我们不会这么用,你知道可以这么用行了,一般不会这么用啊,一般不会这么用,好那我们再来看,也就是说这个。
11:24
表达式和上边是一样的,这个A和B就相当于是它,然后这个A加B就相当于什么呢?哎,就相当于是就相于它啊是等价的啊是等价的,好,那现在我们来看了,那我们这一块要怎么继续往下写啊,怎么继续往下写。哎,那现在说那老师这这这总是这么用也不行啊,我们怎么办呀,我们还可以干嘛呢?我们也可以也可以将我们这个匿名函数。哎,赋值给一个什么呀,一个变量啊,匿名函数赋值给一个变量,那我这可以直接干嘛呢?哎,直接来一个这个,比如说我来一个FN6等于它,那现在我就等于将这个匿名函数复制给变量啊,复制变量,那这时候我们来打印一下FN6,哎,Print一下,我们来一个FN6,直接保存这一执行是不是个函数,哎,是个函数,我在这同样也可以调来个十来个30这一保存给你算出一个什么呀,40也可以调,但是注意一般干嘛呢?
12:23
哎,一般不会这么做啊,一般不会这么做,因为这么做你就不如用它了,对吧,如果你这么做你就不如用它了,那这拉姆达函数我们什么时候用,那你先明确一点啊,这个是参数,这个什么呢?这个是返回值啊,这是返回值,好,那这个时候我们在filter这就可以用,现在filter我们这是不是传的是一个FN4啊,而这个函数一般情况下我们是不是只会用一次,下次就不用了,哎,就不用了,那这个时候我们在这里就可以传一个匿名函数,传一个拉姆达的函数表达式,那这个时候我怎么来把它改造成拉姆达呢?实际上这个函数啊,我上午写的时候啊,它写的有点复杂了,其实我们真正要写不用这么复杂,其实像这个FN4我可以直接干嘛呀,直接改造,诶我们刚才写的时候它已经写复杂了,直接改造,怎么改造呢,直接return它。
13:14
是不是就行了,哎,如果它是处这个返回处,如果它是for字数返回for在哎直接return上发就行了,那我现在要把这么一个函数改造成我们这个luda怎么写,那其实这个写起来就更简单了,怎么写呀,首先我们来一个什么呀,哎,Luda哎,后边空格是不是参数列表啊,参数我们就一个什么就一个,哎,然后我们这来一个冒号返回值是谁呀?返回值是不是就是。就是呀,哎,就是它这样就OK了,所以其实FN4转换完了就是这样的,那这个时候我这里边的参数我就可以不传FN4,我传什么,我直接传一个long的,就可以直接将这个匿名函数作为参数来传递,我们来看一下效果,看看效果一不一样啊,我把这呃行就这一个,我这一执行走一个。嗯,这块报错了冒号。
14:02
冒号冒号我来看看啊。爱摩三等等于零,我看看第几行啊,给我们报的是第五十五行,第五十五行啊,这儿多了一个冒号啊,刚才这这不用管它,我们来看这这一直行是不是效果是一样的,哎,效果是一样的,那好处什么呀?那假如说我不想找这个三的倍数了,我想找什么呢?我想找二的倍数,这偶数对吧,我就摩也二一直行是不是就它了,我想找奇数,我要干嘛呀?哎,我这来一个不等于零一走是不是奇数啊,哎,我想找大于五的,哎,直接干嘛呀?哎,它大于五啊,哎大于五直接一保存,咱们一走走一个是大于五的了,哎,大于五的,而且这样这个函数其实只会用一次,用一次它就会自动从内存当中去消失,所以这个时候我们就可以高度的去定制一个函数了,就这么一个东西,其实非常非常简单啊,就是这么一种特殊的一个语法啊,语法它也是啊,它我们说了叫做一个语法堂啊,我们这说一下,它实际上是一个叫做一个语法堂的这么一个概念。
15:05
语法堂啊,语法堂什么叫语法堂,就是说白了它就是这个东西的一个什么呀,简写本质上没有区别,就是一个简写,但是它不能写过于复杂的啊,不能写过于复杂的,因为他那冒号边直接跟返回值,你说我写个外号循环,写个负循环,注意这时候是写不了的,他只能写一个什么呀,一些简单的一个表达式啊,只能写一些简单表达式,但是关于这个我们还是先了解一下就OK了,用的没有那么多,像这个fair函数,其实现在我们也不怎么用了,但是你需要去了解一下,你知道它是可以这么用的,那这个就是我们所谓的一个什么呀,函数编程啊,函数编程好,这是它,然后再说一个跟filter类似的,我们叫做一个map啊,Map也是这么一个函数,Map这个函数是干嘛的呢?哎,我们来说一下,哎,Map这个函数它可以什么呢?哎,可以对我们这什么呀,哎,可便利吧。
16:01
哎,可便利。诶可以对什么呢?我们这个可变利诶或者可迭代吧,我们统一说一下啊可迭代诶对象诶中的什么呢?哎,所有元素啊,所有元素做什么呢?诶做指定的一个操作,诶然后干嘛呢?诶将其添加到一个什么呀?诶新的一个,哎对象中干嘛呢?返回啊新对象中返回什么意思?哎,比如说我们还是看我们L这个列表啊,我粘过来L这个列表,那有些情况下我想干嘛呢?哎,我想对我这个L列表中的每一个元素干嘛呀,都加上一个一,哎比如说我想把一变成11,把二变成十,哎不是把一变成二,把二变成三,把三变成四,把四变成五,每一个数都加一,那你如果一个个加是不是很麻烦呀?那这个时候就可以用什么呀?哎用map map我们来看怎么用,我直接还是二等于什么呢?这时候我就调一个map,它第一个参数还是干嘛,还是一个函数啊一个函数,那这里边我们就可以直接传一个拉姆达了,那跟它是一样的,我直接来一个I,但是注意。
17:05
它这是不需要你返回布尔值的啊,不用返回布尔值,那返回什么,你这里边我们是是要对那个数进行操作呀,哎,比如说你要给它加一,你要给它加时,所以这返回的是你要对它做什么操作,哎,比如说你想对它加一,那返回的就什么呢?返回就是I加一,注意这里的I代表什么?这里的I就是代表我这里边的每一个元素,那你I加一就是表示你要对每一个元素进行加一啊加一这是第一个参数,然后第二个参数传谁,第二个参数是传你要便利,你要操作那个什么呀,那个序列,所以第二个参数传一个L,那这样的效果就是对我们这个L这个列表中的每一个元素进行加一,然后把这些元素添加的一个新的对象中返回,那这个时候们来打印一下,直接打印一下二,这时候你发现它返回的还是一个什么呀,还是一个对象啊,还是一个对象,那你如果要想,哎,如果你要想看它的具体信息的话,我们还是需要把它转换成一个什么呀,哎,转换成一个列表来看,这样我们一直行走一个234,你看。
18:05
就是每一个元素都加了一个一啊,诶都加了一个一啊,这个就是我们说的一个map啊,它可以对我们列表中每一元素都进行一个操作,那比如说你觉得加一不过瘾了,你可以干嘛呀?哎,你可以来一个幂运算是吧,每一个都来一个这个二次幂啊,都来一个二次幂,这样也是OK的啊,也是OK的,各种操作都可以啊,各种操作都可以可以啊,这是一个map啊,Filter是用来过滤的,Map是来对我们这个元素进行操作的啊,这两个函数呢,了解一下,知道怎么用,然后在这里你需要做的事儿是熟悉一下我们这个匿名函数,也就是这个拉姆达函数表式啊,熟悉一下其实非常简单,这是什么呀?擎参,哎,这是什么呀,这是返回值就完了啊,就完了,一定注意,我们这种匿名函数写的都是一些简单的函数,一旦你的功能过于复杂的时候,就不要用这种匿名函数啊,就不要用这匿名函数啊,匿名函数一般都是用来干嘛?哎,作为参数使用啊,我们这儿给他补充一句啊。
19:03
哎,匿名函数啊,一般哎都是作为我们这什么呀?哎参数使用,哎其他地方干嘛呢?哎,其他地方不会使用啊,其他地方一般不会使用啊,一般不会使用好这个是我们说的一个匿名函数啊,我们在这儿还是来停一下。
我来说两句