Python基础篇(四)-- 流程控制
做任何事都要遵循一定的原则,程序设计也是如此,需要利用流程控制实现与用户的交流,并根据用户的需求决定程序“做什么”,“怎么做”。流程控制对于任何一门编程语言来说都是至关重要,它提供了控制程序如何执行的方法。按照执行流程划分,Python
程序也可分为 3 大结构,即顺序结构、选择(分支)结构和循环结构。
1 程序结构
1.1 顺序结构
我们看到的代码都是顺序执行的,也就是先执行第1条语句,然后是第2条、第3条……一直到最后一条语句,这称为顺序结构。顺序结构就是让程序按照从头到尾的顺序依次执行每一条Python
代码,不重复执行任何代码,也不跳过任何代码。
1.2 选择结构
在Python
中,可以使用if……else……
语句对条件进行判断,然后根据不同的结果执行不同的代码,这称为选择结构或者分支结构。
Python
中的if……else……
语句可以细分为三种形式,分别是if
语句、if……else……
语句和if……elif……else
语句,它们的语法和执行流程如表1所示。
语法格式 | if 表达式: 代码块 | if 表达式: 代码块 1 else: 代码块 2 | if 表达式 1: 代码块 1 elif 表达式 2: 代码块 2 …… else: 代码块 n |
执行流程 |
Python
中,if
语句、if……else……
语句和if……elif……else
语句之间可以相互嵌套。因此,在开发程序时,需要根据场景需要,选择合适的嵌套方案。需要注意的是,在相互嵌套时,一定要严格遵守不同级别代码块的缩进规范。
温馨提示:
- “表达式”可以是一个单一的值或者变量,也可以是由运算符组成的复杂语句,形式不限,只要它能得到一个值就行。不管“表达式”的结果是什么类型,
if……else……
都能判断它是否成立(真或者假)。 - 每个条件后面要使用冒号
:
,表示接下来是满足条件后要执行的语句块。 - 使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。
- 在Python中没有
switch – case
语句。
1.3 循环结构
循环有两种:
- 一直重复,直到条件不满足时才结束的循环,称为条件循环。
while
循环 - 重复一定次数的循环,称为计次循环。
for
循环
1. while循环
while
语句执行的具体流程为:首先判断条件表达式的值,其值为真(True)时,则执行代码块中的语句,当执行完毕后,再回过头来重新判断条件表达式的值是否为真,若仍为真,则继续重新执行代码块……如此循环,直到条件表达式的值为假(False),才终止循环。while
循环结构的执行流程如下图所示。
温馨提示: (1)代码块注意冒号和缩进(通常缩进 4 个空格),否则Python
解释器会报SyntaxError
错误(语法错误)。(2)在使用while
循环时,一定要保证循环条件有变成假的时候,否则这个循环将成为一个死循环。所谓死循环,指的是无法结束循环的循环结构。(3)在Python
中没有do...while
循环。
2. for循环
for
循环,它常用于遍历字符串、列表、元组、字典、集合等序列类型,逐个获取序列中的各个元素。执行流程如下图所示。
for
循环的语法格式如下:
for 迭代变量 in 字符串|列表|元组|字典|集合:
代码块
(1)数值循环
在使用 for
循环时,最基本的应用就是进行数值循环。比如说,想要实现从 1 到 100 的累加,可以执行如下代码:
# -*- coding:utf-8 -*-
print("计算1+2+...+100的结果为:", end="")
# 保存累加结果的变量
result = 0
# 逐个获取从1到100这些值,并做累加操作
for i in range(101):
result += i
print(result)
运行结果为:计算1+2+…+100的结果为:5050
(2)遍历列表和元组
当用for
循环遍历list
列表或者tuple
元组时,其迭代变量会先后被赋值为列表或元组中的每个元素并执行一次循环体。
# -*- coding:utf-8 -*-
my_list = [1, 2, 3, 4, 5]
for ele in my_list:
print("ele=", ele)
程序运行结果为: ele= 1 ele= 2 ele= 3 ele= 4 ele= 5
使用内置enumerate
函数进行遍历,可以得到元素对应的索引,语法格式如下:
for index,item in enumerate(list):
print(index, item)
(3)遍历字典
在使用for
循环遍历字典时,经常会用到和字典相关的 3 个方法,即items()
、keys()
以及 values()
,它们各自的用法可以参考 字典元素访问。当然,如果使用 for
循环直接遍历字典,则迭代变量会被先后赋值为每个键值对中的键。
# -*- coding:utf-8 -*-
my_dict = {'A': 65, 'B': 66, 'C': 67}
# 直接遍历字典,和遍历字典 keys() 方法的返回值是相同的
for ele in my_dict:
print('ele1=', ele)
for ele in my_dict.values():
print("ele2=", ele)
for ele in my_dict.items():
print("ele3=", ele)
程序运行结果为:ele1= A ele1= B ele1= C
ele2= 65 ele2= 66 ele2= 67
ele3= (‘A’, 65) ele3= (‘B’, 66) ele3= (‘C’, 67)
补充: 在
Python
中,无论是while
循环还是for
循环,其后都可以紧跟着一个else
代码块,它的作用是当循环条件为False
跳出循环时,程序会最先执行else
代码块中的代码。
3. 循环嵌套
Python
不仅支持if
语句相互嵌套,while
和for
循环结构也支持嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如for
里面还有for
,while
里面还有while
,甚至while
中有for
或者for
中有while
也都是允许的。
当 2 个(甚至多个)循环结构相互嵌套时,位于外层的循环结构常简称为外层循环或外循环,位于内层的循环结构常简称为内层循环或内循环。
循环嵌套结构的代码,Python
解释器执行的流程为:
- 当外层循环条件为
True
时,则执行外层循环结构中的循环体; - 外层循环体中包含了普通程序和内循环,当内层循环的循环条件为
True
时会执行此循环中的循环体,直到内层循环条件为False
,跳出内循环; - 如果此时外层循环的条件仍为
True
,则返回第 2 步,继续执行外层循环体,直到外层循环的循环条件为False
; - 当内层循环的循环条件为
False
,且外层循环的循环条件也为False
,则整个嵌套循环才算执行完毕。
循环嵌套的执行流程图如图 3 所示:
嵌套循环执行的总次数 = 外循环执行次数 * 内循环执行次数
2 其他语句
在实际开发中,有时候我们会先搭建起程序的整体逻辑结构,但是暂时不去实现某些细节,而是在这些地方加一些注释,方面以后再添加代码,但是Python
提供了一种更加专业的做法,就是空语句pass
。pass
语句,表示空语句。它不做任何事情,一般起到占位作用。使用pass
语句比使用注释更加优雅。
1. assert
断言函数
assert
语句,又称断言语句,可以看做是功能缩小版的if
语句,它用于判断某个表达式的值,如果值为真,则程序可以继续往下执行;反之,Python
解释器会报AssertionError
错误。语法格式为:
assert 表达式
assert
会令程序崩溃,为什么还要使用它呢?这是因为,与其让程序在晚些时候崩溃,不如在错误条件出现时,就直接让程序崩溃,这有利于我们对程序排错,提高程序的健壮性。常用于检查用户的输入是否符合规定,还经常用作程序初期测试和调试过程中的辅助工具。
2. break用法
break
语句可以立即终止当前循环的执行,跳出当前所在的循环结构。无论是while
循环还是for
循环,只要执行 break
语句,就会直接结束当前正在执行的循环体。
# -*- coding:utf-8 -*-
new_str = "Python,Java,Go"
for ele in new_str:
if ele == ',':
# 终止循环
break
print(ele, end="")
print("\n执行循环体外的代码")
运行结果为:Python
执行循环体外的代码
break
语句一般会结合if
语句进行搭配使用,表示在某种条件下,跳出循环。如果使用嵌套循环,break
语句将跳出最内层的循环。
for
循环后也可以配备一个 else
语句。这种情况下,如果使用 break
语句跳出循环体,不会执行 else
中包含的代码。
# -*- coding:utf-8 -*-
new_str = "Python,Java,Go"
for ele in new_str:
if ele == ',':
# 终止循环
break
print(ele, end="")
else:
print("执行else语句中的代码")
print("\n执行循环体外的代码")
运行结果为:Python
执行循环体外的代码
从输出结果可以看出,使用 break
跳出当前循环体之后,该循环后的 else
代码块也不会被执行。但是,如果将 else
代码块中的代码直接放在循环体的后面,则该部分代码将会被执行。
另外,对于嵌套的循环结构来说,break
语句只会终止所在循环体的执行,而不会作用于所有的循环体。举个例子:
# -*- coding:utf-8 -*-
new_str = "Python,Java,Go"
for i in range(3):
for j in new_str:
if j == ",":
break
print(j, end="")
print("\n跳出内循环")
运行结果为:
Python
跳出内循环
Python
跳出内循环
Python
跳出内循环
分析上面程序,每当执行内层循环时,只要循环至 new_str
字符串中的逗号( , )就会执行 break
语句,它会立即停止执行当前所在的内存循环体,转而继续执行外层循环。
在嵌套循环结构中,如何同时跳出内层循环和外层循环呢?最简单的方法就是借用一个 bool
类型的变量。
new_str = "Python,Java,Go"
flag = False
for i in range(3):
for j in new_str:
if j == ",":
# 在break前,修改flag的值
flag = True
break
print(j, end="")
print("\n跳出内循环")
if flag == True:
print("跳出外层循环")
break
输出结果为:
Python
跳出内循环
跳出外层循环
可以看到,通过借助一个 bool
类型的变量 flag
,在跳出内循环时更改 flag
的值,同时在外层循环体中,判断 flag
的值是否发生改动,如有改动,则再次执行 break
跳出外层循环;反之,则继续执行外层循环。
3. continue用法
continue
语句只会终止执行本次循环中剩下的代码,直接从下一次循环继续执行。
m0_59760635: 博客背景好可爱,内容也格式很舒服,赞一个。
Reverse fate: 终于解决了控制无刷的震动问题,原因是pwm的频率不对导致无刷电机旋转时震动大还会导致发热,原本频率太低现在17.8khz实现静音低速旋转,感谢博主的文章
又错哪了: 网站寄了
dandellion_: 1.7 转义字符那里,不转义也是对的,字符集合内的元字符不用转义的
lann*: 数据分组 MTU=1400,分组出的数据长度1420了,不对吧