当前课程知识点:Python 交互式程序设计导论 >  第5周 >  A 课程视频(鼠标输入、列表进阶) >  Video

返回《Python 交互式程序设计导论》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《Python 交互式程序设计导论》慕课在线视频列表

Video课程教案、知识点、字幕

Hi,同学们好,欢迎来到Python交互式程序设计导论慕课课堂

这一讲呢给大家介绍循环,也叫迭代

其实呢,所谓的循环或者迭代就是重复反复的做同一类动作

这一种现象呢在自然界也广泛存在

比如说地球绕着太阳旋转,每旋转一圈是一年

实际上我们知道它转多少圈了

科学家认为地球诞生,太阳系的诞生已经有45亿年了

那意味着这样地球绕着太阳运转

这种重复的动作已经重复了,已经经历了45亿年,就是45亿次

同样我们的地球自转一周呢是一天

这种自转也在反复的进行

地球自转总共经过了多长时间呢?大家可以算一下,一年是365天

而太阳系的寿命呢现在已经到了45亿年,可以算,大概一万多亿次

地球自转已经超过一万多亿次了

同样我们人走路,迈左脚,迈右脚

你要走很远的地方要反复的重复这个迈左脚,迈右 脚,迈左脚,迈右脚,这也是重复的执行

在计算机编程语言里头,尤其是我们Python编程语言里头

毫无疑问也会存在这样的情况

就是有些代码我们可能要反复的执行不停地循环执行

那么在我们这门课当中,因为我们(学习的)是Python二维交互式程序设计

或者是Python游戏编程,我们除了标准的Python语言提供的循环机制以外呢

还有像SimpleGUITk也提供了一些循环机制

好,这一讲呢我们给大家介绍四方面的内容

第一是如何用while语句来构造循环的程序

第二种情况呢如何用for语句构造循环程序

当然,如果函数自己调用自己这种情况呢叫做递归

会导致代码的重复执行,出现了所谓的循环

最后呢我们再回顾一下SimpeGUITk里面的事件处理函数

它也是会导致代码的重复执行

因为事件,你比如说时钟事件它会定期的发生,一旦这个事件已发生

我们的时钟事件处理函数就会被调用

这样时钟事件反复地在发生,我们的代码反复的被调用

而一样的就是屏幕刷新事件每隔60分之一秒会被调用一次

那么我们写在屏幕刷新事件处理函数里面的代码也会反复 的被调用,等等…这样的一些情况

而现在看一看如何用while语句来构造循环

While循环语句的结构是这样的

首先要书写while这个关键字,然后空格,然后是条件表达式

条件表达式呢在咱们以前的视频里头已经把它介绍过,紧 接着是冒号,注意这是英文的冒号也就是半角的冒号

然后绿色部分是当条件表达式为真的时候要执行的代码

Else后面是,当条件表达式为假的时候要执行的代码

通常我们学while语句的时候呢后面这个else:后面这些代码是不需要的

好,再来看看,当条件表达式为真的时候执行里面一行一行的代码

但是我们也可以在这里循环体里头增加其它的条件表达式

来做进一步的处理或者是跳出循环或者是继续循环

比如说这一条语句,我们测试某一种情况如果满足就让它退出循环break

那么这个循环就不再执行了结束了,当然我们也可以检测其它的条件

如果这个条件表达式为真的时候我们continue

Continue的意思是在这个条件之后的其它的代码

比如说这里打冒号的这些代码我们没有书写出来,就不执行了

直接跳到while的条件表达式的测试这里

如果条件是满足的,继续往下执行,这是while语句的基本结构

下面我们通过实际的代码来看看怎么来使用while语句

大家还记得我们第一个游戏项目

就是老虎杠子鸡虫,这个游戏当中有一个统计,输赢概率的一个函数

这个函数里头呢我们首先对总共玩儿了几把,玩儿家一赢的次数

玩儿家一输得次数以及平局的次数初始化为零

然后我们玩儿一把,这个函数会把输赢的结果给我们送回来

然后玩的次数增加一

结果如果是零,那平局的次数增加一

结果如果是一,表明玩家一赢了,那么玩儿家一赢的次数增加一

否则,那只能是二了,表明玩儿家二赢了

那么玩儿家二赢了就表明玩儿家一输,玩儿家一输的次数增加一

