第一模块(Python语言基础)环境搭建与第一个脚本
变量,用户输入与代码格式
Python的数据类型(字符串,数字与布尔值)
逻辑运算符与流程控制
Python的数据类型(列表,集合与元组)
Python循环(for)
Python循环(while)
Python的数据类型(字典)
Python函数(函数的定义)
Python函数(函数的返回)
第一模块应用(可交互的文字版扫雷,框架)
第一模块应用(可交互的文字版扫雷,实现,第一部分)
第一模块应用(可交互的文字版扫雷,实现,第二部分)
关于for循环
Python中的数据类型,有一些是“可遍历的”,意思是我们可以按一定顺序挨个调用其中的数据进行处理。在我们学习过的数据类型中,列表、元组、字符串就属于可以遍历的数据类型,它们的特点是都可以通过索引值返回其中的元素。
遍历:对一串数据中的每个元素依次读取
有一天,教导主任给你发了个表格,表格里是上千个数据,记录了学校里每个学生的成绩,让你做一份报告以汇总。
怎么办?写几千行print()来进行输出显然是不显示的。好在Python中有一种方法,可以自动将某件事做你所需要的次数,这个方法就是for循环。
for循环,其核心就在于进行重复工作。如果你要将一个大象放入冰箱,顺序是:
打开冰箱门
把大象放进冰箱
关上冰箱门
如果你要将100个大象放入100个冰箱,为了不重复100次上面的代码,你就需要一个for循环:
以下内容重复100次:
打开冰箱门
把大象放进冰箱
关上冰箱门
当然,以上内容是用中文写的,接下来我们用计算机能够读懂的语言来建立for循环。
建立一个for循环
for循环通过for关键字进行定义,定义方法如下:
这里的“做点事”重复的次数取决于“可遍历的内容”的长度,例如可遍历的内容如下:
那么这个for循环内的内容会运行三次,在这三次运行中,变量的内容会依次为"哟!", "嘿!", "哈!"。但是在“做点事”中并不一定要用到这个变量,可以只是单纯地重复做点事。
注意这个变量只在当前for循环有效,无法在外部使用,关于变量范围的问题,会在本专栏第九期(函数的定义)中讲到。
for循环的使用
下面举一些简单使用for循环的例子,先定义两个变量方便举例,分别为一个列表和一个字符串。
接下来打印每一个列表中的元素,这里的name是一个临时变量,仅在此for循环中可用,语法上与正常的变量命名规则相同。要注意缩进。
变得稍微复杂一些:
字符串也是同理,会依次将字符串内的每个字符代入变量。
有时,我们更在意的时重复运行的次数,而不是每次运行时变量的内容,可以进行如下操作,需要用到range()函数。
range()函数返回一个整数序列,序列的起点、终点与间隔由参数决定。参数必须为整数,默认值分别为0,无(必须输入终点),1range()函数生成的序列包含起点,但不包含终点。实际操作一下:
还可以这样用,将临时变量作为索引值。
有些时候,我们完全不在意这个临时变量,我们需要的仅仅是让一个动作重复n次,可以用下划线 _ 命名临时变量。此功能仅是为了增加代码的易读性,使用其他名字命名变量后也可以在循环中不使用它。
假设你想遍历一个不知道有多少个元素的列表,可以用下面的方法,虽然索引值是从0开始的,但因为range()函数本身就不包括其终点,所以用以下方法正好可以遍历列表中的每个值:
嵌套循环与缩进
在for循环的学习中,缩进的不规范往往导致很多问题,尤其是在多层嵌套的循环中。在这一节我将用例子来进行解释。首先定义一个列表方便之后使用:
当我们以单个变量输出时,会依次输出四个元组:
若想获取每个元组中的功能,有两种方法:
在使用for循环时,要尤其注意缩进,多数人可能会在接下来的实例中遇到缩进的问题,当循环遇到问题时,Python Visualizer是个十分好的帮手,它可以帮助你一行一行查看自己的代码并实时显示所有变量的值。使用Python Visualizer可以解决很多循环中遇到的逻辑问题。
Python Visualizer:http://www.pythontutor.com/visualize.html#mode=edit
本期实例
关于for的硬知识内容有限,重要的是在实例中进行操作,以下实例按1,2,3,5,4,6从简单到困难进行排列,其中4与6有一定意义上的关联,遇到困难要及时解决,不要让困难滚雪球。大家如果觉得应用起来有困难,这是十分正常的,编程知识的本身不难理解,难点主要在于对其的灵活运用,而这种能力只有在不断应用中积累。
实例1:打个招呼
你有一份班级名册,包含了所有学生的名字和学号,如下:
你需要制作一个程序,能够给每个人打个招呼,输出参考:图1,实例1输出图
实例2:平均收入和中位收入,带数据缺失
你有一份记录,里面记录了办公室打工人的收入情况,但是其中有一些数据缺失,缺失的数据被记录为-1。你需要在去除缺失的数据后计算出办公室打工人收入的平均值和中位值。
提示:中位数功能的实现不需要使用for循环
这份记录如下:
输出参考:图2,实例2输出图
实例3:打个招呼进阶版
你又有一份班级名册,包含了所有学生的信息,每个信息里包含了学生的姓氏和性别,如下,male为男,female为女:
打个招呼,输出参考如下:图3,实例3输出图
实例4:寻找最近距离
你拥有一个列表,里面是一些二维坐标系中的点的坐标。你需要写一个程序,寻找相互之间距离的两个点,打印出它们的坐标。你的点如下:
输出参考如下:图4,实例4输出图
介绍一个Python内置的库,math,可以实现很多数学计算方面的功能,导入方式与random一致。以下两个是在编码时能够更加简洁的math库中的函数:
实例5:栅栏加密器
栅栏加密法是一种古老的对文字进行加密的模式,最基本的栅栏加密方式为:将文本逐字分入两行内容,之后将第二行的内容续在第一行后边。例子如下:
原文:12345678
逐字拆成两行,
第一行:1357
第二行:2468
排成一行:13572468
你需要做的就是制作一个栅栏密码加密器,将如下这个字符串进行加密,文字来源为栅栏密码的维基百科:
输入参考如下,你可以写一段代码将加密后的内容返回原文:图5,实例5输出图
本期挑战
以下内容会较为困难,但不包含未学到的任何内容。如果没有办法理解,可以在本期专栏下留言或私信,我会为你遇到的问题进行专门解答。这个实例修改自我的一次课后作业的附加题。
我深知实例6可能会给大家造成困难,但由于它包含的思想非常需要刚接触编程的学习者们领会。这道题本质上是一道数学题,但我们需要使用计算机计算中常用的“穷举法”去解决。穷举法,简单地说就是列出所有有可能的情况后,从中选出最佳解决方案,这种方法在计算机中常常用到。实例6的答案将会用一整期额外专栏进行讲解。
如果大家打算在进入下一期之前先自己尝试,或许下方代码块内的内容会对你有所帮助。注意,解决方式有非常多,甚至我的解决方案并不高效,仅供参考。
布尔值的一种使用方法,作为开关:
接下来这段代码的意义是:进行99次循环,在每一次循环中,在1-20的范围内随机生成10次随机数,如果这10次随机数中有任意一次为5,则加1分,输出最终的分数。注意缩进的使用。可以将下列代码放入Python Visualizer中一步步查看运行逻辑。
在每次循环的末尾,需要重置switch的值为True。
实例6:寻找最大的四边形
在一个二维坐标系内有一些随机点,现在要在这个二维坐标系中寻找一个面积最大的四边形,寻找的四边形需要满足以下条件:正方形的边平行于x轴或y轴
正方形的顶点在x轴上的最小值为x值最小的点的x值,最大值为x值最大的点的x值
正方形的顶点在y轴上的最小值为y值最小的点的y值,最大值为y值最大的点的y值
正方形内部不包含任何点
附图,要寻找的便是图中这个四边形。但每次运行时生成的随机点不同,四边形也会不同。图6,实例6可视化1
图7,实例6可视化2
随机点以如下方式生成,随机点列表是一个含有12个元组的列表,每个元组中有两个整数,分别代表这个点的x坐标和y坐标:
参考输出如下,运行了三次:图8,实例6输出图
实例答案
实例6的内容会在下期专栏中专门给出。基本逻辑为计算出所有符合要求的四边形后,遍历所有的四边形,寻找面积最大的四边形。
步骤参考如下,答案不唯一:通过每一个点,分别作平行于x轴和y轴的直线
遍历所有这些直线组成的四边形,剔除内部包含点的四边形
对剩下的四边形求面积并记录最大面积,同时记录得到最大面积时四边形左下角顶点坐标,以及长和宽
打印输出结果
本期专栏的全部内容就到这里了,感谢大家的持续关注!
2021.2.17