Python程序设计 课件 第7章 循环结构和布尔值_第1页
Python程序设计 课件 第7章 循环结构和布尔值_第2页
Python程序设计 课件 第7章 循环结构和布尔值_第3页
Python程序设计 课件 第7章 循环结构和布尔值_第4页
Python程序设计 课件 第7章 循环结构和布尔值_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

循环结构和布尔值第七章课程目标课程目标2理解交互式循环和哨兵循环的编程模式,以及它们用Python的while语句的实现1理解确定和不定循环的概念,以及它们用Python的for和while语句的实现3理解文件结束循环的编程模式,以及在Python中实现这种循环的方法4能为涉及循环模式(包括嵌套循环结构)的问题设计和实现解决方案5理解布尔代数的基本思想,并能分析和编写涉及布尔运算符的布尔表达式PART1for循环:快速回顾1for循环:快速回顾for循环语句允许我们访问一系列值,它的基本形式:for<var>in<sequence>:<body>依次取序列中的每个值,循环体中的语句针对每个值执行一次。主要用于遍历,但是不能实现下标访问1for循环:快速回顾阿基米德与国王下棋,国王输了,国王问阿基米德要什么奖赏?阿基米德对国王说:“只要在棋盘上第一个放一粒米,第二格放二粒,第三格放四粒,第四格放十六粒……按这个方法放满整个棋盘就行。”国王以为要不了多少粮食,就随口答应了,结果国王输了。国际象棋一共有64格,现在请大家来算算一共要多少粒米。1for循环:快速回顾importmathdefmain():all_sum=0n=int(input("输入整数:"))

foriinrange(1,n+1):all_sum=all_sum+pow(2,i-1)print(all_sum)

main()1for循环:快速回顾输入整数:64184467440737095516151公斤大米约4万粒,所以是46万亿公斤大米。中国一年的大米产量约13277亿斤1for循环:快速回顾了解计数循环设计和实现能工作的程序了解累积器PART2不定循环2不定循环for循环是一个有限循环,这意味着循环开始时确定迭代次数。方法:用另一种循环,即“不定循环”或“条件循环”。一个独立的循环保持迭代,直到满足某些条件。2不定循环在Python中,用while语句实现了一个不定循环。while<condition>:<body>是一个布尔表达式。是一个或多个语句的序列。2不定循环图7.1

while循环的流程图“先测试”循环2不定循环i=0

whilei<=10:

print(i)

i=i+1while要求在循环之前负责初始化i,并在循环体的底部让i增加。在for循环中,循环变量是自动处理的。PART3交互式循环3交互式循环交互式循环:允许用户根据需要重复程序的某些部分。例:以数字求平均值。为了允许用户在任何时间停止,循环的每次迭代将询问是否有更多的数据要处理。3交互式循环defmain():total=0.0count=0moredata="yes"whilemoredata[0]=="y":x=float(input("输入一个数>>"))

total=total+xcount=count+1moredata=input("是否还要继续输入(y/n)?")print("\n平均值为:",total/count)main()将交互式循环模式和累加器结合得到求平均值的算法。3交互式循环输入一个数>>5是否还要继续输入(y/n)?y输入一个数>>6是否还要继续输入(y/n)?y输入一个数>>7是否还要继续输入(y/n)?n

平均值为:6.0PART4哨兵循环(改进)4哨兵循环哨兵循环不断处理数据,直到达到一个特殊值,表明迭代结束。特殊值称为“哨兵”。可以选择任何值作为哨兵。唯一的限制是能与实际数据值区分开来。哨兵不作为数据的一部分进行处理。4哨兵循环获取第一个数据项当该数据不是哨兵时处理数据获取下一个数据项有时被称为“启动读入”4哨兵循环设计一个可以计算任何实数平均值的算法。选择一个与正实数和负实数都不同的“哨兵”当输入不是“哨兵”时,可以一直进行数据的输入当输入“哨兵”时,程序则退出输入并计算平均值4哨兵循环初始化total为0.0初始化count为0输入数据为字符串,xStrwhilexStr不为空将xStr转换为浮点型,x将x与total相加count加1输入下一个字符串数据,xStr输出total/count4哨兵循环defmain():total=0.0count=0xStr=input("输入一个数字(<Enter>退出)>>")