这是玩儿一把我们更新了这些变量的值

然后再来一把执行的代码是完全一样的

在玩儿一把执行的代码也一样

第四次玩儿一把,执行的代码也一样,完全重复的

如果我们要玩儿一万次这样的游戏,那想一想我们需要多少行代码

每玩儿一次需要的代码我们可以数一下

一行,两行,三行,四行,五行,六行,七行,八行,一万次呢就需要八万行代码

这显然不是一个好的方法,我们当然可以用循环来完成这一万次对决

怎么做到这一点呢,用while循环,好,我们while,playtimes,玩的次数

从,好,playtimes小于10000,这是我们循环的条件,条件表达式

是一个逻辑表达式,它要么返回真要么返回假

好,让它来执行这些代码,但要往后缩进四个空格,全部缩进4个空格

现在后面玩儿一把,玩儿两把,玩儿三把,这些我们都不需要了,

好,来运行我们的程序,看一看它的效果

你看这个输出的结果,甲乙随机比赛一万次,验证对决结果的概率

很接近我们理论计算的概率,可以看到这就是循环它的妙处

通过while循环我们原来需要八万行的代码现在变成了九行就可以完成这个功能

好,再来看看while循环的另外一个例子

这是井字棋游戏,可能有的同学玩儿过

就是在三乘三的方格上面两个玩儿家拿笔去画或者拿旗子去下

一个是花圈儿或者是下圆圈的棋

另外一个是画叉或者是下带叉的棋

那么甲乙双方在对决的过程中轮流来画圈或者画叉

如果谁画的连城了一条线谁就赢了

横着连成一条线,竖着连城一条线或者对角线连成一条线

就是三个连在一起了,那谁就赢了

这游戏的规则实际上很简单

好,我们看看用while语句怎么来实现这样的游戏

打开(?),然后创建一个文件(?)井字棋游戏

好,我们用到的一些东西我们先导进来,import random,sell_left=9

然后我们的棋盘用一个列表来表示,比如board,012345678这是棋盘

好,然后我们把棋盘显示出来,用一个定义函数show() 来显示棋盘

可以直接把它打印,用print语句在控制台输出就行

好,现在我们调用一下 show()函数 看看它的效果

show,存一下盘,叫ttt,yes,然后运行

这个棋盘已经画好了

现在我们希望玩家和计算机的对决

玩家选择的位置要(×)

计算机选择的位置去画圈

直到一方赢或者是九个位置全部填满了

那新一轮游戏开始,怎么做到这一点呢

这时候因为是 玩家画一把 计算机画一把

玩家再画一把计算机画一把

显然是一个循环语句, 怎么来循环呢

while,true,先是我们要选择具体那样的位置去画叉

先让玩家你输入一个你准备在哪里打叉这个位置

当然你输入的只能是0 到 8之间的某个数字

这个数字刚好就是我们这个列表的下标

那么看看这个下表对应的元素不等于x就是没画过叉

也不等于○没画过圈

这个位置我们才能把叉画上去

怎么把叉花上去呢

让这个位置的元素值变成x,那么剩下的方格还要减一

否则,我们要提示玩家

然后我们在把棋盘显示一下 用我们前面的函数

好,现在来运行这个效果,存一下, 然后再来运行

好 选择你要打叉的位置

假如我选 1,好 看 1打叉了

接该计算机下了,计算机,首先

可以直接用random.randrange产生一个随机的数字

放到对手的变量里边

但是注意它随机产出的数字可能

是我们玩家已经打过叉的地方

或者是上一把已经画过圈的地方

所以它要反复做这种尝试才能找到一个空位置把圈画上去

因此我们声明一个变量叫finding

找到位置没有,开始是没找到

条件是没找到并且剩下的位置方格还存在,我们就要一直循环

随机产生一个位置, 然后判断这个位置有没有打过叉

有没有画过圈,如果没有

那么就画一个圈并且剩下的方格数减一

而且, 将finding这个变量复成真

一旦复成真就不会再循环了

现在看一看,再来运行我们的程序

好,我选1,计算机选择6画了个圈

我选择2,计算机选择了7画了圈

我选择5

计算机选择了0位置画了圈

好,我选择4

计算机选8画了圈

这时候应该是计算机赢了

应该新一轮的游戏开始

但是我们的程序 并没有这样处理

