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)


目录
相关文章
|
3月前
|
测试技术 Python
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
本文介绍了Python中的循环语句,包括while和for循环的使用,range()函数的运用,以及continue、break和pass关键字的说明,同时提出了关于while循环是否能与成员运算符结合使用的思考。
52 1
Python接口自动化测试框架(基础篇)-- 流程控制之循环语句for&while
|
3月前
|
测试技术 索引 Python
Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(一)
本文提供了Python接口自动化测试中的编程练习,包括计算器、猜数字、猜拳和九九乘法表等经典问题,涵盖了数据类型、运算、循环、条件控制等基础知识的综合应用。
47 1
|
30天前
|
人工智能 IDE 测试技术
使用通义灵码提升Python开发效率:从熟悉代码到实现需求的全流程体验
作为一名Python开发者,我最近开始使用通义灵码作为开发辅助工具。它显著提高了我的工作效率,特别是在理解和修改复杂代码逻辑方面。通过AI编码助手,我能够在短时间内快速上手新项目,实现新需求,并进行代码优化,整体效率提升了60%以上。通义灵码不仅加快了代码生成速度,还增强了代码的健壮性和稳定性。
|
1月前
|
SQL 关系型数据库 数据库
优化Web开发流程:Python ORM的优势与实现细节
【10月更文挑战第4天】在Web开发中,数据库操作至关重要,但直接编写SQL语句既繁琐又易错。对象关系映射(ORM)技术应运而生,让开发者以面向对象的方式操作数据库,显著提升了开发效率和代码可维护性。本文探讨Python ORM的优势及其实现细节,并通过Django ORM的示例展示其应用。ORM提供高级抽象层,简化数据库操作,提高代码可读性,并支持多种数据库后端,防止SQL注入。Django内置强大的ORM系统,通过定义模型、生成数据库表、插入和查询数据等步骤,展示了如何利用ORM简化复杂的数据库操作。
59 6
|
3月前
|
测试技术 Python
Python接口自动化测试框架(基础篇)-- 流程控制之if条件控制
Python中的流程控制语句if条件控制,涵盖了比较运算符、成员运算符、身份运算符、逻辑运算符的使用,if语句的嵌套,以及如何使用input和print函数进行交互式编程练习。
31 1
Python接口自动化测试框架(基础篇)-- 流程控制之if条件控制
|
2月前
|
SQL 关系型数据库 MySQL
Python操作pymysql数据库的流程与技巧
在现代软件开发中,Python作为一门高效且易于学习的编程语言,广泛应用于各种场景,其中包括数据库操作。**PyMySQL** 是一个流行的Python数据库接口,用于连接和操作MySQL数据库。它提供了一种简便的方法来执行SQL语句、处理数据和管理数据库事务。以下是使用PyMySQL操作MySQL数据库的流程与技巧,旨在为开发者提供一个清晰、实用的指南。
54 0
|
3月前
|
存储 测试技术 数据格式
Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(二)
本文通过数据类型转换和文件读取的练习,复习了Python中的数据类型、循环、条件判断、内置函数等基础知识,并演示了如何将字符串数据转换为字典列表,以及如何从文本文件中读取和转换数据。
36 1
|
3月前
|
机器学习/深度学习 Ubuntu 数据挖掘
Ubuntu系统部署Anaconda环境及Python语言的详细流程
以上就是在Ubuntu系统中安装Anaconda环境及Python语言的详细流程。Anaconda为Python科学计算提供了便捷的管理方式,帮助用户轻松处理不同项目之间依赖管理的复杂性。通过以上步骤,你现在应该有了一个完全可用的Anaconda环境,可以开始在Ubuntu上进行Python编程和数据科学项目的探索了。
80 5
|
3月前
|
Python
python学习笔记---流程控制
这篇文章详细介绍了Python中的流程控制,包括选择结构(if、if-else语句、嵌套if语句)和循环语句(while循环、for循环以及for循环与range()函数的使用),以及如何在循环中使用break和continue语句。
python学习笔记---流程控制
|
3月前
|
JSON 数据库 开发者
FastAPI入门指南:Python开发者必看——从零基础到精通,掌握FastAPI的全栈式Web开发流程,解锁高效编码的秘密!
【8月更文挑战第31天】在当今的Web开发领域,FastAPI迅速成为开发者的热门选择。本指南带领Python开发者快速入门FastAPI,涵盖环境搭建、基础代码、路径参数、请求体处理、数据库操作及异常处理等内容,帮助你轻松掌握这一高效Web框架。通过实践操作,你将学会构建高性能的Web应用,并为后续复杂项目打下坚实基础。
110 0