首页 > 技术文章 > 流程控制之if判断,流程控制之while循环,流程控制之for循环

gengfenglog 2020-12-21 17:07 原文

流程控制

流程控制即控制流程,具体指控制程序的执行流程,而程序的执行流程分为三种结构:

  • 顺序结构:自上而下依次运行(之前我们写的代码都是顺序结构)

  • 分支结构:在运行过程中根据条件的不同可能会执行不同的流程(用到if判断)

  • 循环结构:在运行过程中有些代码需要反复执行(用到while与for)


分支结构:if判断

必知必会:

  • 1、条件都会转成布尔值,从而决定代码是否执行
  • 2、在python中使用缩进来表示代码的从属关系
  • 3、并不是所有代码都可以拥有子代码
  • 4、同属于你某个代码的多行子代码必须要保持相同的缩进量
  • 5、在python中推荐使用相同缩进(四个空格表示一个缩进)来标识一组代码块(上一行代码结尾如果是冒号,那么下一行代码必须缩进)

什么是分支结构

分支结构就是根据条件判断的真假去执行不同分支对应的子代码

为何要用分支结构

为了让计算机像人一样根据条件的判断结果去做不同的事情

用if关键字来实现分支结构

if 条件1:  
    ...
    条件1成立后执行的子代码块

elif 条件2: 
    ...
    条件1不成立,条件2成立后执行的子代码块
    
else: 
    ...
    上述条件都不满足就走这段

注意:

  • 条件可以是任意表达式,但执行结果必须为布尔类型 在if判断中所有的数据类型也都会自动转换成布尔类型

    • None,0,空(空字符串,空列表,空字典等)三种情况下转换成的布尔值为False
    • 其余均为True

单if分支结构

if 条件:
    ...
    条件成立后执行的子代码块
    print("end...")
 
# 案例:年龄小于22,叫小伙子
age = 20
if age < 22: 
    print("毛儿都没长齐的家伙")

if..else连用(双分支)

if 条件:
    ...
    条件成立后执行的子代码块
else:
    ...
    if条件不成立就走这段

# 案例:猜年龄
age = 22
if age < 20:
    print("小伙子好")
else:
    print("傻不拉几的")

if...elif...else连用(多分支)

if 条件1:
    ...
    条件1成立后执行的子代码块
elif 条件2:
    ...
    条件1不成立,条件2成立后执行的子代码块
elif 条件3:
    ...
    条件1和2都不成立,条件3成立后执行的子代码块
else:
    ...
    上述所有条件都不成立就走这段
    
# 案例:
# 如果成绩 >= 90:优秀
# 如果成绩 >= 80且< 90:良好
# 如果成绩 >= 70且< 80:普通
# 其他情况:很差

score = 83
if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
elif score >= 70:
    print("普通")
else:
    print("很差")

if判断之嵌套

# 一定要图文相结合去消化理解吸收
# 案例:在相亲的基础上继续,如果牵手成功,那么:在一起,否则。。。
age = 26
height = 165
weight = 99
is_success = True
if age < 28 and height > 160 and weight < 100:
    print('小姐姐能否牵手')
    # 判断小姐姐是否会牵手
    if is_success:
        print('吃饭 看电影 天黑了...')
    else:
        print('去你妹的 变态!')
else:
    print('可惜了')



循环结构:while循环

  • 什么是while循环

    • 循环就是重复做某件事,while循环是Python提供第一种循环机制称之为:条件循环
  • 为何要有while循环

    • 为了控制计算机能够像人一样去重复做某件事

while循环基本语法

while 条件:
    ...
    条件成立之后循环执行的子代码块
""" 
while的运行步骤:
	1、如果条件为真,那么依次执行子代码块
	2、执行完毕后再次判断条件,如果条件为True则再次执行子代码块如果条件为False,则循环终止
"""   
while True:
    # 1.获取用户输入的用户名和密码
    username = input('请输入用户名>>>:')
    password = input('请输入密码>>>:')
    # 2.判断用户名和密码是否正确
    if username == 'jack' and password == '123':
        print('登录成功!')
    else:
        print('登录失败,请重新输入!')
        
# 注意:死循环---》条件永远为True

结束while循环的两种方式

方式一:全局标志位

  • 特点:等到本次循环体代码运行完毕后,下一次循环判断条件时才会生效
# 标志位的使用
count = 0
flag = True

while tag:
    if count == 5:
      flag = False  # 把条件改为False
    print(i)
    count += 1

方式二:break

  • 特点:break立即结束本层while循环
count = 0
tag = True

while tag:
    if count == 5:
        # tag = False
        break
    print(i)
    count += 1