好,下面来看如何判断输赢

在上面我们定义一个函数

来判断玩家赢了

玩家赢的条件是什么

就是0,1,2 或者是 3,4,5 或者是 6,7,8

都是叉,三个连成了叉

或者是0.3.6是叉,或者是1.4.7是叉

或者是2.5.8是叉

也可以是0.4.8是叉2.4.6是叉

这八种情况下就是玩家赢了,看看是不是8种情况,第一种情况,第二种

第三,第四,第五,第六,第七,第八种情况,就是这些位置上是叉的时候玩家赢了

同样的原理我们可以来定义一个函数判断计算机是否赢了

计算机赢的情况是

三个连续的横线或者竖线或者斜线交叉线上面都是O的时候

那就计算机赢了

计算机赢得时候返回True

有了这两个函数我们就可以在下面进行判断

如果玩家赢了

输出“恭喜,你赢了”

进行新一轮的游戏

如果计算机赢了

输出“遗憾,你输了”

进行下一轮游戏

new_game() 函数还没有定义,new_game函数到前面去定义,在这里定义

new_game() 函数做了什么事情呢

首先输出一个空行

然后输出“新一轮游戏开始 ”

然后让棋盘回复到初始状态

剩余的方格有九个

然后显示这个棋盘

最后我们在这个循环一进来的时候

还要做一些简单的处理

那就是判断

剩下的格子有多少个

如果剩下的格子为零

那说明谁也没有赢 变成了平局

并且新一轮游戏开始

好 保存一下 我们看一下

保存,运行

我选择 0

计算机选择了 8

我选择了 1

计算机选择了 6

新一轮游戏开始

我选择1

计算机选择了3

我选择了 8

计算机选择了 0

我选择了 2

计算机选择了 4

我选择了 7

计算机选择了 6

计算机赢了

这样这个游戏一直玩下去

这就是while 循环它的妙处

好的 下面我们来介绍 for 循环

好,看一下for循环的格式

for是关键字

必须要原分不动得

照这个样子输上去

然后是空格紧接着是目标序列

然后又是空格 紧接着是 in

in也是关键字必须原封不动的输上去

紧接着是空格

后面是表达式序列

最后是冒号

什么意思呢

就是这个表达式序列返回的是一个

迭代器

然后呢

我们在这个迭代器里面

也叫循环器

我们在这个循环器里面

从小到大开始

一个一个的取出来

放到目标序列里面

只要迭代器里面或者是循环器里面, 还有元素

我们就要执行循环体就是绿色方框这部分的代码

一直要循环,和while循环一样

我们在这个循环体里面也可以,设置一些其他的条件判断

迭代器的下一个元素的当中去循环

注意 这里要注意的就是表达式序列

能生成迭代器的表达式序列一般是

字符串,元组,列表,字典 等等 还有reanch,这些东西

同样for循环也可以有后面的else部分

一般我们写程序呢else部分是不需要的

它的意思什么呢

就是当表达式序列生成的迭代器是空的时候

或者是表达式序列生成的迭代器

我们已经把它循环完了

就是最后一个元素已经访问完了

那么就执行else部分

我们看看具体的实例

第一个例子

我们来计算 N的阶乘

factorial阶乘的函数, 参数是N

但是一个正整数

我们先让返回的结果赋值为1

然后我们用for循环

来乘它当中的每一个数字

从1开始乘到N

好,for 空格 number 空格

in 空格 range(1,n+1)

这条语句的含义是什么呢

就是range(1,n+1)是一个

可以生成迭代器或者循环器的序列

这个序列里头返回的类型

当然是一个range类型

是1到n 这些所有的数字

然后我们每循环一次会把这个迭代器里面的

元素赋给number这个变量

对于说第一次进来循环的时候

我们会把1赋给number

循环第二次的时候会把2赋给number

第三次的时候把3赋给number

到第N 次的时候会把N赋给number

注意这个range不包括N+1

所以我们就让结果是1

先乘上第一次迭代的1

乘完以后

再次循环的时候乘2

再次循环的时候乘3

再次循环的时候乘4,一直乘到n

那返回来的结果就是N的阶乘

好我们来测试这个N的阶乘

看看结果对不对

12的阶乘我们执行一下

先把下面的注释起来, 运行

好,大家可以对一对这个数字

