资源描述
程序(chngx)的循环结构n第1页/共48页第一页,共49页。 根据循环执行次数的确定性,分为确定次数循环和非确定次数循环 确定次数循环指循环体对循环次数有明确的定义,这类循环在Python中被称为“遍历循环”,其中,循环次数采用遍历结构中元素个数来体现,具体采用for语句实现。 非确定次数循环指程序不确定循环体可能的执行次数,而通过(tnggu)条件判断是否继续执行循环体,Python提供了根据判断条件执行程序的无限循环,具体采用while语句实现。程序(chngx)的循环结构n第2页/共48页第二页,共49页。 Python通过保留字for实现“遍历循环”,基本( jbn)使用方法如下: for in : 之所以称为“遍历循环”,是因为for语句的循环执行次数是根据遍历结构中元素个数确定的。遍历循环可以理解为从遍历结构中逐一提取元素,放在循环变量中,对于每个所提取的元素执行一次语句块。遍历(bin l)循环: for语句n第3页/共48页第三页,共49页。 遍历结构可以(ky)是字符串、文件、组合数据类型或range()函数,常用的使用方式如下循环N次for i in range(N):遍历文件fi的每一行for line in fi:遍历字符串s for c in s:遍历循环(xnhun): for语句n第4页/共48页第四页,共49页。 遍历循环还有一种扩展模式,使用方法(fngf)如下: for in : else: 遍历(bin l)循环: for语句n第5页/共48页第五页,共49页。 在这种扩展模式(msh)中,当for循环正常执行之后,程序会继续执行else语句中内容。else语句只在循环正常执行之后才执行,因此,可以在中放置判断循环执行情况的语句。 这里先给一个小例子:遍历(bin l)循环: for语句n第6页/共48页第六页,共49页。 很多应用很难在执行之初就有确定(qudng)的遍历结构,这需要编程语言提供根据条件进行循环的语法,称为无限循环,又称条件循环。 无限循环一直保持循环操作直到特定条件被满足才结束,不需要提前知道循环次数。无限(wxin)循环: while语句n第7页/共48页第七页,共49页。 Python通过保留字while实现(shxin)无限循环,基本使用方法如下: while : 其中与if语句中的判断条件一样,结果为True和False。无限循环(xnhun): while语句n第8页/共48页第八页,共49页。 在这种扩展模式中,当while循环正常执行之后,程序会继续执行else语句中内容(nirng)。else语句只在循环正常执行之后才执行,因此,可以在中放置判断循环执行情况的语句,例如:无限循环(xnhun): while语句n第9页/共48页第九页,共49页。 程序执行后的效果如下: 如果通过while实现一个计数循环,需要在循环之前对计数器idx进行初始化,并在每次循环中对计数器idx进行累加,如上述代码第4行。相比for循环,循环变量逐一取自遍历结构( jigu),不需要程序维护计数器无限(wxin)循环: while语句n第10页/共48页第十页,共49页。 循环结构有两个辅助保留字:break和continue,它们用来辅助控制循环执行。 break用来跳出最内层for或while循环,脱离该循环后续(hux)执行,例如循环(xnhun)保留字: break和continuen第11页/共48页第十一页,共49页。 其中,break语句跳出了最内层for循环,但仍然继续执行外层循环。每个break语句只有能力跳出当前层次(cngc)循环。 continue用来结束当前当次循环,即跳出循环体中下面尚未执行的语句,但不跳出当前循环。对于while循环,继续求解循环条件。而对于for循环,程序流程接着遍历循环列表。循环(xnhun)保留字: break和continuen第12页/共48页第十二页,共49页。 对比(dub)continue和break语句,如下:循环(xnhun)保留字: break和continue两个(lin )程序执行后的效果分别为 PYHON PYn第13页/共48页第十三页,共49页。random库的使用(shyng)n第14页/共48页第十四页,共49页。 随机数在计算机应用中十分常见(chn jin) Python内置的random库主要用于产生各种分布的伪随机数序列 random库采用梅森旋转算法(Mersenne twister)生成伪随机数序列,可用于除随机性要求更高的加解密算法外的大多数工程应用。random库概述(i sh)n第15页/共48页第十五页,共49页。 使用random库主要目的是生成随机数,因此,读者只需要(xyo)查阅该库的随机数生成函数,找到符合使用场景的函数使用即可。这个库提供了不同类型的随机数函数,所有函数都是基于最基本的random.random()函数扩展而来。random库概述(i sh)n第16页/共48页第十六页,共49页。random库解析(ji x) random库常用的9个随机数生成(shn chn)函数函数描述函数seed(a=None)初始化随机数种子,默认值为当前系统时间seed(a=None)random()生成一个0.0, 1.0)之间的随机小数random()randint(a, b)生成一个a,b之间的整数randint(a, b)getrandbits(k)生成一个k比特长度的随机整数getrandbits(k)randrange(start, stop, step) 生成一个start, stop)之间以step为步数的随机整数randrange(start, stop, step)uniform(a, b)生成一个a, b之间的随机小数uniform(a, b)choice(seq)从序列类型(例如:列表)中随机返回一个元素choice(seq)shuffle(seq)将序列类型中元素随机排列,返回打乱后的序列shuffle(seq)sample(pop, k)从pop类型中随机选取k个元素,以列表类型返回sample(pop, k)n第17页/共48页第十七页,共49页。 对random库的引用方法与math库一样,可采用下面两种方式实现 import random 或 from random import * 使用random库的一些(yxi)例子如下,请读者注意,这些语句每次执行后的结果不一定一样:random库解析(ji x)n第18页/共48页第十八页,共49页。random库解析(ji x)n第19页/共48页第十九页,共49页。 生成随机数之前可以通过seed()函数指定随机数种子,随机种子一般是一个整数,只要种子相同,每次生成的随机数序列(xli)也相同。这种情况便于测试和同步数据,例如:random库解析(ji x)n第20页/共48页第二十页,共49页。的计算(j sun)n第21页/共48页第二十一页,共49页。的计算(j sun)n第22页/共48页第二十二页,共49页。 随着计算机的出现,数学家找到了另类求解的方法:蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法。 当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种“试验”的方法,得到(d do)这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。这就是蒙特卡罗方法的基本思想。的计算(j sun)n第23页/共48页第二十三页,共49页。 应用蒙特卡罗方法求解的基本步骤如下:随机向单位正方形和圆结构,如图4.10所示,抛洒大量“飞镖”点,计算每个点到圆心的距离从而判断(pndun)该点在圆内或者圆外,用圆内的点数除以总点数就是/4值的计算(j sun)n第24页/共48页第二十四页,共49页。 为了简化计算,一般利用图形(txng)的1/4求解值,如图4.11所示。该问题的IPO表示如下: 输入:抛点数 处理:计算每个点到圆心的距离,统计在圆内点的数量 输出:值的计算(j sun)n第25页/共48页第二十五页,共49页。的计算(j sun)n第26页/共48页第二十六页,共49页。 上述代码中,random()函数随机返回一个在0,1)之间的浮点数,用两个随机数给出随机抛点(x,y)的坐标。sqrt()函数来自于数学库math,用来求解输入数据的平方根。第一次调用clock()函数启动(qdng)一个新的计时器,第二次调动clock()函数返回启动(qdng)计时器后的时间。的计算(j sun)n第27页/共48页第二十七页,共49页。 代码中DARTS是一个常量,初始设定这个抛点数为1000。该程序运行结果如下: Pi值是3.144. 运行时间是: 0.016477s 计算得到(d do)的值为3.144,与大家熟知的3.1415相差较远。原因是DARTS点数量较少,无法更精确刻画面积的比例关系。的计算(j sun)n第28页/共48页第二十八页,共49页。 表4.4列出了不同DARTS值情况下该程序的运行情况,可以(ky)看到,随着DARTS数量的增加,在220数量级上,的值就相对准确了。DARTS运行时间2103.1093750.011s2113.1386710.012s2123.1503900.014s2133.1435540.018s2143.1413570.030s2153.1478270.049s2163.1419670.116s2183.1445770.363s2203.14266967771.255s的计算(j sun)n第29页/共48页第二十九页,共49页。异常(ychng)处理机制n第30页/共48页第三十页,共49页。 观察下面这段小程序 num = eval(input(请输入一个整数(zhngsh): ) print(num*2) 当用户输入数字时,程序正常执行,如果用户输入的不是数字呢?异常处理(chl): try-except语句n第31页/共48页第三十一页,共49页。异常处理(chl): try-except语句n第32页/共48页第三十二页,共49页。 可以看到,Python解释器返回了异常信息,同时程序退出,图4.12具体说明了这个异常信息中各部分(b fen)的含义。异常(ychng)处理: try-except语句n第33页/共48页第三十三页,共49页。 Python异常信息中最重要的部分是异常类型,它表明了发生异常的原因,也是程序处理异常的依据。 Python使用try-except语句实现异常处理,基本( jbn)的语法格式如下: try: except :异常处理(chl): try-except语句n第34页/共48页第三十四页,共49页。 语句块1是正常执行的程序内容,当发生异常(ychng)时执行except保留字后面的语句块,为这个小例子增加异常(ychng)处理,代码如下: 异常(ychng)处理: try-except语句n第35页/共48页第三十五页,共49页。 try-except语句可以支持多个except语句,语法格式(g shi)如下: try: except : . except : except:异常(ychng)的高级用法n第36页/共48页第三十六页,共49页。 其中,第1到第N个except语句后面都指定了异常类型,说明这些except所包含的语句块只处理(chl)这些类型的异常。最后一个except语句没有指定任何类型,表示它对应的语句块可以处理(chl)所有其他异常。这个过程与if-elif-else语句类似,是分支结构的一种表达方式,一段代码如下。异常(ychng)的高级用法n第37页/共48页第三十七页,共49页。异常的高级(goj)用法n第38页/共48页第三十八页,共49页。 该程序将用户输入的数字作为索引从字符串alp中返回(fnhu)一个字符,当用户输入非整数字符时,except NameError异常被捕获到,提升用户输入类型错误,当用户输入数字不在1到26之间时,异常被except捕获,程序打印其他错误信息,执行过程和结果如下:异常(ychng)的高级用法n第39页/共48页第三十九页,共49页。 除了try和except保留字外,异常语句还可以与else和finally保留字配合使用,语法格式(g shi)如下: try: except : else: finally:异常(ychng)的高级用法n第40页/共48页第四十页,共49页。 此处的else语句与for循环和while循环中的else一样(yyng),当try中语句块1正常执行结束且没有发生异常时,else中语句块3执行,可以看作是对try语句块正常执行后的一种追加处理。 finally语句块则不同,无论try中语句块1是否发生异常,语句块4都会执行,可以将程序执行语句块1的一些收尾工作放在这里,例如关闭打开文件等。异常的高级(goj)用法n第41页/共48页第四十一页,共49页。 采用这些(zhxi)保留子的异常处理控制流过程如图4.13所示异常的高级(goj)用法n第42页/共48页第四十二页,共49页。 采用else和finally修改(xigi)代码如下异常(ychng)的高级用法n第43页/共48页第四十三页,共49页。 执行过程和结果( ji gu)如下:异常的高级(goj)用法n第44页/共48页第四十四页,共49页。 Python能识别很多种异常类型,但不建议读者编写程序时依赖try-except这种异常处理(chl)机制。try-except异常一般只用来检测极少发生的情况,例如:用户输入的合规性或文件打开是否成功等。对于本节小例子中索引字符串超过范围的情况应该尽量在程序中采用if语句直接判断,尽量避免通过异常处理(chl)来应对这种可能发生的“错误”异常的高级(goj)用法n第45页/共48页第四十五页,共49页。 对于商业应用的软件产品,稳定性和可靠性是最重要的衡量(hng ling)指标之一。即使这类软件产品,也不会滥用try-except类型语句。因为采用try-except语句会影响代码的可读性,增加代码维护难度,因此,一般只在关键地方采用try-except类型语句处理可能发生的异常。 没看懂,到底该什么时候该使用异常语句呢? 程序员都是对它又爱又恨,其实,想用就用吧,用户体验好才是王道!异常的高级(goj)用法n第46页/共48页第四十六页,共49页。 本章主要讲解程序的基本结构,包括(boku)分支结构和循环结构,介绍身体质量指数BMI的计算,用实例说明分支结构的使用。本章同时介绍了一个常用标准库random库,利用它实现了蒙特卡罗方法求解的过程。最后介绍了程序的异常处理操作。本章(bn zhn)小结n第47页/共48页第四十七页,共49页。n谢谢您的观看谢谢您的观看(gunkn)!n第48页/共48页第四十八页,共49页。NoImage内容(nirng)总结程序的循环结构。其中与if语句中的判断条件一样,结果为True和False。random库采用梅森旋转算法(Mersenne twister)生成伪随机数序列,可用于除随机性要求更高的加解密算法外的大多数工程应用。将序列类型中元素随机排列,返回打乱后的序列。从pop类型中随机选取k个元素,以列表类型返回。对random库的引用方法与math库一样,可采用下面两种方式(fngsh)实现。print(num*2)第四十九页,共49页。
展开阅读全文