第3章-Python选择与循环

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第3章选择与循环3.1条件表达式算术运算符:+、-、*、/、//、%、**、~关系运算符:、、==、=、=、!=,可以连续使用,如print123Trueprint123Falseprint132True测试运算符:in、notin、is、isnot逻辑运算符:and、or、not,注意短路求值位运算符:~、&、|、^、、3.1条件表达式在选择和循环结构中,条件表达式的值只要不是False、0(或0.0、0j等)、空值None、空列表、空元组、空集合、空字典、空字符串、空range对象或其他空迭代对象,Python解释器均认为与True等价。从这个意义上来讲,几乎所有的Python合法表达式都可以作为条件表达式,包括含有函数调用的表达式。3.1条件表达式if3:#使用整数作为条件表达式print(5)5a=[1,2,3]ifa:#使用列表作为条件表达式print(a)[1,2,3]a=[]ifa:print(a)else:print('empty')empty3.1条件表达式i=s=0whilei=10:#使用关系表达式作为条件表达式s+=ii+=1print(s)55i=s=0whileTrue:#使用常量True作为条件表达式s+=ii+=1ifi10:breakprint(s)55s=0foriinrange(0,11,1):s+=iprint(s)553.1条件表达式比较特殊的运算符还有逻辑运算符“and”和“or”,这两个运算符具有短路求值或惰性求值的特点,简单地说,就是只计算必须计算的表达式的值。在设计条件表达式时,在表示复杂条件时如果能够巧妙利用逻辑运算符“and”和“or”的短路求值或惰性求值特性,可以大幅度提高程序的运行效率,减少不必要的计算与判断。以“and”为例,对于表达式“表达式1and表达式2”而言,如果“表达式1”的值为“False”或其他等价值时,不论“表达式2”的值是什么,整个表达式的值都是“False”,此时“表达式2”的值无论是什么都不影响整个表达式的值,因此将不会被计算,从而减少不必要的计算和判断。3.1条件表达式在设计条件表达式时,如果能够大概预测不同条件失败的概率,并将多个条件根据“and”和“or”运算的短路求值特性进行组织,可以大幅度提高程序运行效率。例如,下面的函数用来使用用户指定的分隔符将多个字符串连接成一个字符串,如果用户没有指定分隔符则使用逗号。defJoin(chList,sep=None):return(sepor',').join(chList)chTest=['1','2','3','4','5']Join(chTest)'1,2,3,4,5'Join(chTest,':')'1:2:3:4:5'Join(chTest,'')'12345'3.1条件表达式另外,在Python中,条件表达式中不允许使用赋值运算符“=”,避免了其他语言中误将关系运算符“==”写作赋值运算符“=”带来的麻烦,例如下面的代码,在条件表达式中使用赋值运算符“=”将抛出异常,提示语法错误。ifa=3:SyntaxError:invalidsyntaxif(a=3)and(b=4):SyntaxError:invalidsyntax3.2.1单分支选择结构if表达式:语句块a,b=input('Inputtwonumber:')ifab:a,b=b,aprinta,b3.2.2双分支结构if表达式:语句块1else:语句块2chTest=['1','2','3','4','5']ifchTest:print(chTest)else:print('Empty')['1','2','3','4','5']3.2.2双分支结构Python还支持如下形式的表达式:value1ifconditionelsevalue2当条件表达式condition的值与True等价时,表达式的值为value1,否则表达式的值为value2。另外,在value1和value2中还可以使用复杂表达式,包括函数调用和基本输出语句。下面的代码演示了上面的表达式的用法,从代码中可以看出,这个结构的表达式也具有惰性求值的特点。a=5print(6)ifa3elseprint(5)6print(6ifa3else5)6b=6ifa13else9b93.2.2双分支结构x=math.sqrt(9)if53elserandom.randint(1,100)#此时还没有导入math模块Traceback(mostrecentcalllast):Filepyshell#23,line1,inmodulex=math.sqrt(9)if53elserandom.randint(1,100)NameError:name'math'isnotdefinedimportmath#此时还没有导入random模块,但由于条件表达式53的值为True,所以可以正常运行x=math.sqrt(9)if53elserandom.randint(1,100)#此时还没有导入random模块,由于条件表达式23的值为False,需要计算第二个表达式的值,因此出错x=math.sqrt(9)if23elserandom.randint(1,100)Traceback(mostrecentcalllast):Filepyshell#26,line1,inmodulex=math.sqrt(9)if23elserandom.randint(1,100)NameError:name'random'isnotdefinedimportrandomx=math.sqrt(9)if23elserandom.randint(1,100)3.2.3多分支结构if表达式1:语句块1elif表达式2:语句块2elif表达式3:语句块3else:语句块4其中,关键字elif是elseif的缩写。3.2.3多分支结构下面的代码演示了利用多分支选择结构将成绩从百分制变换到等级制的用法。deffunc(score):ifscore100:return'wrongscore.must=100.'elifscore=90:return'A'elifscore=80:return'B'elifscore=70:return'C'elifscore=60:return'D'elifscore=0:return'E'else:return'wrongscore.must0'3.2.4选择结构的嵌套if表达式1:语句块1if表达式2:语句块2else:语句块3else:if表达式4:语句块4注意:缩进必须要正确并且一致。3.2.4选择结构的嵌套deffunc(score):degree='DCBAAE'ifscore100orscore0:return'wrongscore.mustbetween0and100.'else:index=(score-60)//10ifindex=0:returndegree[index]else:returndegree[-1]3.2.5选择结构应用例1:面试资格确认。age=24subject=计算机college=非重点if(age25andsubject==电子信息工程)or(college==重点andsubject==电子信息工程)or(age=28andsubject==计算机):print(恭喜,你已获得我公司的面试机会!)else:print(抱歉,你未达到面试要求)3.2.5选择结构应用例2:用户输入若干个分数,求所有分数的平均分。每输入一个分数后询问是否继续输入下一个分数,回答“yes”就继续输入下一个分数,回答“no”就停止输入分数。3.2.5选择结构应用endFlag='yes's=0whileendFlag.lower()=='yes':x=input(请输入一个正整数:)x=eval(x)ifisinstance(x,int)and0=x=100:s=s+xelse:print('不是数字或不符合要求')endFlag=raw_input('继续输入?(yesorno)')print('整数之和=',s)3.2.5选择结构应用例3:编写程序,判断今天是今年的第几天。importtimedate=time.localtime()year=date[0]month=date[1]day=date[2]day_month=[31,28,31,30,31,30,31,31,30,31,30,31]ifyear%400==0or(year%4==0andyear%100!=0):#判断是否为闰年day_month[1]=29ifmonth==1:print(day)else:print(sum(day_month[:month-1])+day)3.3.1for循环与while循环Python提供了两种基本的循环结构语句——while语句、for语句。while循环一般用于循环次数难以提前确定的情况,也可以用于循环次数确定的情况;for循环一般用于循环次数可以提前确定的情况,尤其是用于枚举序列或迭代对象中的元素;一般优先考虑使用for循环。相同或不同的循环结构之间都可以互相嵌套,实现更为复杂的逻辑。3.3.1for循环与while循环while表达式:循环体for取值in序列或迭代对象:循环体3.3.1for循环与while循环while循环和for循环都可以带else子句,当循环自然结束时(不是因为执行了break而结束)执行else结构中的语句。while表达式:循环体else:else子句for取值in序列或迭代对象:循环体else:else子句3.3.2循环结构的优化为了优化程序以获得更高的效率和运行速度,在编写循环语句时,应尽量减少循环内部不必要的计算,将与循环变量无关的代码尽可能地提取到循环之外。对于使用多重循环嵌套的情况,应尽量减少内层循环中不必要的计算,尽可能地向外提。3.3.2循环结构的优化importtimedigits=(1,2,3,4)start=time.time()foriinrange(1000):result=[]foriindigits:forjindigits:forkindigits:result.append(i*100+j*10+k)print(time.time()-start)print(result)start=time.time()foriinrange(1000):result=[]foriindigits:i=i*100forjindigits:j=j*10forkindigits:result.append(j+j+k)print(time.time()-start)print(result)3.3.2循环结构的优化另外,在循环中应尽量引用局部变量,因为局部变量的查询和访问速度比全局变量略块,在使用模块中的方法时,可以通过将其转换为局部变量来提高运行速度。例如下面的代码:importtimeimportmathstart=time.time()#获取当前时间foriinxrange(10000000):math.sin(i)print('TimeUsed:',time.time()-start)#输出所用时间loc_sin=math.sinstart=time.time()foriinxrange(10000000):loc_sin(i)print('TimeUsed:',time.time()-start)3.

1 / 44
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功