大家可以用计算机算一下

12阶乘是不是479001600

好,我们再看一下 sin x

我们可以用后面这个表达式来逼近

好 我们来看看如何用for语句

通过循环语句来

按照上面这个公式计算sin x的近似值

注意看一下

这个近似值最后我们写成∑就是和的这种形式

是n从0到无穷大

然后可以一直计算下去

当然 N越大,它的进度越准

就是最后计算的结果越准

那实际上我们在

整整计算过程当中不可能做到

计算无穷的次数

而是在有限范围内精度就可以达到我们的要求

好,看这里我们实际上只计算了10次

N从0到开始到0,1,2,3,4,5,6,7,8,9

不包括10 我们计算了10次

这时候达到的精度已经完全满足, 通常计算的要求

看一下第一次循环

N是0我们看看

这部分计算出来的是不是第一项x

负一的零次方

变成了正一

x的符号是正的

没错,然后是x的多少次方呢

一次方 因为2*0+1等于1 ,1次方

所以是x 没问题

除的呢

是 2*0+1就是1

一的阶乘还是1

所以 当N等于0的时候计算出来的这种表达式

刚好就是X

然后把X加到result, result 原来是0 加进去

接着N等于1的时候我们看

负一的一次方是负一

这是第二项的符号就是负号,负的

然后X的几次方呢

2乘1是2加1等于3, X的三次方

就是上面这个X的三次方

除的是,2乘1加1是3

3的阶乘刚好是3的阶乘没问题

再看当N等于2的时候是不是第三项

N等于2的时候

负一的二次方式正一变成了正号

然后是X的多少次方呢

2乘2是4加1等于5

X的五次方 没问题

当然一样,这也是5

5的阶乘 这是5的阶乘

依次类推我们可以一直计算下去

我们这里计算的是N等于0,1,2,3,4

一直到9, 计算到这一步

计算到这里进度已经达到我们的要求了

好 现在看一看用我们的函数来计算

四分之pi 也就是45度

这个角度它的sin值是多少

看计算的结果对不对

我们对比一下

因为大家知道45度的sin值是2分之根号2

这就是二分之根号二

好,运行一下看看效果

好 上面这个值呢

是我们自己的函数计算出来的sin(45)度的值

下面这个呢

是二分之根号二计算出来的值

两个非常非常的接近

好 这就是for循环它的妙用

可以通过for循环计算复杂的数

下面呢 我们看看

递归导致的代码重复执行的情况

这里有个例子

我们有一个火箭发射倒计时的程序

在这个程序当中我们定义了一个函数

count_down 向下数数字

它有个参数是正整数的N

可以看看这个函数

当N的值等于0的时候

输出“点火”

当N的值不等于0,也就是大于0的时候,先输出n,然后停1秒针,然后用n-1再调用自己这个函数。

好 现在看看我们这个调用它

N等于10

用10作为参数去调用我们这个函数

看看它的执行过程

参数传过来时N和0相比

不等于 因此 这个不执行

但是要执行后面的else语句要执行

N等于10先把10输出去

显示在控制台,停一秒钟

然后N等于9去调用我们自己这个函数

好 回过来到这里看

N等不等于0

它是9不等于 10

所以这个也不执行

但是后面这部分要执行

把9 输出出去,停一秒钟

再用8作为参数调用自己这个函数

依次类推一直到

当N变成0的时候这个条件就满足了

然后就会输出“点火”

但是后面的条件就不满足了不执行了

函数结束

我们看看运行的效果

10,9,8,7,6,5,4,3,2,1,点火

程序运行完毕

可以看到递归的函数

也可以使得函数当中的代码重复执行多次

好的大家可以注意到了

当我们调用一个递归函数的时候

所谓递归函数呢

就是函数当中有自己调用自己的语句

这种函数??

我们调用递归函数的时候

函数体当中的代码会被重复执行

它的效果就和我们前面介绍的while?循环语句

for循环语句一样会导致代码段的重复执行

同时呢同学们可能观察到了

用simplegrettiki开发游戏程序的时候这事件

在注册事件的时候我们会指定当这个事件发生的时候

所要处理这个事件的函数

我们把它叫做事件处理函数

事件处理函数当中的代码

也会重复多次被调用 多次被执行

原因很简单

就是这些事件它本身会多次发生 会重复发生

