Python从入门到精通 第四章(程序的控制结构)

发布时间:2024年01月06日

注:本章内容有一部分在第二章和第三章中有提及,已提及部分这里可能不再详细复述(比如单分支判断语句和二分支判断语句)。

一、逻辑运算

1、and(与/并且)

(1)两个条件同时满足,返回True。

(2)只要有一个不满足,就返回False。

2、or(或/或者)

(1)两个条件只要有一个满足,返回True。

(2)两个条件都不满足,返回False。

3、not(非/不是)

(1)条件满足,返回False。

(2)条件不满足,返回True。

4、举例:

(1)例1:

# 练习1: 定义一个整数变量 age,编写代码判断年龄是否正确
age = 100

# 要求人的年龄在 0-120 之间
if age >= 0 and age <= 120:
    print("年龄正确")
else:
    print("年龄不正确")

# 练习2: 定义两个整数变量 python_score、c_score,编写代码判断成绩
python_score = 50
c_score = 50

# 要求只要有一门成绩 > 60 分就算合格
if python_score > 60 or c_score > 60:
    print("考试通过")
else:
    print("再接再厉!")

(2)例2:

# 练习: 定义一个布尔型变量 `is_employee`,编写代码判断是否是本公司员工
is_employee = True

# 如果不是提示不允许入内
if not is_employee:
    print("非公勿内")

二、分支语句

1、多分支语句

if 条件1:

????????条件1满足执行的代码

????????……

elif 条件2:

????????条件2满足时,执行的代码

????????……

elif 条件3:

????????条件3满足时,执行的代码

????????……

else:

????????以上条件都不满足时,执行的代码

????????……

holiday_name = "平安夜"

if holiday_name == "情人节":
    print("买玫瑰")
    print("看电影")
elif holiday_name == "平安夜":
    print("买苹果")
    print("吃大餐")
elif holiday_name == "生日":
    print("买蛋糕")
else:
    print("每天都是节日啊……")

注意:

①elif和else都必须和if联合使用,而不能单独使用。

②可以将if、elif 和 else以及各自缩进的代码,看成一个完整的代码块。

2、if语句的嵌套

if 条件 1:

????????条件 1 满足执行的代码

????????……

????

????????if 条件 1 基础上的条件 2:

????????????????条件 2 满足时,执行的代码

????????????????…… ???

????????

????????# 条件 2 不满足的处理

????????else:

????????????????条件 2 不满足时,执行的代码

????????

????????# 条件 1 不满足的处理

else:

????????条件1 不满足时,执行的代码

????????……

①例1:

# 定义布尔型变量 has_ticket 表示是否有车票
has_ticket = True
# 定义整数型变量 knife_length 表示刀的长度,单位:厘米
knife_length = 20
# 首先检查是否有车票,如果有,才允许进行 安检
if has_ticket:
    print("有车票,可以开始安检...")
    # 安检时,需要检查刀的长度,判断是否超过 20 厘米
    # 如果超过 20 厘米,提示刀的长度,不允许上车
    if knife_length >= 20:
        print("不允许携带 %d 厘米长的刀上车" % knife_length)
    # 如果不超过 20 厘米,安检通过
    else:
        print("安检通过,祝您旅途愉快……")
# 如果没有车票,不允许进门
else:
    print("大哥,您要先买票啊")

②例2:

"""
1. 从控制台输入要出的拳 —— 石头(1)/剪刀(2)/布(3)
2. 电脑 随机 出拳 —— 先假定电脑只会出石头,完成整体代码功能
3. 比较胜负
"""
# 在Python中,要使用随机数,首先需要导入随机数的模块 —— “工具包”(建议在导入工具包时应该将导入的语句放在文件顶部)
# ● 导入模块后,可以直接在模块名称后面敲一个 . 然后按 Tab 键,会提示该模块中包含的所有函数
# ● random.randint(a, b) ,返回 [a, b] 之间的整数,包含 a 和 b
import random

# 从控制台输入要出的拳 —— 石头(1)/剪刀(2)/布(3)
print("石头(1)/剪刀(2)/布(3)")
player =int(input("请出拳:"))

