程序的流程控制

零、程序的结构

  • 分为三种结构
  1. 顺序结构:自顶向下运行代码;
  2. 分支结构(选择结构):通过条件的判断进行代码分支的处理,如果条件成功,则执行指定的代码块。只执行0次或1次;
  3. 循环结构:通过条件的判断,如果条件为真则执行代码,这个判断会进行多次,直到条件为假。执行的次数比判断次数少一次。
  • 分支结构的关键字:ifelifelse,只有一种分支的语法;
  • 循环结构的关键字:whilefor-in,有两种循环语法

一、对象的布尔值

在Python一切皆对象,每个对象都有一个布尔值(True或者False)。

  • 以下对象的布尔为False,其余的对象的布尔值为True
  • 0
  • 0.0
  • False
  • None
  • '':空字符串
  • []:空列表
  • {}:空字典
  • ():空元组
  • set():空集合
  • 如何判断对象的布尔值:使用bool(obj)
print(bool(0))
print(bool(0.0))
print(bool(False))
print(bool(None))
print(bool([]))
print(bool({}))
print(bool(()))
print(bool(set()))

''' 以上代码的输出结果均为False '''

二、分支结构

2.1 单分支

  • 语法
if 条件:		# 条件的布尔值,不需要使用bool()来获取
    如果条件为True则执行代码1
    如果条件为True则执行代码2
无论条件是否成立,这行代码肯定执行

关键字if会自动判断条件的布尔值,不必使用bool()函数。

  • 代码
# 需求:坐公交车,如果钱大于6元,才乘坐公交

# 1. 请用户进行刷卡,相当于用户输入一个余额
balance = input('请刷卡,余额为:')

# 2. 判断余额,如果余额大于等于6元,则可以乘车
if balance >= 6:
    print('请上车')
    
# 3. 标记,刷卡结束
print('刷卡结束')

2.2 双分支

  • 语法
if 条件:
    代码1
    ...
else:       # 不做判断,如果if后的条件为False,则执行else的代码块
    代码2
    ...
  • 案例
# 需求:乘坐公交,加需求:当余额小于6元时,打印“请步行回家”

balance = int(input('请刷卡,余额为:'))

# 判断余额,如果余额大于等于6元,则可以乘车
if balance >= 6:
    print('请上车')
else:
    print('请步行回家!')

# 3. 标记,刷卡结束
print('刷卡结束')
  • 随堂练习
''' 练习:
一个人想去网吧上网:
如果年龄大于18岁,则可以上网;
否则,不能上网。
'''

age = int(input('请出示身份证,年龄为:'))

if age >= 18:
    print('可以上网')
else:
    print('不能上网')

2.3 多分支

  • 语法
if 条件1:
    代码1...
elif 条件2:
	代码2...
elif 条件3:
    代码3...
else:
    代码n...
  • 案例1

如果 余额大于等于4元,则打印请上车;

如果 余额大于2元,则请充值;

如果 余额小于2元,请投币。

balance = int(input('请刷卡,余额为:'))

if balance >= 4:
    print('请上车')
elif balance >= 2:
    print('请充值')
elif balance >= 0:
    print('请投币')
  • 案例2

如果 余额大于等于4元,则打印请上车;

如果 余额大于2元,则请充值;

如果 余额小于2元,请投币;

如果以上条件不满足,比如拿错了卡,提示请查看卡片(代码中表示为小于0)。

balance = int(input('请刷卡,余额为:'))

print('开始')

if balance >= 4:
    print('请上车')
elif balance >= 2:
    print('请充值')
elif balance >= 0:
    print('请投币')
else:       # balance 小于0 才执行
    print('拿错了卡,请查看卡片')
    
print('结束 ')
  • 随堂练习

买东西。需要计算最终的付款金额!

如果消费金额大于等于500元,则打8折

如果消费金额大于等于300小于500,则打8.5折

如果消费金额大于等于200小于300,则打9折

如果消费金额小于200,不打折

money = int(input('请输入消费金额:'))

if money >= 500:
    money *= 0.8
elif money >= 300:
    money *= 0.85
elif money >=200:
    money *= 0.9
elif money > 0:
    pass
else:
    print('你没有消费')

print(f'您最终的消费金额为:{money}')

2.4 if嵌套

  • 案例1

查看考试成绩:

70分以上为及格,70分以下为不及格

如果85分以上,等级为A

如果70-85分,等级为B

如果60-70分,等级为C

如果60分以下,等级为D

score = int(input('请输入你的成绩:'))

if score >= 70:
    print('及格')
    if score >= 85:
        print('等级A')
    else:
        print('等级B')
