分支结构
迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家获得1000分,那么在完成本局游戏后,我们要根据玩家得到分数来决定究竟是进入第二关,还是告诉玩家“Game Over”,这里就会产生两个分支,而且这两个分支只有一个会被执行。类似的场景还有很多,我们将这种结构称之为“分支结构”或“选择结构”。给大家一分钟的时间,你应该可以想到至少5个以上这样的例子,赶紧试一试。
在Python中,要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的单词,像if和else就是专门用于构造分支结构的关键字,很显然你不能够使用它作为变量名(事实上,用作其他的标识符也是不可以)。下面的例子中演示了如何构造一个分支结构。
"""用户身份验证Version: 0.1Author: 骆昊"""username=input('请输入用户名:')password=input('请输入口令:')#如果希望输入口令时 终端中没有回显 可以使用getpass模块的getpass函数#import getpass#password = getpass.getpass('请输入口令: ')ifusername=='admin'andpassword=='123456':print('身份验证成功!')else:print('身份验证失败!')
唯一需要说明的是和C/C++、Java等语言不同,Python中没有用花括号来构造代码块而是使用了缩进的方式来设置代码的层次结构,如果if条件成立的情况下需要执行多条语句,只要保持多条语句具有相同的缩进就可以了,换句话说连续的代码如果又保持了相同的缩进那么它们属于同一个代码块,相当于是一个执行的整体。
当然如果要构造出更多的分支,可以使用if…elif…else…结构,例如下面的分段函数求值。
"""分段函数求值 3x - 5 (x > 1)f(x) = x + 2 (-1 <= x <= 1) 5x + 3 (x < -1)Version: 0.1Author: 骆昊"""x=float(input('x ='))ifx>1: y=3*x-5elifx>=-1: y=x+2else: y=5*x+3print('f(%.2f) =%.2f'%(x, y))
当然根据实际开发的需要,分支结构是可以嵌套的,例如判断是否通关以后还要根据你获得的宝物或者道具的数量对你的表现给出等级(比如点亮两颗或三颗星星),那么我们就需要在if的内部构造出一个新的分支结构,同理elif和else中也可以再构造新的分支,我们称之为嵌套的分支结构,也就是说上面的代码也可以写成下面的样子。
"""分段函数求值 3x - 5 (x > 1)f(x) = x + 2 (-1 <= x <= 1) 5x + 3 (x < -1)Version: 0.1Author: 骆昊"""x=float(input('x ='))ifx>1: y=3*x-5else:ifx>=-1: y=x+2else: y=5*x+3print('f(%.2f) =%.2f'%(x, y))
说明: 大家可以自己感受一下这两种写法到底是哪一种更好。在之前我们提到的Python之禅中有这么一句话“Flat is better than nested.”,之所以提倡代码“扁平化”是因为嵌套结构的嵌套层次多了之后会严重的影响代码的可读性,所以能使用扁平化的结构时就不要使用嵌套。
"""英制单位英寸和公制单位厘米互换Version: 0.1Author: 骆昊"""value=float(input('请输入长度:'))unit=input('请输入单位:')ifunit=='in'orunit=='英寸':print('%f英寸 =%f厘米'%(value, value*2.54))elifunit=='cm'orunit=='厘米':print('%f厘米 =%f英寸'%(value, value/2.54))else:print('请输入有效的单位')
"""掷骰子决定做什么事情Version: 0.1Author: 骆昊"""fromrandomimportrandintface=randint(1,6)ifface==1: result='唱首歌'elifface==2: result='跳个舞'elifface==3: result='学狗叫'elifface==4: result='做俯卧撑'elifface==5: result='念绕口令'else: result='讲冷笑话'print(result)
说明: 上面的代码中使用了random模块的randint函数生成指定范围的随机数来模拟掷骰子。
"""百分制成绩转等级制成绩90分以上 --> A80分~89分 --> B70分~79分 --> C60分~69分 --> D60分以下 --> EVersion: 0.1Author: 骆昊"""score=float(input('请输入成绩:'))ifscore>=90: grade='A'elifscore>=80: grade='B'elifscore>=70: grade='C'elifscore>=60: grade='D'else: grade='E'print('对应的等级是:', grade)
"""判断输入的边长能否构成三角形如果能则计算出三角形的周长和面积Version: 0.1Author: 骆昊"""importmatha=float(input('a ='))b=float(input('b ='))c=float(input('c ='))ifa+b>canda+c>bandb+c>a:print('周长:%f'%(a+b+c)) p=(a+b+c)/2area=math.sqrt(p*(p-a)*(p-b)*(p-c))print('面积:%f'%(area))else:print('不能构成三角形')
说明: 上面的代码中使用了math模块的sqrt函数来计算平方根。用边长计算三角形面积的公式叫做海伦公式。
"""输入月收入和五险一金计算个人所得税Version: 0.1Author: 骆昊"""salary=float(input('本月收入:'))insurance=float(input('五险一金:'))diff=salary-insurance-3500ifdiff<=0: rate=0deduction=0elifdiff<1500: rate=0.03deduction=0elifdiff<4500: rate=0.1deduction=105elifdiff<9000: rate=0.2deduction=555elifdiff<35000: rate=0.25deduction=1005elifdiff<55000: rate=0.3deduction=2755elifdiff<80000: rate=0.35deduction=5505else: rate=0.45deduction=13505tax=abs(diff*rate-deduction)print('个人所得税: ¥%.2f元'%tax)print('实际到手收入: ¥%.2f元'%(diff+3500-tax))
说明: 上面的代码中使用了Python内置的abs()函数取绝对值来处理-0的问题。
网友评论