【python入门之流程控制语句】---流程控制语句

发布时间 2023-12-03 14:07:37作者: Unfool

【一】流程控制语句介绍

  • 程序是由语句构成,而流程控制语句 是用来控制程序中每条语句执行顺序的语句。
  • 流程控制语句用于根据条件来控制程序的执行流程。
    • 可以通过控制语句实现更丰富的逻辑以及更强大的功能。
    • 几乎所有编程语言都有流程控制语句,功能也都基本相似。
  • 其流程控制方式有
    • 顺序结构
    • 分支结构
    • 循环结构
  • 这里最简单最常用的就是顺序结构,即语句从上至下一一执行。

【二】顺序结构

【1】什么是顺序结构

  • 在计算机程序中,顺序结构是指按照代码书写的顺序,一条语句接着一条语句执行,没有跳过、重复或其他特殊的结构。
  • 程序按照从上到下的顺序逐行执行。

image

【2】顺序结构的作用

  • 顺序结构用于按照既定的顺序执行一系列的操作,这是程序执行的最基本模式。
  • 通过良好的顺序结构,可以清晰地表达程序的逻辑流程,使代码易读易懂。
  • 这有助于开发者理解和维护代码,也方便调试。

【三】分支结构

【1】什么是分支结构

  • 分支结构是计算机程序中的一种控制结构,它根据条件的成立与否选择性地执行不同的代码块。
  • 在分支结构中,根据条件的判断结果,程序会有不同的执行路径。

【2】分支结构的作用

  • 分支结构的主要作用是根据不同的条件执行不同的代码,从而实现灵活的程序逻辑。
  • 通过分支结构,程序可以根据用户的输入、计算的结果等情况来选择执行不同的代码块,增加程序的智能性和适应性。

【3】单分支结构(if)

  • 单分支结构指的是程序根据条件的成立与否,执行两个分支中的其中一个。
  • 常见的单分支结构语法是if语句。

image

(1)语法

if 条件:
    # 如果条件成立,执行这里的代码块

(2)使用

  • 单分支结构用于在条件成立时执行相应的代码块。例如:
age = 18
if age >= 18:
    print("你已成年,可以参加投票。")

(3)补充

  • Python用相同缩进(4个空格表示一个缩进)来标识一组代码块,同一组代码会自上而下依次运行
  • 条件可以是任意表达式,但执行结果必须为布尔类型
  • 在if判断中所有的数据类型也都会自动转换成布尔类型
    • None,0,空(空字符串,空列表,空字典等)三种情况下转换成的布尔值为False
    • 其余均为True

【4】双分支结构(if-else)

  • 双分支结构也是根据条件的成立与否,选择性地执行不同的代码块。
  • 与单分支结构不同的是,双分支结构有两个分支,分别对应条件成立和条件不成立的情况。

image

(1)语法

if 条件:
    # 如果条件成立,执行这里的代码块
else:
    # 如果条件不成立,执行这里的代码块

(2)使用

  • 双分支结构用于在条件成立时执行一个代码块,在条件不成立时执行另一个代码块。例如:
age = 16
if age >= 18:
    print("你已成年,可以参加投票。")
else:
    print("你还未成年,不能参加投票。")

【5】多分支结构(if-elif-else)

  • 多分支结构是在双分支结构的基础上扩展,它包含多个分支,每个分支都对应不同的条件。
  • 程序根据条件的成立情况选择性地执行相应的代码块。

image

(1)语法

if 条件1:
    # 如果条件1成立,执行这里的代码块
elif 条件2:
    # 如果条件1不成立且条件2成立,执行这里的代码块
else:
    # 如果条件1和条件2都不成立,执行这里的代码块

(2)使用

  • 多分支结构用于根据不同的条件选择性地执行相应的代码块。例如:
score = 85
if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
else:
    print("一般")

