内容正文:
好,同学们,我们接着上节课来讲,我们还有最后一个知识点叫列表推导式。这个的话对于我们快速生成一个列表来说是非常的便捷的。我们来看一下它的语法结构。我们首先第一个其实这里面的话,就相当于把一个我们这个负循环的一个结构放到我们这个列表里面去了。就是for迭代变量,in可迭代对象。所产生的这个迭代变量,相当于是这是我们的这个语句块,这个东西就是等价于什么东西呢?我们把它写一下给大家看一下。这个东西就等于你首先创建一个空的列表,负循环,for循环之后。再把我们的这个迭代变量,就是我们的这个表达式里面的结果放到我们这个列表里面去,就等价于像这样的一个结果。好,我们来给大家演示一下这个东西该怎么去理解它,把它注释掉。比如说我们要生成1到10之间的,这个是我们要生成1到10的数字,就先来一个简单的。好,那我们该怎么做呢?我们可以首先是一个列表,然后再是-2 in我们的这个。range一下。1到11,注意是不包含11。然后我们再把这个循环产生的迭代变量放到我们列表里面去。这个我们打印一下看看,我们就得到了一个1到10之间的一个数字。我们再来看第二个语法结构,就是比如说我们要如果把这个1到10之间的偶数放到列表里面去,那需要我们在后面加个if条件。那么这个我们该怎么去理解它呢?我们来看一下。这个其实也就是等价于将我们创建一个空列表,再是对有一个循环结构,IST点APL point一下,当然这里面的话注意跟上面不同的点,就是我们在这儿需要加一个咱们的这个if条件判断。如果满足这个条件,我们才会把这个值给它添加到列表里面去。所以说我们上面的这个列表推导式就等价下面的这样的一个结构,我们把它注释掉,我们来写一个。那我们现在要做的是生就是生成我们1到10之间的偶数的数字。我们来看看怎么做,首先也是一个列表,再是我们的FR英文的这个range 1到11,这里面我们给一个条件进行一个筛选,我们要找的是偶数,那我们就是I和2取数为我们的零。然后满足这个条件的爱,我们再把它加到一个列表里面去就行了。最后我们把它打印一下给大家看一下。好,这样的话大家想想是不是就把我们的奇数放到列表里面。如果我们要把偶数的话改一下就行了。好,如果我们需要是把1到10之间的奇数的平方,那我们可以在这儿给它开个求平方就行了。所以说我们这个列表推导式还是相当灵活的。再来讲一个稍微复杂一点的,就是我们列表推导式里面的一个嵌套。那么这个东西我们该怎么去理解它呢?我们也来给大家写一个语法结构。这个东西我们也是先创建一个列表,然后第一层的这个for循环。这是第二层的一个for循环。LST点APU paint,把我们的这个表达式在最终放到我们的这个列表里就行了。这个就相当于是一个循环的线道。我们来看一下它的一个练习题,比如说我们要打印这个例题,我们来复制过来给大家做一遍,打印我们列表中这个的输出结果。那我们就可以根据刚才我们上面讲的这个东西来给大家写一个。首先就是我们的这个for r in range 1到3,这是我们的这个for j in range 1到4。好,那这样的话我们就是暂时先创建一个列表,把我们的这个表达式放到我们的这个页面,添加到列表里面去就行了。AST put一下,这样的就行了。最后我们打一下我们的列表。好,我们使用我们的这个数值标记法来给大家演示一下。首先I的值为一的时候,我们的G它会编辑出我们的什么123对吧?好,当我们的这个一和一取余数显然是为我们的什么这个零,一和2取数是我们的一一和3取数也是我们的一。当我们的I遍历中二的时候,二和一取数是为我们的02和2取余数也是为我们的02和3取数是为我们的2。那么这样的话我们这一题就做完了,我们运行一下看看效果好,这个就是我们的什么列表推导式的嵌套,在我们后续的这个应用中会用的比较广泛。就比如说我们要随机生成,比如说十个1到100之间的这个数,那这个其实我们就可以使用列表推导式,一行代码可以抵到4行代码,非常的便捷。我们现在来给大家讲我们的这个for循环外循环的例题。首先for循环,第一题是我们教材上面的题目。输入评委数量,若评委的人数小于等于三个人,则直接计算平均分。若大于三人则去除最高分和最低分,再计算平均分。我们这后面是保留小数点后一位。好,我们首先第一步让用户从键盘输入我们的这个评委的人数。因为我们有了评委人数之后,再让评委打分,最后再进行一个判断,请输入评委的人数。好,接下来我们创建一个列表,这个列表的话主要是用于存储这个评委的打分。我们现在来让评委去做一个打分,这里面我们做一个循环就行了。我们比如说有三个评委,那就要循环三次,对不对?然后我们再把评委的分数就加到我们这个列表里面去就行了。请输入D我们这里面可以利用I这个变量去作为我们的序号。比如说第一位同学,第一位评委,第二位评委。好,这里面我用到的是F字符串,我们在前面加个F就可以了。好,接下来等到这个循环结束之后,我们的评委的分数就存到我们列表里面去了。我们给大家在这儿先演示一下,比如说我们输入的是评委的是四个评委。第一个评委是七分、八分、九分、十分。好,那这样四个评委的分数就添加到列表里面去了,对不对?好,有了这个评委的分数之后,我们做个判断。当我们的这个评委小于等于三人的话,我们可以直接去计算平均分。我们知道这个求列表里面的元素之和是sum函数,再出一个楞一下我们的这个list就行了。好,否则的话就是我们的评委他的这个人数是大于三个人,需要先要去除最高分、最低分。那如何去除最高分、最低分呢?这里面我们可以巧妙的将我们这个列表进行一个排序,默认升序。那么顺序完之后,也就是说最小的元素在左侧,最大的元素在右侧,我们就给它点pop。Pop 0就是将第一个元素就是最小值删除。最小值删除,ST pop 1这个就是将我们的什么最大的值进行一个删除。这样我们的最高分和最低分删除完之后,我们就开始求它的平均分。那么就是上面一下我们的这个list,再除以一个我们的这个类一下我们的这个list就行了。好,最后我们打印一下我们的平均分,这里面我们采用的是我们的这个格式化输出,点1% F因为我们要保留小数后一位。好,然后就是百分之我们的这个AVG这个就可以了,我们调试一波,我们先输入。如果说三个评委,那么第一个评委是六分、七分、八分,这样的话我们自己验算一下。那么6加70 33加上一个我们的这个8 21,那显然是7点0分。我们再来一个,如果输入的评委是五个评委,那我们第一个评委是六分、七分、八分、九分、十分。好,我们看一下去掉最高最低分和最高分。那789的话,我们来算一下,7 80 55加上一个我们的九是二十4。24的话除以一个我们的这个三,确实是这个8.7。好,那么我们这个就讲完了。接下来我们来讲下一道题目。大家看一下这个题目,这是一个列表,显然这里面有重复的元素。比如说五还有我们的这个三都是重复的。我们要去除列表里面的元素,重复的元素,且不改变元素原来的相对位置,这个题目我们该怎么做好?我们可以这么想,如果你有的人是集合的话,集合去重可以,但是集合去重不能保证原来的元素相对位置。比如说什么叫相对位置?我们去完虫之后,这个三始终是要在四的前面,四始终要在七的前面,就保证原来的位置。这个我们就采用一个新的方法,我们可以先创建一个空的列表,这个空的列表是用于存放不重复的元素。接下来我们把我们题干中的这个列表拿下来,我们对我们题干中的列表来进行一个便利。好,但如果说我们的这个I是不在我们的这个新的列表里面,那我们就把我们的这个元素给它添加到我们的这个新的列表里面去,是不是就行了。这样的话我们通过这样的一个循环遍历完之后,我们这个n list这里面装的就是我们不重复的这些元素,且保证了原来的相对位置。我们把上面的代码进行一个注释。好,大家看一下,这个我们比对一下,这里面的话是没有重复的元素了。并且我们你看347,这样的话就是这个八被去重了,八被去重了。那么这个去容完之后,你看这个六是不是在九的前面,都保证了原来的相对位置。这个题目如果以后遇到,就按照这种思路去做就可以了。好,然后我们再看我们的这个第三题,随机生成十个1到100之间的整数放入到列表中。这个题目就是我刚才说的列表推导式的类型的题目。我们首先看到随机数,我们就要导入一个随机数模块。好,接下来我们就是用我们的列表特导式生成是read点recent,包含一和我们的100,就是在一和100中随机产生一个整数,我们要将它循环多少次呢?十次就产生了十个,再将里面能被3和7整除的数给它去除掉。那这个我们该怎么做呢?我们可以遍历我们这个列表,然后做一个判断,如果说我们的I能被我们的三取数等于0,或者说我们的这个I能被我们的七取数等于0。好,那满足这个条件的话,我们就可以把我们的这个元素从列表里面直接删掉就行了。这里面我们用到的一个列表函数就是move remove,就是把我们的I从我们这个列表中删除就可以了。好,最后打印一下我们的这个list就行了。我们给大家做一个测试,在这上面把这个随机产生的列表给它打印出来。好,大家看这是上面随机生成的十个数。我们这里面的话27它是能被三整除的对吧?所以说我们这里面这个27就被去除了。再看再看我们的这个70,70是能被七整除的,所以它也被去除掉了。好,所以我们这个题目就算完成了。好,接下来就是我们第四题,使用列表推导式生成11到100之间能被7和8整除的这个平方,注意就是得到的数还要求平方。最后然后再求我们列表的累加和像这类型的题目,我们就一步一步完成就行了。首先我们第一步使用列表推导式,让那个生成就是1到100之间能被7和8展示出。我们首先就是for 2 in我们的这个range下,1到102之间我们做一个判断,如果I能被我们的什么7占取数都等于0,或者说我们那个I能被我们的扒取数就等于0。那这样的话我们操作完之后,这里面装的就是能被7或8整除的数。注意我们这里面的条件找到之后,把我们的这个I放进去,但是这个I并不是我们想要的,因为我们要的是能被7或8整除的数的平方,那我们就得再开个平方,这样的话就可以了。最后我们再是使用萨姆函数,求我们的这个列表的累加和就行了。我们给大家打印一下看看。最终我们的累加和是这么多,这是上面的这些我们的评判了之后的数那么这个题目如果你使用普通的方法来做,它的代码量要比这个要多很多的。好,接下来我们来看一下我们的这个外循环的一个练习题。首先第一题判断输出。前面我们上节课讲到的那个例题里面的那个判断素数,它这个方法是比较麻烦的,只是为了给大家演示pass和continue的一个效果。那我们这里面的话,给大家讲一个比较简单一点的方法。首先我们要知道什么叫素数,就是只能被二只能被一和它本身整除,只能被一和它本身整除,那么二是最小的素数。好,知道这个概念之后,比如说我们要如果给你一个七,你如何判断它是否是素数?我们只需要把2到7之间的数,不包含7,那就是数跟我们的七取整。如果在2到7之间能找到一个能把七整除掉,那七就不是,反之七就是我们的输出,这就是我们的这个解题思路。我们来看看怎么做。首先我们得让用户从键盘输入一个整数。请输入整数。好,输入完整数之后,我们这里面就是立一个flag,这个flag就是一个标记,就是我认为默认是输出。好,接下来我们要验证了。我们刚才讲了就是判断一个数是否为素数,我们只要找这个二到这个数之间的,如果说有一个存在一个我们的I能把我们的number取住整除掉,那么我们这个假设的flag就应该把它force同时退出循环。我们最后来判断下我们的flag,如果这个flag为我们的true,那说明咱们这个number就是输出。否则我们这个number就不是素数,我们把这上面的拿过来改一下就行了。不是素数,我们来调试一下。比如说我们输入七七显然是素数,比如说我们输入六六显然不是素数。因为在2到6之间可以找到2能把六整除掉,也可以找到3把6整除掉,所以它一定不是负数。这个题目我们就做完了,这个方法比我们上一节课讲的那个方法要方便的很多,也很好理解是不是?好,我们把这个代码注释掉,再来讲下一道题目。键盘连续输入数字进行一个累加,直到输入负一的时候表示退出累加,输出累加和。这个题目我们可以构造一个无限循环,然后在循环里面让用户输入数字,直到用户当我们输入负一的时候,就标志着要退出了。也就是说这个就是我们关键的一个推出的一个要素。那我们来看看怎么做。首先求值加和我们讲过少不了S等于零这样的一个初始变量,接下来就是我们构造一个死循环,让用户在这个键盘里面去输入我们的这个数字。这里面的话他他也并没有说这个数字是一个整数,那我们就把稳一点,只是一味请输入。数字。好,那我们先别先不要急着去累加,我们可以判断一下这个数字。如果这个数字是我们的这个负一,那说明它要退出循环了,是不是?否则的话那我们就是把这个数字做一个累加,最终我们再打印一下我们的这个S就行了。我们来调试一下,比如我输入1234,我我不想不想去说了,那我就直接付一,那么这个结果的话是15才是对的。好,这题目还是比较简单的,就是我们把这个构造一个死循环,在这死循环里面进行一个让用户连续输入数字。当我们这个数字为负一的时候就退出循环,最后做一个累加,就是最后打印出来就行了。其实这一题还有第二种方法,我们可以把这个退出的条件放在Y这个条件判断里面。我们来给大家演示一下。首先让用户从键盘输入一个数字,这里面我就直接复制了。好,再是我们的y number不等于负一的时候。因为我们如果是Y等于负一的时候,是不是应该就是退出了一家了。是不是?当我们的Y不等于那个负一的时候,我们就是S加等于一个number。好在这个循环里面,我们让如果再去进行一个输入number。这样的话如果number如果用户输入的不是负一,那我们就继续做累加。直到我们这个用户输入负一的时候,这个条件是不是就不成立了。最后我们打印出来我们的这个累加和就行了,我们来试一下。123四五回车,我们现在不想输了,结果是15是没有什么问题的。好的,接下来我们来看一下最后一题,使用外循环计算,1减2加3减4加5减6。大家有没有发现,如果让我们从一加到100,这个题目比较好做。但是这个题目有一点不一样,怎么不一样呢?就是它这里面是加减这样的一个来回切换。我们在这里面给大家讲一个题目相对于这种加减。来回切换。的题目。我们可以使用一个标记,这个标记就是我们的flag。好,那么标记flag一开始大家可以看到它是加,我们可以用标记是一。如果是减的话,那我们是不是用这个标记就是负一就行了。这样的话我们就可以形成加减的一个状态的切换。这个我们叫钟摆问题,在我们这儿称叫钟摆问题。大家想想我们以前那个老式的钟摆是不是就是两个来回摆,来回摆就是在一和负一之间来回切换,你可以这么认为,我们首先S等于0,flag为我们的一I一个初始值I为一。当我们的这个I是小于等于100的时候,好在这里面我们首先S加等于一个,我们的这个I好,这里面关键的点来了,我们可以直接在后面跟一个乘flag就行了。一开始flag为一,那就是我们的什么零加1,是不是?好,那么下一个状态的值是不应该就是成等于负一,也就是说一乘负一是不是就变成负一了?负一的话,你下次是不是那个I加等于一下一次I的值为22的话,乘以一个负一是不是变成负二了?那么负一再乘负一是不是变成一?那下一次这个I的值为三的是不是就加3,对不对?这样的话就巧妙的进行这个状态切换,最后我们打印出来就行了。我们来看一下这个最终的结果,负的50是没有问题的,我们也可以自己算一下。你看一和二组成是负一,34-1,这里面应该有50。对,所以应该负的50,所以这里是算的是对的。如果我们以后面对这类这类型的问题的时候,我们就可以使用固定的。首先来一个初始起始的标记,但是在我们做了一家的时候,这给一个外挂一个成flag的这样的一个标记。这个是我们的什么?关键的是状态切换。加减切换的一个重要的一个代码。这样的话就行了,只要以后遇到类似的问题,我们都可以使用这个方法来做好。我们今天这个four y循环以及我们的推导式的相关例题就给大家讲完了,我们还会有课后练习题,这个是真实的这个上级十道题,我希望大家就是认认真真做。如果有哪里不懂,你可以反复听我的这个视频里面的一些解题思路。希望大家能够多加练习,才能够熟能生巧。我们今天的课就讲到这里。
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。