比如说按钮的处理事件

我们游戏界面上出现了按钮

游戏玩家可以多次按这个按钮

那每点一次

我们的按钮事件处理的函数就会被调用一次

因此也会出现代码被重复执行重复被调用这样的现象

更典型的就是时钟事件和计时器事件

每隔一定的时间比如每隔一秒钟每隔十分之一秒就会发生一次

一旦这个事件一发生我们写在

时钟事件处理函数的代码就会被调用

同样屏幕刷新事件处理函数

就是我们一般的drow函数

这个函数当中的代码也会被重复的调用

也会被反复的执行

好了这就是

循环和迭代这一讲

我们要讲的主要内容

好 咱们下次再见

Python 交互式程序设计导论课程列表:

第0周

-课程简介

--课程简介

-A 课程视频(算数操作符及表达式)

--绪论

--Python交互式解释器使用方法

--PyCharm集成开发环境介绍

--算数操作符及表达式

-B 课程视频(变量及赋值)

--变量

--项目提交

--“我喜欢Python”热身小项目

-C 辅助视频(计算机结构、Python开发环境安装)

--Windows平台安装Python开发环境

--Mac平台安装Python开发环境

-D 辅助视频(如何提交项目)

--项目提交

-第0周--小测验

-本周项目:"我喜欢Python"

--项目发布、完成、提交及评分流程

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

--项目提交

第1周

-A 课程视频(函数)

--函数

--其它操作符

--随机函数

-B 课程视频(逻辑及表达式)

--逻辑值和比较

--条件

--编程技巧

--“老虎杠子鸡虫”游戏

-第1周--小测验

-本周项目:“老虎杠子鸡虫”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第2周

-A 课程视频(Python交互式应用)

--事件驱动编程

--事件可视化跟踪执行

--SimpleGUITk

--按钮

-B 课程视频(输入框、全局变量)

--输入框

--局部变量和全局变量

--编程技巧

--“猫咪藏在哪个房间”游戏

-第2周--小测验A

-第2周--小测验B

-本周项目:猫咪藏在哪个房间

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第3周

-A 课程视频(画布绘图)

--画布和图形绘制

--字符串处理

--绘图和计时器可视化跟踪执行

--图片和音效

-B 课程视频(计时器)

--计时器

--交互式绘图

--“神奇时钟”游戏

--编程技巧

-第3周--小测验A

-第3周--小测验B

-本周项目:“神奇时钟”

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第4周

-A 课程视频(列表)

--列表

--键盘输入

--列表及变化可视化跟踪执行

--碰撞和反射

-B 课程视频(键盘控制)

--速度控制

--运动

--编程技巧

--“桌上冰球”游戏

-第4周--小测验A

-第4周--小测验B

-本周项目:“桌上冰球”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第5周

-A 课程视频(鼠标输入、列表进阶)

--鼠标输入

--Video

--Video

--Video

-B 课程视频(字典和图片)

--Video

--Video

--Video

--Video

-第5周--小测验A

-第5周--小测验B

-本周项目:“世界杯八强连连看”

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第6周

-A 课程视频(类)

--面向对象编程(类和对象入门)

--面向对象编程(类和对象进阶)

--对象可视化跟踪执行

--华容道中的类

-B 课程视频(平铺图片)

--平铺图片

--理解对象

--编程技巧

--“华容道”游戏

-第6周--小测验A

-第6周--小测验B

-本周项目:“华容道”游戏

--游戏说明

--程序说明

--编码步骤

--评分标准

--项目模板

第7周

-A 课程视频(类进阶及文件操作)

--集合

--文件操作

--文字块类

--处理停止的文字块

-B 课程视频(游戏状态控制)

--游戏记分规则

--游戏结束的条件及处理

--编程技巧

--“决战三字经”游戏

-第7周--小测验A

-第7周--小测验B

-本周项目:决战三字经

--游戏说明

--程序说明

--编程步骤

--评分标准

--项目模板

第8周

-A、课程视屏(精灵集合)

--Video

--精灵类

--战士类

--编程技巧

-B、课程视屏(动画)

--精灵碰撞

--精灵动画

--编程技巧

--保卫家园游戏

-第8周--小测验

-本周项目:守卫家园

--游戏说明

--程序说明

--编程步骤

--评分标准

--项目模板

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。