04>>>流程控制
04.流程控制
接下来要将的是流程控制的概念。
流程控制(重点)
什么是流程控制?流程控制就是控制执行的流程。
流程主要分为三种:
1.顺序结构
代码从上往下依次执行(截止目前为止我们所写的代码都是顺序结构)。
2.分支结构
根据条件的不同执行不同的流程。
3.循环结构
根据条件循环往复的执行某一个过程。
代码的从属关系
在python中,通过代码的缩进来表示代码的从属关系。如果上面的代码没有缩进,但下面的代码缩进了:那么表示下面的代码属于上面的代码。
属于同一个关键字的多行子代码必须要保持相同的缩进量。python中缩进一般推荐使用四个空格(按一下tab键即可)。
小技巧:当某一行代码的结尾出现了冒号 那么下一行代码必缩进。
在python中并不是所有的代码都可以拥有子代码,现在我们就来学习第一个拥有子代码的语句。
if
分支结构
现在一位美女向你走来,你想要的和她搭讪,应该怎么做?
想要和人家交流,第一步当然是要和人家打招呼啦。那么应该怎么称呼对方呢?
如果美女看起来和你差不多大,你可以叫她“小姐姐”;如果是个保养良好的少妇,你可以叫她大……阿姨。
当然本文不是泡妞宝典,并不能指导各位变成情圣。只是以这个假设作为切入点,来研究研究用python语言如何实现对不同人采用不同的称呼。
现在我们假定判断称呼小姐姐还是阿姨的分水岭是年龄28岁,那么大于28岁就该叫“阿姨”,不大于28岁的叫“小姐姐”。
# 如果年龄大于28岁,叫阿姨 age = 29 if age > 28: print('阿姨好') # 如果年龄不大于28岁,叫小姐姐 age = 18 if not age > 28: print('小姐姐好')
这里就可以看出if判断的语法结构:
if 条件: 条件成立之后执行的子代码
小练习
1.让使用者输入用户名,如果用户名叫做joe,那就显示“欢迎joe”
username = input('username>>>:') # 将用户输入的用户名设为变量username if username == 'joe': # 如果变量username等同于字符串joe print('欢迎joe') # 打印欢迎joe
2.如果年龄大于28岁,叫阿姨,否则叫小姐姐。
age = 38 if age > 28: print('阿姨好') else: print('小姐姐好')
多条件判断
在第二题中我们看到了一个不认识的字眼:else。
else也是if判断中配套使用的关键字。else英文原意是“其他的,别的”,顾名思义,如果在程序中给出的结果不满足if的条件,那么就执行else的操作。
if 条件: 条件成立执行的子代码 else: 条件不成立执行的子代码
这样一来,我们可以在一个程序中同时插入满足条件和不满足条件的两种结果了。
但是在许多场合下,两种结局还不够多。
现在我们回到了学校,帮助老师开发一个记录学生成绩的程序,其中对学生们的成绩做了分级:
# 如果成绩大于90分,那么属于“优秀” # 如果成绩大于80分但小于90分,那么属于“良好” # 如果成绩大于70分但小于80分,那么属于“普通” # 如果成绩大于60分但是小于70分,那么属于“及格” # 如果成绩小于60分,那么属于“挂科”
一共五个等级,只靠if和else还是不够用,是时候邀请新成员了。有请elif上场。
if 条件1: 条件1成立执行的代码 elif 条件2: 条件1不成立条件2成立执行的代码 elif 条件3: 条件1和2都不成立条件3成立执行的代码 else: 上述条件都不成立执行的代码
可以看到:中间的elif可以有多个,但if和else都只有一个。
注意:在一段逻辑判断中if和else只能有一个。
那么怎么判断程序最后的走向呢?
小技巧:在if、elif、else连用时肯定只会走一个路线,其他的肯定不走。
回到成绩分级的程序中,可以这样写:
score = 50 if score >= 90: print('优秀') elif score >= 80: print('良好') elif score >= 70: print('普通') elif score >= 60: print('及格') else: print('挂科')
if嵌套
现在一位小姐姐向你走来,你上前和她搭讪,成功之后你们互加微信,当面又相谈甚欢,于是到了晚上你们一起吃饭、看电影,甚至还……
我们来屡一下思路,复盘一下如果小姐姐不想跟你说话,或者向你走来的是一位大……阿姨,你这一天又会迎来什么样的发展?
# 如果年龄大于28岁,叫阿姨;否则跟小姐姐要微信 # 要么成功要么失败 is_success = True age = 18 if age < 28: print('小姐姐 加个微信呗') if is_success: print('吃饭 看电影 天黑了~~~') else: print('去你妹的 臭流氓!') else: print('不好意思看错人了!')
这个场景中运用到了if嵌套,结合最开始代码从属关系的判断来看,程序里一共有三个从属级别。最开头的if是一级主代码,下面缩进的if和else是二级子代码,在它们下方的print则是三级子代码,形成了父>子>孙的从属关系。
通过代码的互相嵌套,我们就可以写出判断更繁杂结果更多样的程序来了。
循环结构之while循环
现在要实现一个简单的用户登录程序,只要求用户输入后能够显示输入的用户名和密码,并且无需其他操作,可以直接让下一位用户接着输入用户名和密码。
这里就需要用到while循环了。
while True: # 当条件为真时开启循环 username = input('username>>>:') # 将输入用户名定义为变量username password = input('password>>>:') # 将输入的密码定义为变量password print(username, password) # 打印username和password
在pycharm中运行这个程序,可以无节制地不停输入用户名和密码,直到你电脑的内存被这一个程序全部占用或者你主动按下停止按钮才会告终。
这是和while循环本身的结构有关的,那么我们先来看看它的语法结构:
while 条件: 条件成立之后执行的循环体代码
语法是知道了,但是它是怎么运作的呢?
原理
1.首先判断条件是否成立
2.如果条件成立,执行while循环体代码,代码执行完毕之后继续判断条件是否成立
3.如果条件还成立,则继续执行while循环体代码,代码执行完毕之后继续判断条件是否成立
4.重复执行步骤2和3直到条件不成立为止
现在回头来分析开头的循环获取用户名密码程序:while循环的开启条件为True,在判断到while后面的True是True之后便执行循环。循环完毕后回到程序开头继续判断开启条件,True依然是True,所以循环再度继续。再判断,再继续……反反复复无穷无尽,直到内存被塞爆为止。
所以while True打头的循环就是死循环。
小练习
1.利用while循环打印1~10。
count = 1 # 定义一个变量count,值为1 while count < 11: # 当count小于11时进行循环 print(count) # 打印count count += 1 # count的值+1
思路:
①定义一个变量count,值为1。
②首先判断条件是否成立:count小于11。
③如果条件成立,循环体中的代码:打印count,随后让count的变量值+1。
④循环体代码运行完毕后结束本次循环,回到②重新开始循环判断。
⑤当最后②的条件不满足之后,循环彻底结束。
2.利用while循环打印1-10,但是排除7。
count = 1 # 定义一个变量count,值为1 # 判断count是否等于7,如果等于则不打印 while count < 11: # 当count小于11时进行循环 if count == 7: # 如果count的值为7 # 结束本次循环,开始下一次循环 count += 1 # count的值+1 continue # 跳过本次循环返回循环体的条件判断处重新判断 print(count) # 打印count count += 1 # count的值+1
3.利用while循环打印1~10,但是到7之后直接结束循环。
count = 1 # 定义一个变量count,值为1 while count < 11: # 当count小于11时进行循环 # 判断count是否等于7 如果等于则结束循环 if count == 7: # 如果count的值为7 break # 直接结束本层循环 print(count) # 打印count count += 1 # count的值+1
break和continue
上面的练习3中出现了两个新的关键字:break和continue。
break和continue可以用来打断循环。
break会打断整个循环,相当于按下了停止按钮。
continue则是跳过本次循环,直接回到循环开头开始下一次循环,相当于按下了快进。
小练习
利用while循环打印1~10,但是到7时要求用户输入命令,如果命令为q,则继续打印数字,否则一直要求输入命令。
count = 1 # 定义一个变量count,值为1 while count < 11: # 当count小于11时进行循环 # 判断count是否等于7 如果等于则结束循环 if count == 7: # 如果count的值为7 while True: # 进入死循环 cmd = input('cmd>>>:') # 定义一个变量cmd,值由用户输入 print(cmd) # 打印cmd if cmd == 'q': # 如果cmd的值为q break # 结束本层循环 print(count) # 打印count count += 1 # count的值+1
思路:
我们可以逐条分析循环结构的运作逻辑。
第一层循环
最开始定义“count = 1”可以看做是第0条,它本身不参与while循环,可以将将while循环的开始语句看做循环结构的第1条代码。
python读取到1时,便开始判断当前的count是否小于11。如果小于11,读取2。大于11则不满足条件,程序结束。
读取2时,判断当前count是否等于7。如果不等于7,则进入3a。如果等于7,则进入3b开始第二层循环。我们先来看3a。
3a打印出当前变量count的值,随后进入4。
4让变量count+1,随后返回到1重新判断循环条件。
这第一层循环非常简单,根据下图中蓝色的轨迹很容易就能看懂。本题的重点在于第二层循环。
第二层循环
现在来看第二层循环,回到代码2。这次循环过程可以看黄色的轨迹。
如果count的数字等于7,那么python就读取3b开始第二层循环。while True在前文分析过了,就是死循环的意思。
3b1要求用户输入一个新的值,并定义为变量cmd。
随后的3b2打印出用户的值。
接下来的3b3会判断用户输入的数据。如果用户输入的cmd不等于字符串“q”的话,那么循环就继续,回到3b重新开始第二层循环。
只有在用户输入了q之后,才会触发3b4打断第二层循环。之后程序的逻辑顺着绿色的轨迹执行3a,之后是4,然后回归到1重新判断第一层循环……
注意:break和continue只能影响所在层的while。所以在使用这两个关键字是需要注意它们的从属关系。
循环结构之for循环
接下来了解一下另一种循环结构——for循环。
程序员已经定义了while循环,为什么还要重复造轮子发明另一种循环结构呢?
for循环能够实现的事情while循环都可以实现,但是for循环在很多时候语法更加简单快捷。
按照老样子,通过一道例题来讲解。
name_list = ['joe','simon','frank','jerry'] 求:循环打印列表中每一个元素
我们先用已经讲解过的的while循环来写出方案。
# while循环 count = 0 # 定义一个变量count,值为0 while count < 4: #当count小于4时进行循环 print('>>>:',name_list[count]) # 打印name_list,序号等于count的值 count += 1 # count的值+1
接下来有请for循环登台表演:
for name in name_list: print('>>>:', name)
只用两行代码就完事了,非常有效率。for循环的特色就是特别擅长应用在循环取值方面。
for循环的原理是依次获取可迭代对象里的每一个元素并赋值给变量。
那么我们也就能总结出for循环的语法结构了。
for 变量名 in 可迭代对象(字符串、列表、字典、元组): for循环体代码
for循环不需要添加结束条件,会随着取值的完毕自动结束。
字符串也可以取值?取出来会是啥样呢?
res = 'hello world!' for i in res: # 当值没有明确的类别时 变量名可以取i、j、k、item等 print(i)
for循环字符串会将字符串里面单个单个字符依次赋值给变量名i。还可以注意到:字符串中的空格也会被取值。
那如果是字典呢?
user_dict = {'username': 'joe', 'password': 111, 'hobby': 'read'} for k in user_dict: print(k)
for循环字典只会取出字典的key,value是无法直接获取的。
容器类型
内部能够存档多个元素的数据类型都可以称之为容器类型。
例如:列表、字典、元组、集合……
for循环针对容器类型都可以循环取值,并在此基础之上还可以对字符串取值。
range用法
现在我想用for循环来循环打印1到100,该怎么做?要一个数字一个数字写吗?
当然不用那么麻烦,设定一个迭代器就好了。
for i in range(0, 101): print(i)
这个“range(0,101)”本质是一个迭代器,可以简单的看成是一个由0~100的数字组成的列表。
1.循环打印1~4
for i in range(5): # 一个参数,默认从0开始(顾头不顾尾) print(i)
2.循环打印5~9
for i in range(5,10): # 两个参数,第一个是起始位包含在内,第二个是终止位不包含(顾头不顾尾) print(i)
3.循环打印0~250中相隔25的数字
for i in range(0,250,25): # 三个参数,最后一个是数字间隔,类似于产生等差序列(还是顾头不顾尾) print(i)