Python 流程控制

简介: Python 流程控制

一、顺序结构

顺序结构,就是程序按「从上到下」一行一行地执行,中间没有任何的条件判断和逻辑跳转。

二、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 取反了,然后再去判断一个新的条件。

具体思路如下:

  1. 如果 if 的条件为 true,则执行它后面的执行体中的代码;
  2. 否则,就会依次去判断 elif 的条件;
  3. 如果某个 elif 的条件为 true,则执行它后面的执行体中的代码;
  4. ……(这里的 elif 可以有多个,视具体情况而定)
  5. 如果前面所有的条件都为 false,
  6. 那么只能执行 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)


目录
相关文章
|
2月前
|
数据采集 数据可视化 大数据
Python在数据科学中的实际应用:从数据清洗到可视化的全流程解析
Python在数据科学中的实际应用:从数据清洗到可视化的全流程解析
38 1
|
2月前
|
测试技术 API 数据处理
Python办公自动化:解锁高效工作流程,掌握文档处理的艺术
Python办公自动化:解锁高效工作流程,掌握文档处理的艺术
85 1
|
4月前
|
存储 小程序 Shell
Python 自动化指南(繁琐工作自动化)第二版:二、流程控制
Python 自动化指南(繁琐工作自动化)第二版:二、流程控制
40 0
|
5月前
|
人工智能 Java Python
python入门(三) 基础用法变量+数据类型+流程控制
python入门(三) 基础用法变量+数据类型+流程控制
|
13天前
|
Python
Python流程控制
Python流程控制
|
24天前
|
存储 Python
python基础篇: python中的流程控制,你都了解吗?
python基础篇: python中的流程控制,你都了解吗?
21 3
|
2月前
|
算法 开发者 C++
【Python 基础扫盲 跳转方式】一文带你了解Python常见的流程控制和跳转方式
【Python 基础扫盲 跳转方式】一文带你了解Python常见的流程控制和跳转方式
26 0
|
2月前
|
程序员 Python
Python中的流程控制
Python中的流程控制
20 0
Python中的流程控制
|
3月前
|
机器学习/深度学习 数据处理 算法框架/工具
Python 与机器学习:构建高效数据处理流程
在当今信息爆炸的时代,大数据处理和机器学习应用的需求日益增长。本文将介绍如何利用Python语言及其丰富的库来构建高效的数据处理流程,从而为机器学习模型的训练和优化提供可靠的数据基础。
22 2
|
3月前
|
算法 安全 数据挖掘
Python典型数据分析流程——纯理论(深入理解的看)
Python典型数据分析流程——纯理论(深入理解的看)
57 0