【6】多层嵌套结构

  • 多层嵌套结构是将多个分支结构嵌套在一起形成的复杂结构。
  • 每一层的分支结构都可以根据不同的条件进行选择性的执行。
  • 多层嵌套结构的使用需要注意代码的可读性和维护性。

(1)语法

  • 多层嵌套结构是通过在不同层次上使用if语句嵌套形成的结构。

(2)使用

  • 多层嵌套结构可以根据多个条件的组合选择性地执行代码块。例如:
age = 25
if age >= 18:
    if age <= 25:
        print("年龄在18到25岁之间。")
    else:
        print("年龄大于25岁。")
else:
    print("年龄小于18岁。")

【四】循环结构

【1】什么是循环结构

  • 循环结构是一种程序控制结构,用于反复执行一组语句,直到满足某个条件为止。
  • 循环结构使得程序可以更有效地重复执行某段代码,节省了编写重复代码的工作。

image

【2】循环结构的作用

  • 循环结构的主要作用是重复执行一组语句,直到满足某个条件。
  • 这种重复执行的过程可以是固定次数的,也可以是根据条件动态确定的。
  • 循环结构使得程序可以更灵活、高效地处理需要重复执行的任务。

【3】while循环

(1)语法

while condition:
    # 循环体
  • while 是循环的关键字。
  • condition 是循环的条件,当条件为真时,循环体会一直执行。
  • 循环体是需要重复执行的代码块。

(2)使用

count = 0

while count < 5:
    print("Current count:", count)
    count += 1

print("Loop finished!")
输出:
Current count: 0
Current count: 1
Current count: 2
Current count: 3
Current count: 4
Loop finished!

(3)登陆认证案例

  • 用户认证程序的基本逻辑就是接收用户输入的用户名密码然后与程序中存放的用户名密码进行判断,判断成功则登陆成功,判断失败则输出账号或密码错误
username = "Jack"
password = "123"

inp_name =  input("请输入用户名:")
inp_pwd =  input("请输入密码:")
if inp_name == username and inp_pwd == password:
    print("登陆成功")
else:
    print("输入的用户名或密码错误!")
  • 通常认证失败的情况下,会要求用户重新输入用户名和密码进行验证
  • 如果我们想给用户三次试错机会,本质就是将上述代码重复运行三遍
  • 你总不会想着把代码复制3次吧。。。。
username = "Jack"
password = "123"

# 第一次验证
inp_name =  input("请输入用户名:")
inp_pwd =  input("请输入密码:")
if inp_name == username and inp_pwd == password:
    print("登陆成功")
else:
    print("输入的用户名或密码错误!")

# 第二次验证
inp_name =  input("请输入用户名:")
inp_pwd =  input("请输入密码:")
if inp_name == username and inp_pwd == password:
    print("登陆成功")
else:
    print("输入的用户名或密码错误!")
    
# 第三次验证
inp_name =  input("请输入用户名:")
inp_pwd =  input("请输入密码:")
if inp_name == username and inp_pwd == password:
    print("登陆成功")
else:
    print("输入的用户名或密码错误!")
  • 即使是小白的你,也觉得的太low了是不是,以后要修改功能还得修改3次
    • 因此记住,写重复的代码是程序员最不耻的行为。
  • 那么如何做到不用写重复代码又能让程序重复一段代码多次呢?
    • 循环语句就派上用场啦(使用while循环实现)
username = "Jack"
password = "123"
# 记录错误验证的次数
count = 0
while count < 3:
    inp_name = input("请输入用户名:")
    inp_pwd = input("请输入密码:")
    if inp_name == username and inp_pwd == password:
        print("登陆成功")
    else:
        print("输入的用户名或密码错误!")
        count += 1

【4】for循环

(1)语法

for variable in sequence:
    # 循环体
  • for 是循环的关键字。
  • variable 是循环变量,它会在每次循环中取 sequence 中的一个值。
  • sequence 是一个序列,可以是列表、元组、字符串等。

(2)使用

fruits = ["apple", "banana", "cherry"]

for fruit in fruits:
    print("Current fruit:", fruit)