while嵌套

while循环嵌套+全局标志位的使用

  • 针对嵌套多层的while循环,如果我们的目的很明确就是要在某一层直接退出所有层的循环,其实有一个窍门,“全局标志位”就让所有while循环的条件都用同一个变量,该变量的初始值为True,一旦在某一层将该变量的值改成False,则所有层的循环都结束
flag = True
while flag:  # 第一层循环
    while flag:  # 第二层循环
      flag = False  # tag变为False,所有while循环的条件都变为False
      
# 案例:
flag = True
while flag:
    inp_user = input("请输入用户名>>>: ")
    inp_pwd = input("请输入密码>>>: ")

    if inp_user == "jack" and inp_pwd == "123":
        print('登录成功')
        # break
        flag = False
    else:
        print('用户名或密码错误')   

while循环嵌套+break的使用

  • 如果while循环嵌套了很多层,要想退出每一层循环则需要在每一层循环都有一个break
while True:  # 第一层循环
    while True:  # 第二层循环
        while True:  # 第三层循环
            break  # 终止第三层循环
        break  # 终止第二层循环
    break  # 终止第一层循环
          
# 案例:
while True:
    inp_user = input("请输入用户名>>>: ")
    inp_pwd = input("请输入密码>>>: ")
    
    if inp_user == "jack" and inp_pwd == "123":
        print('登录成功!')
        while True:
            print("""
            0 退出
            1 取款
            2 存款
            3 转账
            """)
            choice = input("请输入您的命令编号:")
            if choice == "0":
                break
            elif choice == "1":
                print("正在取款。。。")
            elif choice == "2":
                print("正在存款。。。")
            elif choice == "3":
                print("正在转账。。。")
            else:
                print("输入的指令不存在")
        break
    else:
        print('用户名或密码错误')

while+continue:跳过本次循环,直接进入下一次循环

# 使用while循环打印出0-5但是不打印2和4
# 1.定义一个起始变量
count = 0
# 2.循环
while count < 6:
    if count == 2 or count == 4:
        count += 1
        continue  # continue同级别之后千万别写代码,写了也不会运行
    # 3.打印变量的值
    print(count)
    # 4.变量值自增1
    count += 1
    
"""
continue会让循环体代码直接回到条件判断处重新判断
"""

# 案例:
while True:
    inp_user = input("username>>>: ")
    inp_pwd = input("password>>>: ")
		# 判断用户名和密码是否正确
    if inp_user == "jack" and inp_pwd == "123":
        print('登录成功') # 输入正确登录成功
        break # 结束循环
    else:
        print('用户名或密码错误')
        # continue  # 一定不要加在最后一步

while+else:else的子代码块会在while循环正常死亡时运行,没有被break干掉就叫正常死亡

# 案例一:正常死亡,循环正常执行
count = 0
while count < 5:
    if count == 2:
        count += 1
        continue
    print(count)
    count += 1
else:
    print('====>')

# 案例二:非正常死亡,如果执行过程中被break,就不会执行else的语句
count = 0
while count < 5:
    if count == 2:
        break
    print(count)
    count += 1
else:
    print('====>')

死循环:条件永远为True

while True:
    print(1)
    
"""死循环会让CPU极度繁忙 甚至奔溃"""

小练习:

"""
猜年龄的游戏
    普通要求
        用户可以有三次猜错的机会 如果过程中猜对了直接退出
    拔高要求
        三次机会用完之后提示用户是否继续尝试 如果是则再给三次机会 如果否则直接结束
"""
real_age = 18  # 定义固定的年龄变量
count = 0  # 定义输入次数变量
while True:
    # 三次机会用完会执行
    if count == 3:
        choice = input("三次机会已用完啦!是否继续?\n重新请输入'q',退出请输入't'>>>:")
        if choice == 'q' or choice == 'Q':
            count = 0  # 将猜测次数置为0
        else:
            print('游戏已结束'.center(35, '='))
            break
    print('猜年龄游戏'.center(35, '*'))
    age = int(input('请输入年龄>>>:'))
    if age < real_age:
        print('害!猜小了,你还有:%s 次机会!' % (2 - count))
    elif age > real_age:
        print('害!猜大了,你还有:%s 次机会,!' % (2 - count))
    else:
        print('好家伙猜对了,真厉害呀!')
        break
    count += 1





循环结构:for循环

  • 1、什么是for循环

    • 循环就是重复做某件事,for循环是python提供第二种循环机制
  • 2、为何要有for循环

    • 理论上for循环能做的事情,while循环都可以做
    • 之所以要有for循环,是因为for循环在循环取值(遍历取值)比while循环更简洁