else:
    print('不及格')
    if score >= 60:
        print('等级C')
    else:
        print('等级D')
  • 案例2

如果余额大于等于4元,则打印请上车;否则步行;

加需求:上车后,如果有座位则坐下,否则站着。

balance = int(input('请刷卡,余额为:'))

if balance >= 4:
    print('请上车')
    # 请问司机是否有座位?
    seat = input('请问是否有座位?(Y/n):')
    if seat == 'Y':
        print('有座位,请坐!')
    elif seat == 'n':
        print('没座位,先站着!')
    else:
        print('没听清')
else:
    print('步行')

2.5 三目表达式

提示用户输入两个整数,判断两个整数的大小,将较大的数字输出到控制台!

  • 使用if..else...
num1 = int(input('请输入第一个整数:'))
num2 = int(input('请输入另一个整数:'))
if num1 > num2:
    print(f'较大数为:{num1}')
else:
    print(f'较大数为:{num2}')
  • 使用三目表达式
num1 = int(input('请输入第一个整数:'))
num2 = int(input('请输入另一个整数:'))

# 三目表达式
max_num = num1 if num1 > num2 else num2

print(f'较大的数为{max_num}')

2.6 补充

score = 65
if score >= 85:
    print('A')
elif 85 > score >= 70:        # 70 < score <= 85
    print('B')
elif 60 <= score < 70:     # 60 <= score < 70
    print('C')
else:
    print('D')

Python支持数学中的连续比较运算符:11 <= 变量 < 22

三、range()

3.1 语法

range(stop) -> range object
range(start, stop[, step]) -> range object

参数解释:

start:开始数字,包含;

stop:结束数字,不包含;

step:步长。正负整数均可,如果为负数,表示从开始数字向负方向迭代。

r = range(3)
print(r, type(r))		# range(0, 3) <class 'range'>

range()返回一个range对象,是一个可迭代对象

3.2 range(stop)

# 如何查看 range() 中的元素
r = range(3)
print(list(r))		# [0, 1, 2]

range(stop)中默认:start=0step=1

3.3 range(start, stop[, step])

  • range(start, stop)
# range(start, stop)
print(list(range(2, 5)))		# [2, 3, 4]

print(list(range(5, 2)))		# []

# 打印 -3到2 的列表
print(list(range(-3, 3)))

print(list(range(3, -3)))		# []

range(start, stop)中默认:step=1

  • range(start, stop, step)
# 打印 0-9 的所有偶数的列表
print(list(range(0, 10, 2)))

# 打印 0-9 的所有奇数的列表
print(list(range(1, 10, 2)))

# 打印 3到-2 的数字列表
print(list(range(3, -3, -1)))		# [3, 2, 1, 0, -1, -2]

step为负数时,迭代方向为反方向

四、循环结构

4.1 while

  • 语法
while 条件:
    循环体
  • 一般形式

防止出现死循环,满足以下三个条件

# 1. 起始值
while 条件:       # 2. 判断这个起始值
    循环体(多行语句)
    # 3. 改变起始值
  • 案例1:循环输出0-9之间的所有整数,要求在一行打印。
a = 0
while a < 10:
    print(a, end='\t')
    a += 1
  • 案例2:循环输出9-0之间的所有整数,要求在一行打印。
a = 9
while a >=0:
    print(a, end='\t')
    a -= 1
  • 案例3:使用while打印0-9之间的所有偶数
# 第一种方案:
a = 0
while a < 10:
    print(a, end='\t')
    a += 2		# 通过改变a的增量

# 第二种方案:
a = 0
while a < 10:
    if not a % 2:        # 判断一个整数为偶数
        print(a, end='\t')
    a += 1
  • 案例4:求出0-99所有整数的和
''' 分析过程:
a=0   sum_ = 0 + 0 = 0
a=1   sum_ = 0 + 1 = 1
a=2   sum_ = 1 + 2 = 3

a=99  sum_ = 4851 + 99 = 最终结果 = 4950
'''

a = 0
sum_ = 0     # 设置一个保存整数和的变量,不能影响到a的0-99的和
while a < 100:
    # 在循环体中累积求和
    sum_ += a       # sum_ = sum_ + a
    a += 1

# 打印最终结果
print(sum_)

4.2 for

  • 语法
for 变量 in 可迭代的对象:		# 目前已学过的可迭代对象有:str、range
    循环体
  • 案例1:打印0-9所有整数
# 第一种:使用字符串
for tmp in '0123456789':
    print(int(tmp))
    
# 第二种:使用range()
for i in range(10):
    print(i)
  • 案例2:打印0-9之间的所有奇数
# 第一种:使用range的步长
for i in range(1, 10, 2):
    print(i, end=' ')