print("Loop finished!")
  • 上述代码会输出
Current fruit: apple
Current fruit: banana
Current fruit: cherry
Loop finished!

【5】退出循环(break)

(1)语法

while condition:
    # 循环体
    if some_condition:
        break  # 退出循环

(2)使用

count = 0

while count < 5:
    print(count)
    if count == 3:
        break  # 当 count 等于 3 时,退出循环
    count += 1

(3)登录案例(while循环-break)

  • 使用了while循环后,代码确实精简多了
  • 但问题是用户输入正确的用户名密码以后无法结束循环
  • 那如何结束掉一个循环呢?
    • 这就需要用到break了!
username = "Jack"
password = "123"
# 记录错误验证的次数
count = 0
while count < 3:
    inp_name = input("请输入用户名:")
    inp_pwd = input("请输入密码:")
    if inp_name == username and inp_pwd == password:
        print("登陆成功")
        break # 用于结束本层循环
    else:
        print("输入的用户名或密码错误!")
        count += 1

(4)登录案例(while循环嵌套-break)

  • 如果while循环嵌套了很多层
  • 要想退出每一层循环则需要在每一层循环都有一个break
username = "Jack"
password = "123"
count = 0
while count < 3:  # 第一层循环
    inp_name = input("请输入用户名:")
    inp_pwd = input("请输入密码:")
    if inp_name == username and inp_pwd == password:
        print("登陆成功")
        while True:  # 第二层循环
            cmd = input('>>: ')
            if cmd == 'quit':
                break  # 用于结束本层循环,即第二层循环
            print('run <%s>' % cmd)
        break  # 用于结束本层循环,即第一层循环
    else:
        print("输入的用户名或密码错误!")
        count += 1

【6】退出循环(continue)

(1)语法

while condition:
    # 循环体
    if some_condition:
        continue  # 跳过当前循环,继续下一次循环

(2)使用

count = 0

while count < 5:
    count += 1
    if count == 3:
        continue  # 当 count 等于 3 时,跳过当前循环,继续下一次循环
    print(count)
  • 这两个关键字在循环中的使用可以帮助你更灵活地控制循环的流程。
  • break 用于完全退出循环,而 continue 用于跳过当前循环的剩余部分,直接进入下一次循环。

【7】无限循环(死循环)

  • 有时候,我们需要程序在满足某个条件时一直执行,这就需要用到无限循环。
  • 最简单的无限循环可以通过 while 语句实现,条件永远为真。
while True:
    print("This is an infinite loop!")
  • 这段代码会一直输出 "This is an infinite loop!",因为 while True: 的条件永远为真,所以循环不会停止。

  • 在实际编程中,我们可能会在无限循环中加入某个条件来实现根据需要退出循环的逻辑

while True:
    user_input = input("Enter 'exit' to end the loop: ")
    if user_input.lower() == 'exit':
        break
    else:
        print("You entered:", user_input)
  • 这个例子中,用户需要输入 'exit' 才能结束循环。这样就可以灵活地在需要的时候退出无限循环。

【8】标志位

(1)语法

flag = True  # 初始化标志位

while flag:
    # 循环体
    if some_condition:
        flag = False  # 修改标志位,退出循环

(2)使用

flag = True  # 初始化标志位

while flag:
    user_input = input("请输入:")
    if user_input == 'exit':
        flag = False  # 当用户输入 'exit' 时,修改标志位,退出循环
    else:
        print("用户输入:", user_input)

(3)登陆案例(while循环嵌套+tag标志位)

# 登陆案例
user_list = [
    {'username': 'user1', 'password': '123'},
    {'username': 'user2', 'password': '456'},
    {'username': 'user3', 'password': '789'},
]

login_flag = False  # 初始化登陆标志位

while True:
    username = input("请输入用户名:")
    password = input("请输入密码:")

    for user in user_list:
        if username == user['username'] and password == user['password']:
            print("登陆成功!")
            login_flag = True  # 修改登陆标志位为 True
            break

    if login_flag:
        break  # 如果登陆标志位为 True,退出循环
    else:
        print("用户名或密码错误,请重新输入。")