for循环基本语法

for 变量名 in 可迭代对象:  # 可迭代对象可以是字符串,列表,字典,元组,集合
    ...
    for循环体代码
    
# 例1
for i in ['a','b','c']:
    print(i)
# 运行结果
a
b
c

# 参照例1来介绍for循环的运行步骤
# 步骤1:从列表['a','b','c']中读出第一个值赋值给item(item=‘a’),然后执行循环体代码
# 步骤2:从列表['a','b','c']中读出第二个值赋值给item(item=‘b’),然后执行循环体代码
# 步骤3: 重复以上过程直到列表中的值读尽    

for循环的基本用法

# 案例1:遍历列表

names = ["kevin", "tom", "jack", "lili", "lxx", "xxx"]
for x in names:
    print(x)
for x,y in [["name","kevin"],["age",18],["gender","male"]]:  # x,y = ['name', 'kevin']
    print(x,y)


# 案例2:遍历字典
dic={"k1":111,'K2':2222,"k3":333}
for x in dic:  # for 循环默认取的是字典的key赋值给变量名k
    print(x,dic[x])


# 案例3:遍历字符串
for x in "hello":
    print(x)
msg="you can you up,no can no bb"
for x in msg:
    print(x)
  • 总结for循环与while循环的异同
    • 1、相同之处:
      • 都是循环,for循环可以干的事,while循环也可以干
    • 2、不同之处:
      • while循环称之为条件循环,循环次数取决于条件何时变为假
      • for循环称之为"取值循环",循环次数取决in后包含的值的个数

for+break:同while循环一样

for i in [11,22,33,44,55]:
    if i == 33:
        break
    print(i)

for+continue:同while循环一样

for i in [11,22,33,44,55]:
    if i == 33:
        continue
    print(i)

for+else:同while循环一样

for i in [11,22,33,44,55]:
    if i == 33:
       break
    print(i)
else:
    print('++++++++>')

range 关键字

for + range控制循环次数:range()

  • in后直接放一个数据类型来控制循环次数有局限性:
    • 当循环次数过多时,数据类型包含值的格式需要伴随着增加
# range功能介绍
# 第一种:一个参数  从0开始 顾头不顾尾
for i in range(10):
     print(i)
    
# 第二种:两个参数  自定义起始位置 顾头不顾尾
for i in range(4, 10):
     print(i)
    
# 第三种:三个参数  第三个数字用来控制等差值
for i in range(2, 100, 10):
    print(i)

"""
扩展知识
    https://movie.douban.com/top250  第一页
    https://movie.douban.com/top250?start=25&filter=  第二页
    https://movie.douban.com/top250?start=50&filter=  第三页
    https://movie.douban.com/top250?start=75&filter=  第四页
    
    https://movie.douban.com/top250?start=0&filter=  推测第一页
"""
base_url = "https://movie.douban.com/top250?start=%s&filter="
for i in range(0, 250, 25):
    print(base_url % i)
    
""" 
range在不同版本的解释器中 本质不同
	在python2.X中range会直接生成一个列表
    	在python2.X中有一个xrange也是迭代器(老母猪)

在python3.X中range是一个迭代器(老母猪)  节省内存空间
      python2.X中xrange就是python3.x里面的range
"""    
# python2版本演示
'''   
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> 
>>> range(1,9) # 1...8
[1, 2, 3, 4, 5, 6, 7, 8]
>>> 
>>> range(1,9,1) # 1 2 3 4 5 6 7 8 
[1, 2, 3, 4, 5, 6, 7, 8]
>>> range(1,9,2) # 1 3 5 7 
[1, 3, 5, 7]
'''


for i in range(30):
    print('===>')
username='kevin'
password='123'
for i in range(3):
    inp_name = input('请输入您的账号:')
    inp_pwd = input('请输入您的密码:')

    if inp_name == username and inp_pwd == password:
        print('登录成功')
        break
else:
    print('输错账号密码次数过多')

enumerate 关键字

for + enumerate

i,name=(0,"kevin")
for i,name in enumerate(["kevin","tom","jack"]):  # [(0,"kevin"),(1,"tom"),(2,"jack")]
    print(i,name)


for x in enumerate({"k1":111,"k2":2222,"k3":3333}):
    print(x)

for循环的嵌套使用

# for i in range(3):
#     for j in range(5):
#         print("*", end='')
#     print()


for i in range(1, 10):
    for j in range(1, i + 1):
        print('%s*%s=%s' % (i, j, i * j), end=' ')
    print()

推荐阅读