注:本章内容有一部分在第二章和第三章中有提及,已提及部分这里可能不再详细复述(比如单分支判断语句和二分支判断语句)。
(1)两个条件同时满足,返回True。
(2)只要有一个不满足,就返回False。
(1)两个条件只要有一个满足,返回True。
(2)两个条件都不满足,返回False。
(1)条件满足,返回False。
(2)条件不满足,返回True。
(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("非公勿内")
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以及各自缩进的代码,看成一个完整的代码块。
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)循环的作用就是让指定的代码重复的执行。
(2)while循环最常用的应用场景就是让执行的代码按照指定的次数重复执行。
(3)死循环:由于程序员的原因,忘记在循环内部修改循环的判断条件,导致循环持续执行,程序无法终止。
(1)自然计数法(从 1 开始)—— 更符合人类的习惯
(2)程序计数法(从 0 开始)—— 几乎所有的程序语言都选择从0开始计数(特殊情况除外)
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)
(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)
(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
(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
for <循环变量> in <遍历结构>:
????????<语句块>
①遍历循环可以理解为从遍历结构中逐一提取元素,放在循环变量中,对于每个所提取的元素执行一次语句块。
②for语句的循环执行次数是根据遍历结构中的元素个数确定的。
③遍历结构可以是字符串、文件、range函数或组合数据类型等,比较常见的是列表和元组。
for c in "字符串":
print(c)
# range中的参数为循环次数
for i in range(4):
print("第%d次循环" % (i + 1))
print("",end="\n")
# 实际上,range函数有两个参数,它返回的是一个元组,其中的元素情况见i的输出
for i in range(1,5):
print("第%d次循环" % i)
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)程序在运行时,如果Python解释器 遇到到一个错误(比如缩进错误、除数为0的错误),会停止程序的执行,并且提示一些错误信息,这就是异常。
(2)程序停止执行并且提示错误信息这个动作,我们通常称之为:抛出(raise)异常。
(3)程序开发时,很难将所有的特殊情况都处理的面面俱到,不过通过异常捕获可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性。
(1)在程序开发中,如果对某些代码的执行不能确定是否正确,可以增加try(尝试)来捕获异常。
(2)捕获异常最简单的语法格式:
try:
????????尝试执行的代码
except:
????????出现错误的处理
①尝试执行的代码是不确定是否能够正常执行的代码。
②尝试执行的代码发生异常(有错误)时,执行except保留字后面的语句,程序不会因为该错误而停止运行。
try:
n = eval(input("请输入一个数字:"))
print("输入数字的4次方值为:%d" % n ** 4)
except:
print("输入错误!")
# 如果输入的不是数字,n ** 4将会出错,产生异常
# 此时程序不会终止,而是转来执行except的语句
(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
(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)
(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)
(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)