《Python程序设计》课件第3章-选择与循环_第1页
《Python程序设计》课件第3章-选择与循环_第2页
《Python程序设计》课件第3章-选择与循环_第3页
《Python程序设计》课件第3章-选择与循环_第4页
《Python程序设计》课件第3章-选择与循环_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第3章选择与循环条件表达式选择和循环语句的执行离不开对条件的判断条件表达式算术运算符:+、-、*、/、//、%、**关系运算符:>、<、==、<=、>=、!=,可以连续使用:测试运算符:in、notin、is、isnot逻辑运算符:and、or、not,注意短路求值位运算符:~、&、|、^、<<、>>不要再使用

“不等于”运算符<>Python2支持<>运算符,表示不等于,相当于!=而Python3不再支持<>,只有!=运算符“==”vs.运算符“is”“==”测试值的相等性。Python运行相等测试,递归地比较所有内嵌对象“is”测试对象的一致性。Python测试二者是否是同一对象(即是否在同一内存地址中)运算符“==”vs.运算符“is”但是,由于Python内部“缓存复用”小的整数和字符串以期提高性能,当对象是“短”字符串时:这是因为在Python内部,暂时存储并重复使用短字符串以优化性能。实际上内存里只有一个字符串“spam”供变量a和变量b分享当使用长一些的字符串时,情况就符合预期:题外话:integercache注意观察右图。这是由于Python内部缓存部分小值整数(-5至256范围内),而对更复杂的数据结构(比如内置的列表、元组,以及用户定义的类),都没有这种缓存机制。==测试值的相等性,is运算符测试内存中对象的一致性,所以有右图中的结果具体请见:/questions/15171695/whats-with-the-integer-cache-inside-pythonTruevs.False在Python中,与大多数程序设计语言一样,整数0代表假(False),整数1代表真(True)除此之外,Python也把任意的空数据结构视为假,把任意非空的数据结构视为真在选择和循环结构中,条件表达式的值只要不是False、0(或0.0、0j等)、None、空列表、空元组、空集合、空字典、空字符串、空range对象或其他空迭代对象,Python解释器均认为与True等价从这个意义上来讲,几乎所有的Python合法表达式都可以作为条件表达式,包括含有函数调用的表达式条件表达式>>>if3:#使用整数作为条件表达式print55>>>a=[1,2,3]>>>ifa:#使用列表作为条件表达式printa [1,2,3]>>>a=[]>>>ifa:printaelse:print'empty'empty短路求值比较特殊的运算符还有逻辑运算符and和or,这两个运算符具有短路求值或惰性求值的特点,即只计算必须计算的表达式的值以and为例,对于表达式“表达式1and表达式2”而言,如果“表达式1”的值为False或其他等价值,不论“表达式2”的值是什么,整个表达式的值都是False,此时“表达式2”的值无论是什么都不影响整个表达式的值,因此将不会被计算,从而减少不必要的计算和判断在设计条件表达式时,当表示复杂条件时如果能够巧妙利用逻辑运算符and和or的短路求值特性,可以提高程序的运行效率,减少不必要的计算与判断选择结构选择结构通过判断某些特定条件是否满足来决定下一步的执行流程单分支选择结构双分支选择结构多分枝选择结构嵌套的选择结构单分支选择结构iftest:statement双分支选择结构iftest:statement1else:statement2多分支选择结构iftest1:statement1eliftest2:statement2eliftest3:statement3else:statement4嵌套的选择结构iftest1:statement1

iftest2: statement2

else: statement3eliftest4:statement4else:statement5双分支选择结构的特殊写法Python还支持如下形式的表达式:当条件表达式test的值与True等价时,表达式的值为statement1,否则表达式的值为statement2statement1iftestelsestatement2Python没有switch语句下面的代码演示了利用多分支选择结构将成绩从百分制变换到等级制/questions/46701063/why-doesnt-python-have-switch-casedef

score_to_grade(score):

ifscore>

100:

return

'Invalidscore.score>100'

elifscore>=

90:

return

'A'

elifscore>=

80:

return

'B'

elifscore>=

70:

return

'C'

elifscore>=

60:

return

'D'

elifscore>=

0:

return

'E'

else:

return

'Invalidscore.score<0'while循环与for循环Python提供了两种基本的循环结构语句——while语句、for语句while循环一般用于循环次数难以提前确定的情况,当然它也可以用于循环次数确定的情况for循环一般用于循环次数可以提前确定的情况,尤其是用于枚举序列或迭代对象中的元素相同或不同的循环结构之间都可以互相嵌套,实现更为复杂的逻辑while循环whiletest:statementwhile循环whiletest:statement1else:statement2while循环在Python中,while循环和for循环都可以带else块如果循环因为条件表达式不成立而自然结束(不是因为执行了break语句而结束),则执行else结构中的语句如果循环是因为执行了break语句而导致循环提前结束,则不执行else中的语句whiletest1:statement1