print()

# 第二种:使用if判断余数
for i in range(10):
    if i % 2:
        print(i, end=' ')
  • 案例3:求0-99之间整数的奇数和与偶数和
sum1 = 0        # 保存奇数的和
sum2 = 0        # 保存偶数的和

# while a < 100:
for a in range(100):
    if a % 2:
        sum1 += a
    else:
        sum2 += a
  • 扩展

如果for之后的变量在循环体中没使用,建议使用_作为变量名!

# 需求:使用for-in打印“我中了500万”5遍

for _ in range(5):
    print('我中了500万')

4.3 break

  • break在循环中的作用是,跳出循环,执行循环之后的代码;
  • break一旦执行,break之后的循环体代码不会执行;
  • 案例1:遍历0-9之间的整数,只打印0-4,5-9不打印。
# 第一种:先打印,后判断
for i in range(10):
    print(i, end=' ')
    if i == 4:
        break

# 第二种:先判断,后打印
for i in range(10):
    if i == 5:
        break
    print(i, end=' ')
  • 案例2:猜0-999数字

电脑随机生成0-999的数字,使用程序提示用户输入自己猜的内容,如果猜错继续猜,直到猜中为止;

  1. 如果用户的数字大于电脑数字,则给出提示“大了,再猜!”;
  2. 如果用户的数字小于电脑数字,则给出提示“小了,再猜!”;
  3. 如果用户的数字等于电脑数字,则给出提示“中了,Bye!”,跳出循环;
import random


# 电脑随机生成一个 0-999的数字,包含0和999
cmp = random.randint(0, 999)

# 判断用户猜的数字与电脑的随机数是否相等
while True:     # 为什么使用while?因为猜的次数未知
    player = int(input('请猜:'))      # 这一句必须放在循环中,不然无法猜第二次

    if player > cmp:
        print('大了,再猜!')
    elif player < cmp:
        print('小了,再猜!')
    else:
        print('中了,再见!')
        break
  • 案例3:加需求,限制用户猜的次数最多3次
import random


cmp = random.randint(0, 999)

for _ in range(3);
	player = int(input('请猜:'))

    if player > cmp:
        print('大了,再猜!')
    elif player < cmp:
        print('小了,再猜!')
    else:
        print('中了,再见!')
        break

4.4 else

while或者for循环之后,如果有else语句,并且循环体内有break

  • 当执行break后,则不执行else中的代码;
  • 如果循环正常结束(不执行break而结束循环),则执行else中的代码
  • 语法
for 变量 in 可迭代对象:
    循环体
    break			# 如果执行break,那么else不执行
else:				# 如果以上循环正常结束,则执行else
    代码
  • 案例

加需求:

  • 如果三次机会使用完,请打印“三次机会已用完,你真菜!”
  • 无论用户是否猜中,猜完之后打印“游戏结束”
import random

cmp = random.randint(0, 999)

for _ in range(3):
    player = int(input('请猜:'))

    if player > cmp:
        print('大了,再猜!')
    elif player < cmp:
        print('小了,再猜!')
    else:
        print('中了,再见!')
        break
else:
    print('三次机会已用完,你真菜!!!')

print('游戏结束!')

4.5 continue

关键字continue表示,当执行continue时,结束当前循环,继续进行下次循环;

一旦执行continuecontinue之后的循环体代码不执行,跳到下次循环。

  • 案例:遍历HelloPython,不打印o
str_ = 'HelloPython'

for tmp in str_:
    if tmp == 'o':
        continue
    print(tmp, end='')
  • 随堂练习
# 打印0-9偶数,使用continue

for i in range(10):
    if i % 2:
        continue
    print(i, end=' ')

4.6 循环的嵌套

  • 案例1:打印一个4行3列的矩形
''' 结果:
*   *   *
*   *   *
*   *   *
*   *   *
'''
''' 分析:
第一行,打印三个星
第二行,打印三个星
第三行,打印三个星

提取信息:
1. 将一个星在一行打印三次
2. 将“一行三个星”打印三行,即可。
'''

for j in range(4):      # 行
    for i in range(3):      # 列
        print('*', end='\t')
    print()
  • 案例2:打印一个直角三角形
'''
*	
*	*
*	*	*	
*	*	*	*
'''
''' 分析:
第一行打印一颗星;
第二行打印二颗星;
第三行打印三颗星;
第四行打印四颗星;
'''

for i in range(1, 5):
    for j in range(1, i+1):
        print('*', end='\t')
    print()
  • 随堂练习:打印九九乘法表
for i in range(1, 10):
    for j in range(1, i+1):
        print(f'{j}*{i}={i*j}', end='\t')
    print()