username = "Jack"
password = "123"
count = 0

tag = True
while tag: 
    inp_name = input("请输入用户名:")
    inp_pwd = input("请输入密码:")
    if inp_name == username and inp_pwd == password:
        print("登陆成功")
        while tag:  
            cmd = input('>>: ')
            if cmd == 'quit':
                tag = False  # tag变为False, 所有while循环的条件都变为False 
                break
            print('run <%s>' % cmd)
        break  # 用于结束本层循环,即第一层循环
    else:
        print("输入的用户名或密码错误!")
        count += 1

【9】循环分支(else)

  • 在while循环的后面
    • 我们可以跟else语句
  • 当while 循环正常执行完并且中间没有被break 中止的话
    • 就会执行else后面的语句
  • 所以我们可以用else来验证
    • 循环是否正常结束
count = 0
while count <= 5 :
    count += 1
    print("Loop",count)
else:
    print("循环正常执行完啦")
print("-----out of while loop ------")
 
 #输出
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
循环正常执行完啦   #没有被break打断,所以执行了该行代码
-----out of while loop ------
  • 如果执行过程中被break
    • 就不会执行else的语句
count = 0
while count <= 5 :
    count += 1
    if count == 3:
        break
    print("Loop",count)
else:
    print("循环正常执行完啦")
print("-----out of while loop ------")
#输出
Loop 1
Loop 2
-----out of while loop ------ #由于循环被break打断了,所以不执行else后的输出语句

【补充】range关键字

(1)遍历数字序列

[1]语法

for i in range(stop):
    # 循环体
for i in range(start, stop):
    # 循环体
for i in range(start, stop, step):
    # 循环体

[2]使用

for i in range(5):
    print(i)
# 输出:
# 0
# 1
# 2
# 3
# 4
for i in range(2, 6):
    print(i)
# 输出:
# 2
# 3
# 4
# 5
for i in range(1, 10, 2):
    print(i)
# 输出:
# 1
# 3
# 5
# 7
# 9

(2)指定区间

[1]语法

range(start, stop, step)

[2]使用

for i in range(2, 6):
    print(i)
# 输出:
# 2
# 3
# 4
# 5

(3)步长(‘step’)

[1]语法

range(start, stop, step)

[2]使用

for i in range(1, 10, 2):
    print(i)
# 输出:
# 1
# 3
# 5
# 7
# 9

(4)range + len 遍历序列

[1]原理

my_list = ['apple', 'banana', 'orange']
for i in range(len(my_list)):
    # 循环体

[2]使用

my_list = ['apple', 'banana', 'orange']
for i in range(len(my_list)):
    print(f"Index {i}: {my_list[i]}")
# 输出:
# Index 0: apple
# Index 1: banana
# Index 2: orange

(5)range创建

[1]原理

numbers = list(range(start, stop, step))

[2]使用

numbers = list(range(1, 6))
print(numbers)
# 输出:[1, 2, 3, 4, 5]

【五】循环分支嵌套

  • 循环结构和分支结构可以嵌套在一起,形成复杂的程序逻辑。
for i in range(5):
    print("Outer loop, current value:", i)

    for j in range(3):
        print("Inner loop, current value:", j)

print("Nested loops finished!")
  • 上述代码中,外层循环 for i in range(5): 执行五次,内层循环 for j in range(3): 每次外层循环执行时都会执行三次。这样就形成了嵌套的循环结构。
# 案例2
while 1:
    score = input("请输入您的成绩>>")  # "100"

    if score.isdigit():
        score = int(score)  # 100
        if score > 100 or score < 0:
            print("您的输入有误!")
        elif score > 90:
            print("成绩优秀")
        elif score > 70:  # else if
            print("成绩良好")
        elif score > 60:
            print("成绩及格")
        else:
            print("成绩不及格")
    else:
        print("请输入一个数字")