whilexStr!="":#“”空字符串这个就是哨兵x=float(xStr)total=total+xcount=count+1xStr=input("输入一个数字(<Enter>退出)>>")

print("\n平均值为:",total/count)main()4哨兵循环输入一个数字(<Enter>退出)>>5输入一个数字(<Enter>退出)>>6输入一个数字(<Enter>退出)>>7输入一个数字(<Enter>退出)>>4输入一个数字(<Enter>退出)>>3输入一个数字(<Enter>退出)>>

平均值为:5.0PART5文件循环(进一步优化)5文件循环所有平均值程序都有一个缺点:它们是互动的,不能返回修改数据。如果你正在尝试求87个数字的平均值,而恰巧在接近尾声时发生了打字错误。用我们的互动程序,你只能重新开始。将所有数字输入到文件中。5文件循环defmain():fileName=input("选择文件")infile=open(fileName,’r’)total=0.0count=0forlineininfile:total=total+float(line)count=count+1print("\n平均值为:",total/count)main()将文件作为行序列,遍历该文件。使用文件对象作为for循环中的序列,可以查看文件中的数据。将这种技术直接应用于数字平均值问题。假设数字被输入一个文件,每行一个,可以用下列程序计算平均值。5文件循环line=infile.readline()whileline!="":#processlineline=infile.readline()下面是Python中使用readline()的“文件结束循环”的一般模式。5文件循环文本文件中的空白行包含单个换行符("\n"),而且readline方法在其返回值中包含换行符。由于"\n"!="",所以循环将继续。我担心如果文件中遇到空行,该循环会过早停止。如:1234565文件循环defmain():fileName=input("输入文件名:")

infile=open(fileName,'r')total=0.0count=0line=infile.readline()whileline!="":ifline!="\n":total=total+float(line)count=count+1line=infile.readline()print("\n平均值为:",total/count)main()PART6嵌套循环(提高)6嵌套循环以求平均值为例子。假设文件不是每行一个数,而是每行有多个数,每个数之间以逗号隔开。如:1,2,3,4,57,8,9,116,5,4,5在顶层,基本算法将是某种文件处理循环,计算不断增长的总和与计数。在实践中,我们使用文件结束循环。6嵌套循环外部循环total=0.0count=0line=infile.readline()whileline!="":#updatetotalandcountforvaluesinlineline=infile.readline()print("\nTheaverageofthenumbersis",total/count)6嵌套循环1由于文件中每个单独的行包含一个或多个由逗号分隔的数字,所以我们可以将该行分割成子字符串,每个代表一个数字。2我们需要循环遍历这些子字符串,将每个子字符串转换成一个数字,并将它加到total中。3对每个数字,我们还需要让count加1。6嵌套循环内部循环forxStrinline.split(","):total=total+float(xStr)count=count+1迭代由line的值控制。366嵌套循环defmain():fileName=input("输入文件名:")

infile=open(fileName,'r')total=0.0count=0line=infile.readline()whileline!="":#更新total和count的值

forxStrinline.split(","):total=total+float(xStr)count=count+1line=infile.readline()print("\n平均值为:",total/count)main()对文件的每一行进行一次迭代。迭代的次数等于该行中数字的次数。6嵌套循环01设计嵌套循环02先设计外层,不考虑内层的内容03设计内层的内容,忽略外层循环放在一起,注意保留嵌套PART7布尔值计算第二课时7布尔值计算我们现在有两种控制结构(if和while)使用条件,即布尔表达式。在概念上,布尔表达式求值为假或真两个值之一。在Python中,这些值由字面量False和True表示。到目前为止,我们使用简单的布尔表达式来比较两个值(如x>=0)。PART8布尔运算符8布尔运算符<expr>and<expr><expr>or<expr>有时,我们使用的简单条件似乎不足以表达。那我们就可以使用“布尔运算”来构造更复杂的表达式。与(and)或(or)非(not)布尔运算符8布尔运算符表7-1

