一、顺序结构
顺序结构,就是程序按「从上到下」一行一行地执行,中间没有任何的条件判断和逻辑跳转。
二、if 分支结构
if 分支,重点在「条件判断」。
if 分支,需要使用 bool 表达式(其中会得到 bool 值,true 或 false )作为「分支条件」来进行控制分支。
在正式讲解 if 分支之前,我们来看个网上写程序员的搞笑段子:
老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”
当晚,程序员老公手捧一个包子进了家门……
老婆怒道:“你怎么就买了一个包子?”
老公答曰:“因为看到了卖西瓜的。”
好了,你们有没有笑出猪叫声 🐷 ?
如果没有的话,确实该好好学这一节内容了……学完后,你就能 get 到它的笑点了。
2.1 if 分支的三种方式
第一种:if…
语法格式:
if 条件判断 : 执行体
我们可以先这样简单地理解:
如果满足(条件): 就执行这里面的代码
这里的「条件判断」,会根据 bool 表达式返回的 bool 值,来决定是否执行下面的「执行体」。
如果返回的是 true 则执行下面的「执行体」,要是返回的是 false 就不会去执行。
执行体里,主要是写满足条件后需要执行的代码。
⚠️ 重点注意事项:
1)此处的代码一定要「缩进」,Python 根据缩进来判断,是否属于同一个「代码块」,但你也不能乱缩进;
2)不要忘记冒号,冒号表示后面是「代码块」,也是代码块的起始位置。
案例代码:
age = 19 if age > 18 : print('我可以去网吧啦!') print('我很开心~')
如果不注意缩进,就会出现问题,代码如下:
1)代码没有缩进,程序会报错
age = 19 if age > 18 : print('我可以去网吧啦!') # 程序会报错
2)执行出现错乱
age = 19 if age > 18 : print('我可以去网吧啦!') print('我很开心~') # 都不能去网吧了,还这么开心,骗谁呢~
3)冒号不见了,程序会报错
age = 19 # 条件后面没有冒号 if age > 18 print('我可以去网吧啦!') print('我很开心~')
第二种:if…else…
if 条件判断 : 执行体 else : 执行体
我们可以先这样简单地理解:
如果满足(条件): 就执行这里面的代码 否则: 就执行这里面的代码
else 是「否则」的意思。
案例代码:
age = 16 if age > 18 : print('我可以去网吧啦!') else : print('我还是乖乖在家看书吧……')
第三种:if…elif…else…
if 条件判断 : 执行体 elif 条件判断 : 执行体 ... else : 执行体
我们可以先这样简单地理解:
如果满足(条件): 就执行这里面的代码 或者满足(条件): 就执行这里面的代码 …… 否则: 就执行这里面的代码
elif 是「或者满足」的意思,把它拆解出来就是「else if」,对前面的 if 取反了,然后再去判断一个新的条件。
具体思路如下:
- 如果 if 的条件为 true,则执行它后面的执行体中的代码;
- 否则,就会依次去判断 elif 的条件;
- 如果某个 elif 的条件为 true,则执行它后面的执行体中的代码;
- ……(这里的 elif 可以有多个,视具体情况而定)
- 如果前面所有的条件都为 false,
- 那么只能执行 else 后面的执行体中的代码了。
所以,在这里,你还可以看出来,第二种形式和第三种形式是相通的。如果此处的 elif 不出现的话,刚好就变回前面的第二种,就是简单的「如果……否则……」逻辑形式,万变不离其宗。
if 后面显式指定了条件,我们后面 elif 也显式指定了条件,只有剩下的 else 是隐式条件 —— 就是对前面的所有条件取反了。
在学习这部分的时候,还要注意一个问题:我们可能很容易出现逻辑错误。
我先给大家演示一个「错误的案例」,俗称「有 BUG」,仅仅作为了解内容,不要求掌握。
案例代码:
age = 50 if age > 20 : print('青年人') elif age > 40 : print('中年人') elif age > 60 : print('老年人') else : print('可能还是个小 baby')
有没有发现上面的代码,有什么问题?
当执行程序之后,控制台打印出来的是:青年人,而实际上 50 岁的人,应该是中年人。
深层次的原因是,我们的 else 隐式条件冲突了,比如我们把上面的代码换成如下形式:
age = 50 if age > 20 : print('青年人') # elif age > 40 : # 拆解成 else if,对前面的 if 取反了,然后再去判断一个新的条件 # if age > 40 and not(age > 20) : # 甚至还可以进一步改成如下形式,这就尴尬了,完全不成立了,满足不了了 if age > 40 and age <= 20 print('中年人') # elif age > 60 : # 拆解成 else if,对前面的 if 取反了,然后再去判断一个新的条件 # if age > 60 and not(age > 20) and not(age > 40 and not(age > 20)) # 甚至还可以进一步改成如下形式,更尴尬了,也完全不成立了,永远满足不了了 if age > 60 && !(age > 20) && !(age > 40 && !(age > 20)) print('老年人')
正确合理的代码非常简单,就是注意它的「取值范围边界」就好了,具体如下:
age = 50 if age > 60 : print('老年人') elif age > 40 : print('中年人') elif age > 20 : print('青年人') else : print('可能还是个小 baby')
所以,以后我们应该先将包含范围更小的条件,优先放在前面来进行处理。
2.2 Assert 断言
在我们编写代码时,如果需要做出一些假设,可以使用「断言」在代码中捕捉这些假设。
断言像是一些布尔表达式,跟 if 分支类似,也可以看作是异常处理的一种高级形式,算是一种特殊的分支判断语句。
它可以帮助我们创建更稳定、品质更好且不易出错的代码。可以在任何时候启用和禁用断言验证,可以在测试时启用断言,而在部署时禁用断言。
案例代码:
age = 17 assert 20 < age < 80 print('你身体还挺棒的,继续工作赚钱吧')
三、循环结构
简单理解,有一件事情,被重复做了好多次。
循环,指的是在满足「循环条件」的情况下,会反复执行某些代码,也就是「循环体」。
当我们的需求得到实现时,需要在合适的时候将「循环条件」设置返回 false 来结束掉循环。
如果一个循环,无休止地在执行,它也叫「死循环」。
循环语句的核心组成部分:
【初始化语句】
用来完成一些初始化工作,比如说我要循环 10 次(从 0 开始,到 9 结束),它的初始值就是0;
【循环条件】:
使用 bool 表达式,当判断条件返回 True 时,则会启动循环,并执行下面的【循环执行体】
当返回 False 时,则不会循环;
【循环执行体】:
是我们想要去循环的主要内容,如果满足循环条件的话
则会重复执行这一代码块中的所有代码
【迭代语句】:
会在循环体执行完成之后,对循环条件取值之前进行执行
主要用来动态调整循环条件中变量的值,
需要在合适的时候将「循环条件」设置返回 false 来结束掉循环。
一般情况,我们会用到自加和自减:++ / –
3.1 while 循环
语法格式:
[初始值] while 循环条件 : 执行体 [迭代语句]
我们可以先这样简单地理解:
while 就是「当」的意思,我们会去判断,当满足某个「循环条件」的时候,则执行后面的「循环体」。
先给一个「初始值」 当满足(循环条件): 就执行这里面的代码 进行迭代,为下一次循环的条件做准备
案例代码:
# 初始化值 count = 0 # 判断 while count < 10: print('count:', count) # 迭代语句 count = count + 1
演示一个「死循环」,咱们改一下迭代语句,让 count - 1,这样它永远都会比 10 小,循环条件一直返回 true。就会一直执行下去,直到系统把它干掉为止。
案例代码:
# 初始化值 count = 0 # 判断 while count < 10: print('count:', count) # 迭代语句 # 这里的 count 值,永远会减 1,值永远比 10 小 count = count - 1
我们还可以使用 While 循环,来获取列表和元组中的元素。
在 while 循环中,通过改变变量的值(索引值),即可动态访问列表和元组的元素。
案例代码:
# 创建元组 mytuple = ('Python', 13.14, 520, 44, 55, 66, 77) # 初始值 count = 0 # 开始循环 # len(mytuple) 获取元组的长度 while count < len(mytuple): # 循环的过程中,count 的值不断叠加,刚好可以用来当索引值 print(mytuple[count]) # 迭代语句 count += 1
我们再来实现一个功能:将列表进行分类
条件1:整除 3 的所有元素,放在列表 list1 中;
条件2:除以 3 余 1 的所有元素,放在列表 list2 中;
条件3:除以 3 余 2 的所有元素,放在列表 list3 中;
案例代码:
# 创建列表 mylist = [10, 30, 40, 28, 38, 34, 5, 66, 43, 23, 41, 199, 123] # 创建空列表,用来存储分类后的元素 list1 = [] list2 = [] list3 = [] # 首先判断列表中是有元素的,才能往下玩 while len(mylist) > 0: # 通过 pop() 方法取出一个元素,用来做判断 ele = mylist.pop() # 整除 3 的 if ele % 3 == 0: list1.append(ele) # 除以 3 余 1 的 elif ele % 3 == 1: list2.append(ele) # 除以 3 余 2 的 # elif ele % 3 == 2: # 或者,直接来一个 else 就好 else: list3.append(ele) # 打印结果 print(list1) print(list2) print(list3)
3.2 for-in 循环
我们可以在某些指定的范围、列表、元组和字典等可迭代对象中去使用 for-in 循环来遍历元素。
遍历:就是一个个去访问。
语法格式:
for 变量 in 可迭代对象 : 循环体
我们可以先这样简单地理解:
for 是「为」的意思;
in 指「可迭代对象」,也就是根源数据是哪个的意思。
意思是,我们把从「可迭代对象」中循环遍历出来的元素,赋值给「变量」,并且可以放在「循环体」中进行使用。
for-in 循环中的变量,会在每次循环开始时就被自动赋值,所以我们不需要再给它赋值。
案例代码:
# 在指定的范围中,进行循环 for num in range(1, 10): print('Python -->', num)
我们还可以使用 for 循环,来获取列表和元组中的元素。
案例代码:
# 创建元组 mytuple = ('Python', 11, 22, 33, 44, 55) # 循环并打印获取到的元素 for ele in mytuple : print("元素:", ele)
我们来实现一个小问题:计算列表中所有数值元素的总和、平均值。
# 创建列表 mylist = [10, 30, 40.23, 28, 23.38, 34, 'python', 'a', 41, 199, 123] # 用来保存总和 mysum = 0 # 用来统计个数 # 平均值 = mysum / mycount mycount = 0 # 循环 for ele in mylist : # 判断所取出来的到底是整数,还是浮点数 if isinstance(ele, int) or isinstance(ele, float): print(ele) # 计算总和 mysum = mysum + ele # 统计个数 mycount = mycount + 1 # 打印结果 print('总和 = ', mysum) print('平均值 = ', mysum / mycount)
接着,我们继续使用 for 循环来遍历字典。
有三个常用方法:
items():获取字典中所有 key-value 的列表;
keys():获取字典中所有的 key 的列表;
values():获取字典中所有的 vlaue 的列表;
案例代码:
# key:value mydict = {'Chinese':70, 'Math':50, 'English':77} # 使用 items() 方法 # 分别获取其中的 key 和 value for key,value in mydict.items(): print('key:', key) print('value:', value) # 使用 keys() 方法 for key in mydict.keys(): print(key) # 使用 values() 方法 for value in mydict.values(): print(value)
3.3 循环中使用 else
当循环条件为 false 的时候,就会去执行 else 的代码块。
我们先来看 while 循环中的 else 的使用方式。
案例代码:
num = 0 while num < 10 : print('num 的值:', num) num += 1 else : print('循环结束了,num 最后的值:', num)
再来看看 for 循环中的 else 的使用方式。
案例代码:
mylist = ['Python', 13.14, 520, 666] for ele in mylist : print('获取到的元素:', ele) else : # 会保存最后一个元素的值 print('else 处的元素:', ele)