# 电脑随机出拳
computer = random.randint(1,3)

# 比较胜负
# 如果条件判断的内容太长,可以在最外侧的条件增加一对大括号
# 再在每一个条件之间,使用回车,PyCharm 可以自动增加 8 个空格
if((player == 1 and computer == 2)
        or (player == 2 and computer == 3)
        or (player == 3 and computer == 1)):
    print("用户胜出!")
elif player == computer:
    print("平局")
else:
    print("电脑胜出!")

# 另一种写法
if (computer == player % 3 + 1 ):
    print("用户胜出!")
elif player == computer:
    print("平局")
else:
    print("电脑胜出!")

③if的嵌套的语法格式,除了缩进之外和之前的没有区别。

三、循环语句——条件循环

1、while循环基本使用

(1)循环的作用就是让指定的代码重复的执行。

(2)while循环最常用的应用场景就是让执行的代码按照指定的次数重复执行。

(3)死循环:由于程序员的原因,忘记在循环内部修改循环的判断条件,导致循环持续执行,程序无法终止。

2、Python中的计数方法

(1)自然计数法(从 1 开始)—— 更符合人类的习惯

(2)程序计数法(从 0 开始)—— 几乎所有的程序语言都选择从0开始计数(特殊情况除外)

3、条件循环的格式

while(<条件>):

????????<语句块1>

????????<语句块2>

①当条件为True(真)时,执行语句块1,然后再次判断条件,当条件为False(假)时,退出循环执行语句块2。

②一般都是这样使用条件循环的:(while语句以及缩进部分是一个完整的代码块)

初始条件设置 —— 通常是重复执行的计数器

while 条件(判断计数器是否达到目标次数):

????????条件满足时,做的事情1

????????条件满足时,做的事情2

????????条件满足时,做的事情3

????????...(省略)...

????

????????处理条件(计数器 + 1)

注:循环结束后,之前定义的计数器条件的数值是依旧存在的。

③例:

# 1. 定义重复次数计数器
i = 1

# 2. 使用 while 判断条件
while i <= 5:
    # 要重复执行的代码
    print("Hello Python")

    # 处理计数器 i
    i = i + 1

print("循环结束后的 i = %d" % i)

4、循环计算

(1)在程序开发中,通常会遇到利用循环重复计算的需求,遇到这种需求,可以:

①在while上方定义一个变量,用于存放最终计算结果。

②在循环体内部,每次循环都用最新的计算结果,更新之前定义的变量。

(2)例1:

# 计算 0 ~ 100 之间所有数字的累计求和结果
# 0. 定义最终结果的变量
result = 0

# 1. 定义一个整数的变量记录循环的次数
i = 0

# 2. 开始循环
while i <= 100:
    print(i)

    # 每一次循环,都让 result 这个变量和 i 这个计数器相加
    result += i

    # 处理计数器
    i += 1

print("0~100之间的数字求和结果 = %d" % result)

(3)例2:

# 0. 最终结果
result = 0

# 1. 计数器
i = 0

# 2. 开始循环
while i <= 100:

    # 判断偶数
    if i % 2 == 0:
        print(i)
        result += i

    # 处理计数器
    i += 1

print("0~100之间偶数求和结果 = %d" % result)

5、break和continue

(1)break和continue是专门在循环中使用的关键字。

①break:某一条件满足时,退出循环,不再执行后续重复的代码。

②continue:某一条件满足时,不执行后续重复的代码。

③break和continue只针对当前所在循环有效。

(2)在循环过程中,如果某一个条件满足后,不再希望循环继续执行,可以使用break退出循环。

i = 0

while i < 10:

    # break 某一条件满足时,退出循环,不再执行后续重复的代码
    # i == 3
    if i == 3:
        break

    print(i)

    i += 1

print("over")

(3)在循环过程中,如果某一个条件满足后,不希望执行循环代码,但是又不希望退出循环,可以使用continue。(也就是在整个循环中,只有某些条件,不需要执行循环代码,而其他条件都需要执行)