and的真值表P表达式1,Q表达式2PQPandQTTTTFFFTFFFF8布尔运算符表7-2

or的真值表pqPorQTTTTFTFTTFFF8布尔运算符表7-3

not的真值表PnotPTFFT8布尔运算符Python遵循一个标准惯例:与(and)或(or)非(not)高低当在一个运算表达式中有多个布尔表达式,那么应该先计算那个呢?8布尔运算符ifp1.getX()==p2.getX()andp2.getY()==p1.getY():print("两点在同一位置")else:print("两点不在同一位置")用布尔表达式测试两点是否在同一位置。PART9布尔代数9布尔代数计算机程序中的所有判断都归结为适当的布尔表达式。布尔表达式遵循一些代数定律,类似于适用于数字运算的定律。这些定律称为“布尔逻辑”或“布尔代数”。我能用布尔表达式来表达、操作和推理。and与乘法有相似之处,or与加法相似,0和1对应于假和真。9布尔代数代数布尔代数a*0=0aandfalse==falsea*1=aaandtrue==aa+0=aaorfalse==a表7-4

一些代数规则和布尔代数中相关的规则9布尔代数and和or满足分配律:下面两个恒等式称为DeMorgan定律:(aor(bandc))==((aorb)and(aorc))(aand(borc))==((aandb)or(aandc))(not(aorb))==((nota)and(notb))(not(aandb))==((nota)or(notb))9布尔代数表7-5

DeMorgan第一定律abaorbnot(aorb)notanotb(nota)and(notb)TTTFFFFTFTFFTFFTTFTFFFFFTTTT布尔代数有一个不错的特性:这种简单的恒等式很容易用真值表验证。PART10其他常见结构10其他常见结构判断结构(if)以及先测试循环(while)提供了一套完整的控制结构。对于某些类型的问题,替代结构有时会比较方便。PART11后测试循环11后测试循环假设你正在编写一个输入算法,该算法需要从用户那里获取一个非负数。如果用户键入错误的输入,程序会要求另一个值。它不断重新提示,直到用户输入一个有效值。这个过程称为输入验证。11后测试循环repeatgetanumberfromtheuseruntilnumberis>=011后测试循环图7.2测试后循环的流程图11后测试循环number=-1whilenumber<0: number=float(input("输入正数:"))Python没有直接实现后测试循环的语句。但是,该算法可以用while来实现,只要预设第一次迭代的循环条件。这迫使循环体至少执行一次,并且等价于后测试算法。11后测试循环whileTrue: number=float(input("输入正数:")) ifnumber>=0:break也可以使用Python的break语句来直接模拟后测试循环。执行break会导致Python立即退出围绕它的循环。通常用break语句来跳出语法上像是无限的循环。PART12循环加一半12循环加一半whileTrue:

number=float(input("Enterapositivenumber:"))

ifx>=0:break#Loopexit