iftest2:

break

#Exitloopnow,skip"else"below

iftest3:

continue

#Gototopofloopnow,totest1statement2else:statement3#Runifwedidn'thita"break"while循环和for循环的else块只有当循环正常离开时才会被执行。换句话说,只有在至始至终没有触发break语句的情况下才会被执行while循环要else有何用?else分句让你捕捉循环的“另一条”出路,而不需要设定和检查标志位(flag)假设你要写一个循环用于搜索列表的值,而且需要知道在离开循环后该值是否已经被找到found=

Falsewhilexand

notfound:

ifmatch(x[0]):

print

'gotit!' found=

True

else:x=x[1:]if

notfound:

print

'notfound!!!'whilex:

ifmatch(x[0]):

print

'gotit!'

breakx=x[1:]else:

print

'notfound!!!'循环结构的优化为了优化程序以获得更高的效率和运行速度,在编写循环语句时,应尽量减少循环内部不必要的计算,将与循环变量无关的代码尽可能地提取到循环之外对于使用多重循环嵌套的情况,应尽量减少内层循环中不必要的计算,尽可能地向外提break和continue语句break语句在while循环和for循环中都可以使用一旦break语句被执行,将使整个循环提前结束continue语句的作用是终止当前循环,并忽略continue之后的语句,然后回到循环的顶端,提前进入下一次循环pass语句什么事也不做,只是起占位作用break和continue语句下面的代码用来计算小于100的最大素数(素数是只能被1或者自己整除的自然数),请注意break语句和else子句的用法输出:97forninrange(100,

1,

-1):

foriinrange(2,n):

ifn%i==

0:

break

else:

printn

breakbreak和continue语句删除上面代码中最后一个break语句,则可以用来输出100以内的所有素数输出:9789837973716761595347434137312923191713117532forninrange(100,

1,

-1):

foriinrange(2,n):

ifn%i==

0:

break

else:

printnbreak和continue语句编写循环结构代码时,需要警惕对continue语句执行流程考虑不全面所产生的问题例如,为了输出10以内的奇数:左边代码的错误是:一旦执行continue语句,之后的“i+=1”将永远不再执行,使得循环无法结束i=

1whilei<

10:

ifi%

2==0:

continue

print

ii+=1i=

0whilei<

10:i+=1

ifi%

2

==

0:

continue

printi番外:再谈“引用”和“拷贝”正如前面讲到过的,赋值操作生成对象的引用,而不是这个对象的拷贝在实际应用中,“引用”往往就是你想要的(因为这使你可以在程序范围内任意传递“大型对象”而不必付出“拷贝”带来的额外性能开销)不过,因为赋值操作会产生相同对象的多个引用,你要清楚地意识到在原处修改可变对象时可能会影响程序中其它地方对相同对象的其它引用。例如:如果你不想要“引用”…你就要明确告诉Python:我要对这个象进行‘拷贝’!“拷贝”实际上复制了该对象,从而避免了对象共享如果你的确需要“拷贝”,明确的说出来:列表的没有限制条件的分片表达式(L[:])能复制列表字典、集合对象的copy方法(X.copy())能复制字典、集合有些内置函数(如list())能生成拷贝(list(L))copy标准库模块能够进行拷贝但是,列表的[:]操作及字典的copy()方法只能做顶层复制…如果你需要一个深层嵌套的数据结构的完整的、完全独立的拷贝,那么你需要使用copy标准库模块:importcopycopied_x=copy.deepcopy(original_x)上述语句能够递归地遍历对象original_x来复制其所有的组成部分copy—shallowanddeepcopyoperations/2/library/copy.html/3/library/copy.htmlAssignmentstatementsinPythondonotcopyobjects,theycreatebindingsbetweenatargetandanobject.Forcollectionsthataremutableorcontainmutableitems,acopyissometimesneededsoonecanchangeonecopywithoutchangingtheother.Thismoduleprovidesgenericshallowanddeepcopyoperations:copy.copy(x)Returnashallowcopyofx.copy.deepcopy(x)Returnadeepcopyofx.shallowcopyvs.deepcopyThedifferencebetweenshallowcopyanddeepcopyisonlyrelevantforcompoundobjects(objectsthatcontainotherobjects,likelistsorclassinstances):Ashallowcopyconstructsanewcompoundobjectandthen(totheextentpossible)insertsreferencesintoittotheobjectsfoundintheoriginal.Adeepcopyconstructsanewcompoundobjectandthen,recursively,insertscopiesinto

温馨提示

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

最新文档

评论

0/150

提交评论