i = 0

while i < 10:

    # 当 i == 7 时,不希望执行需要重复执行的代码
    if i == 7:
        # 在使用 continue 之前,同样应该修改计数器
        # 否则会出现死循环
        i += 1

        continue

    # 重复执行的代码
    print(i)

    i += 1

6、while循环嵌套

(1)while嵌套就是——while里面还有while。

while 条件 1:

????????条件满足时,做的事情1

????????条件满足时,做的事情2

????????条件满足时,做的事情3

????????...(省略)...

????

????????while 条件 2:

????????????????条件满足时,做的事情1

????????????????条件满足时,做的事情2

????????????????条件满足时,做的事情3

????????????????...(省略)...

????

????????????????处理条件 2

????

????????处理条件 1

(2)循环嵌套演练——九九乘法表:

# 定义起始行
row = 1

# 最大打印 9 行
while row <= 9:
    # 定义起始列
    col = 1

    # 最大打印 row 列
    while col <= row:

        # end = "",表示输出结束后,不换行
        # "\t" 可以在控制台输出一个制表符,协助在输出文本时对齐
        print("%d * %d = %d" % (col, row, row * col), end="\t")

        # 列数 + 1
        col += 1

    # 一行打印完成的换行
    print("")

    # 行数 + 1
    row += 1

四、循环语句——遍历循环

1、遍历循环的格式

for <循环变量> in <遍历结构>:

????????<语句块>

①遍历循环可以理解为从遍历结构中逐一提取元素,放在循环变量中,对于每个所提取的元素执行一次语句块。

②for语句的循环执行次数是根据遍历结构中的元素个数确定的。

③遍历结构可以是字符串、文件、range函数或组合数据类型等,比较常见的是列表和元组。

2、逐一遍历字符串的每个字符

for c in "字符串":
    print(c)

3、使用range函数指定循环次数

# range中的参数为循环次数
for i in range(4):
    print("第%d次循环" % (i + 1))

print("",end="\n")
# 实际上,range函数有两个参数,它返回的是一个元组,其中的元素情况见i的输出
for i in range(1,5):
    print("第%d次循环" % i)

4、遍历循环的扩展模式

for <循环变量> in <遍历结构>:

????????<语句块1>

else:

????????<语句块2>

①当for循环正常执行之后,程序会继续执行else语句中的内容。

②else语句只在循环正常执行没有被break打断的情况下才执行,因此可以在<语句块2>中放置判断循环执行情况的语句。

for i in range(4):
    print("第%d次循环" % (i + 1))
else:
    print("循环正常结束")

print("",end="\n")
for i in range(1,5):
    print("第%d次循环" % i)
    if i == 3:
        break
else:
    print("循环正常结束")

五、程序的异常处理

1、异常的概念

(1)程序在运行时,如果Python解释器 遇到到一个错误(比如缩进错误、除数为0的错误),会停止程序的执行,并且提示一些错误信息,这就是异常。

(2)程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise)异常

(3)程序开发时,很难将所有的特殊情况都处理的面面俱到,不过通过异常捕获可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性。

2、捕获异常

(1)在程序开发中,如果对某些代码的执行不能确定是否正确,可以增加try(尝试)来捕获异常。

(2)捕获异常最简单的语法格式:

try:

????????尝试执行的代码

except:

????????出现错误的处理

①尝试执行的代码是不确定是否能够正常执行的代码。

尝试执行的代码发生异常(有错误)时,执行except保留字后面的语句,程序不会因为该错误而停止运行。

try:
    n = eval(input("请输入一个数字:"))
    print("输入数字的4次方值为:%d" % n ** 4)
except:
    print("输入错误!")  
    # 如果输入的不是数字,n ** 4将会出错,产生异常
    # 此时程序不会终止,而是转来执行except的语句

3、错误类型捕获

(1)在程序执行时,可能会遇到不同类型的异常,并且需要针对不同类型的异常做出不同的响应,这个时候就需要捕获错误类型了。

(2)语法如下:

try:

????????# 尝试执行的代码

????????pass

except 错误类型1:

????????# 针对错误类型1,对应的代码处理

????????pass

except (错误类型2, 错误类型3):

????????# 针对错误类型2 和 3,对应的代码处理

????????pass

except Exception as result:

????????print("未知错误 %s" % result)

注:当Python解释器抛出异常时,最后一行错误信息的第一个单词,就是错误类型。(见第一章中“认识错误”一节)

try:
    num = int(input("请输入整数:"))
    result = 8 / num
    print(result)
except ValueError:
    print("请输入正确的整数")  # 输入字符串会产生ValueError
except ZeroDivisionError:
    print("除 0 错误")  # 输入数字0会产生ZeroDivisionError

4、捕获未知错误

(1)在开发时,要预判到所有可能出现的错误,还是有一定难度的。

(2)如果希望程序无论出现任何错误,都不会因为Python解释器抛出异常而被终止,可以再增加一个except(如下所示)。

except Exception as result:

????????print("未知错误 %s" % result)

5、异常捕获完整语法

try:

????????# 尝试执行的代码

????????pass

except 错误类型1:

????????# 针对错误类型1,对应的代码处理

????????pass

except 错误类型2:

????????# 针对错误类型2,对应的代码处理

????????pass

except (错误类型3, 错误类型4):

????????# 针对错误类型3 和 4,对应的代码处理

????????pass

except Exception as result:

????????# 打印错误信息

????????print(result)

else:

????????# 没有异常才会执行的代码

????????pass

finally:

????????# 无论是否有异常,都会执行的代码

????????print("无论是否有异常,都会执行的代码")

try:
    # 提示用户输入一个整数
    num = int(input("输入一个整数:"))

    # 使用 8 除以用户输入的整数并且输出
    result = 8 / num

    print(result)
except ValueError:
    print("请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)
else:
    print("尝试成功")
finally:
    print("无论是否出现错误都会执行的代码")

print("-" * 50)

6、异常的传递

(1)当函数/方法执行出现异常,会将异常传递给函数/方法的调用一方,如果传递到主程序后仍然没有异常处理,程序才会被终止。

(2)在开发中,可以在主函数中增加异常捕获,而在主函数中调用的其它函数,只要其它函数出现异常,都会传递到主函数的异常捕获中,这样就不需要在代码中增加大量的异常捕获,能够保证代码的整洁。

(3)例:

①定义函数 demo1() 提示用户输入一个整数并且返回

②定义函数 demo2() 调用 demo1()

③在主程序中调用 demo2()

def demo1():
    return int(input("请输入一个整数:"))


def demo2():
    return demo1()

try:
    print(demo2())
except ValueError:
    print("请输入正确的整数")
except Exception as result:
    print("未知错误 %s" % result)

7、抛出异常

(1)在开发中,除了代码执行出错Python解释器会抛出异常之外,还可以根据应用程序特有的业务需求主动抛出异常(程序上没有任何代码错误,但是应用到实际中会出错,这时就需要主动抛出异常)。

(2)Python中提供了一个Exception异常类,在开发时,如果满足特定业务需求时,希望 抛出异常,可以创建一个Exception的对象,然后使用raise关键字抛出异常对象。

(3)例:

①定义 input_password 函数,提示用户输入密码

②如果用户输入长度 < 8,抛出异常

③如果用户输入长度 >=8,返回输入的密码

def input_password():

    # 1. 提示用户输入密码
    pwd = input("请输入密码:")

    # 2. 判断密码长度 >= 8,返回用户输入的密码
    if len(pwd) >= 8:
        return pwd

    # 3. 如果 < 8 主动抛出异常
    print("主动抛出异常")
    # 1> 创建异常对象 - 可以使用错误信息字符串作为参数
    ex = Exception("密码长度不够")

    # 2> 主动抛出异常
    raise ex


# 提示用户输入密码
try:
    print(input_password())
except Exception as result:
    print(result)
文章来源:https://blog.csdn.net/Zevalin/article/details/135433498
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。