【六】练习题

【1】求偶数元素的和

numbers = [1, 2, 1, 2, 3, 3, 6, 5, 8]
even_sum = sum(num for num in numbers if num % 2 == 0)
print(even_sum)

【2】求和一

  • 计算 1 - 2 + 3 - 4 + ... + 99 中除了88以外所有数的总和
result_sum = sum(num if num != 88 else 0 if i % 2 == 0 else -num for i, num in enumerate(range(1, 100)))
print(result_sum)

【3】求和二

  • 求1+2!+3!+4!+……+10!的和
import math

factorial_sum = sum(math.factorial(i) for i in range(1, 11))
print(factorial_sum)

【4】猜数字游戏

  • 程序随机内置一个位于一定范围内的数字作为猜测的结果,由用户猜测此数字。
  • 用户每猜测一次,由系统提示猜测结果:太大了、太小了或者猜对了,直到用户猜对结果或者猜测次数用完导致失败。
  • 设定一个理想数字比如:66, 让用户三次机会猜数字,如果比66大,则显示猜测的结果大了; 如果比66小,则显示猜测的结果小了; 只有等于66,显示猜测结果正确,退出循环。
  • 最多三次都没有猜测正确,退出循环,并显示‘都没猜对,继续努力’。
import random

ideal_number = 66
guess_count = 3

while guess_count > 0:
    user_guess = int(input("Enter your guess: "))
    if user_guess > ideal_number:
        print("Your guess is too large.")
    elif user_guess < ideal_number:
        print("Your guess is too small.")
    else:
        print("Congratulations! You guessed the correct number.")
        break
    guess_count -= 1

if guess_count == 0:
    print("You didn't guess correctly. Keep trying!")

【5】打印菱形小星星

     *
    ***
   *****
  *******
 *********
***********
***********
 *********
  *******
   *****
    ***
     *
def print_diamond(rows):
    for i in range(1, rows + 1):
        print(" " * (rows - i) + "*" * (2 * i - 1))
    for j in range(rows - 1, 0, -1):
        print(" " * (rows - j) + "*" * (2 * j - 1))

print_diamond(7)

【6】猜年龄游戏

(1)基础版(普通要求)

  • 只允许输错3次,输入正确直接结束
age=18
count=0
while count<3:
    count+=1
    guess = int(input(">>:"))
    if guess > age :
        print("猜的太大了,往小里试试...")
    elif guess < age :
        print("猜的太小了,往大里试试...")
    else:
        print("恭喜你,猜对了...")

(2)高级版(增加次数)

  • 当输错3次之后,不要直接结束,问用户是否还要在次输入,如果要,继续输入,如果不要,直接结束
right_age = 22
count_start = 3

while count_start > 0:
    age_input = input("请输入你的年龄:>>>")
    if right_age == age_input:
        print(f"你真聪明,真实年龄就是{age_input}")
    else:
        count_start -= 1
        print(f"加油呀,你还有{count_start}次机会")
        if count_start == 0:
            count = input(f"你的机会耗尽了,请选择是否继续游戏:>>>是或否")
            if count == '是':
                count_start = 3
            else:
                break

【7】打印九九乘法表

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

【8】打印金字塔

(1)分析

'''
#max_level=5
     *     	  # current_level=1,空格数=4,*号数=1
    ***   	  # current_level=2,空格数=3,*号数=3
   *****      # current_level=3,空格数=2,*号数=5
  *******     # current_level=4,空格数=1,*号数=7
 *********    # current_level=5,空格数=0,*号数=9

# 数学表达式
空格数=max_level-current_level
*号数=2*current_level-1
'''

(2)实现

max_level=5
for current_level in range(1,max_level+1):
	for i in range(max_level-current_level):
		print(' ',end='') #在一行中连续打印多个空格
	for j in range(2*current_level-1):
		print('*',end='') #在一行中连续打印多个空格
	print()