print("Thenumberyouenteredwasnotpositive")这里的循环出口实际上位于循环体的中间,这称为“循环加一半”。12循环加一半whileTrue:获取下一个数据项如果该数据为哨兵:break处理数据“循环加一半”是避免在哨兵循环中启动读取的一种很好的方式。12循环加一半这个实现忠实于哨兵循环的第一规则——避免处理哨兵值。图7.3哨兵循环的流程图12循环加一半#8_6new_sentry.pydefmain():total=0.0count=0whileTrue:#哨兵为""空字符串xStr=input("输入一个数字(<Enter>退出)>>")ifxStr=="":breakx=float(xStr)total=total+xcount=count+1print("\n平均值为:",total/count)main()PART13布尔表达式作为判断13布尔表达式作为判断有时布尔表达式本身也可以作为控制结构。整数1整数0真假事实上,bool类型只是一个“特殊”的int类型,其中0和1的值打印为False和True。13布尔表达式作为判断True和False分别表示布尔值真和假。Python条件运算符总是求值为bool类型的值。任何内置类型都可以解释为布尔值。对于数字(int和floats),零值被认为是假,除零之外的任何值都被认为是真。13布尔表达式作为判断>>>bool(1)True>>>bool(-1)True>>>bool(0)False>>>bool("abc")True>>>bool("")False>>>bool([1,2,3])True>>>bool([])False13布尔表达式作为判断对于序列类型,空序列被解释为假,而任何非空序列被用来表示真。Python布尔值的灵活性扩展到布尔运算符。操作符操作定义xandy如果x为假,返回x,否则返回yxory如果x为真,返回x,否则返回ynotx如果x为假,返回真,否则返回假表7-6

布尔运算符的行为13布尔表达式作为判断whileresponse[0]=="y"or"Y":while(response[0]=="y")or("Y"):如果我们输入下面这样一句代码会发生什么呢?我们可以将其写为aorb的形式:PART14示例:一个简单的事件循环14示例:一个简单的事件循环包含图形用户界面(GUI)的现代程序通常以事件驱动的方式编写。程序显示图形界面,然后“等待”用户事件,诸如单击菜单或按键盘上的一个键。该程序通过处理该事件做出响应。在背后,驱动这种风格的程序的机制是所谓的“事件循环”。14示例:一个简单的事件循环绘制GUIwhileTrue:获取下一个事件if事件是"退出信号":break处理事件清理并退出14示例:一个简单的事件循环例:打开图形窗口,允许用户通过键入不同的键来改变其背景颜色,如R为红色、G为灰色等。用户可以随时通过按下Q键退出。14示例:一个简单的事件循环fromgraphicsimport*defmain():win=GraphWin("颜色窗口",500,500)

whileTrue:key=win.getKey()ifkey=="q"orkey=="Q":break#根据不同按键进行处理

ifkey=="r"orkey=="R":win.setBackground("pink")elifkey=="w"orkey=="W":win.setBackground("white")elifkey=="g"orkey=="G":win.setBackground("lightgray")elifkey=="b"orkey=="B":win.setBackground("lightblue")win.close()main()强制用户按一个键继续14示例:一个简单的事件循环更灵活的用户界面可能允许用户以各种方式进行交互。课程目标小结希望大家能够为涉及循环模式(包括嵌套循环结构)的问题设计和实现解决方案、理解布尔代数的基本思想,并能分析和编写涉及布尔运算符的布尔表达式。课程目标实践任务1.假设我们要编写一个程序,计算用户输入的一系列数字的平均值。为了让程序通用,它应该适用于任意大小的数字。你知道平均值是通过对数字求和并除以数字的个数来计算的。我们不需要记录所有输入的数字,只需要一个不断增长的总和,以便最后计算平均值。课程目标实践任务2.数字平均值问题有一个更好的解决方案,即采用一种名为“哨兵循环”的模式。哨兵循环不断处理数据,直到达到一个特殊值,表明迭代结束。我们可以将哨兵模式应用于数字平均值问题。第一步是选择哨兵。假设我们正在使用该程序来计算考试成绩的平均值。在这种情况下,我们可以放心地假设没有得分低于0。用户可以输入负数来表示数据结束。课程目标实践任务3.作为一个简单的例子,请考虑一个程序,它只是打开图形窗口,允许用户通过键入不同的键来改变其颜色,如R为红色、G为灰色等。用户可以随时通过按下Q键退出。我们可以将它编码为一个简单的事件循环,用getKey()来处理按键。课程目标课后习题选择题1.在循环体中可以执行__

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论