一、逻辑运算
1、逻辑运算符回顾
运算符 | 逻辑表达式 | 描述 |
and | x and y | 只有x和y的值都为True,才会返回True,否则返回False |
or | x or y | 只要x或y的值为True,就会返回True,否则返回False |
not | not x | 如果x为True,则返回False,否则返回True |
2、举例
(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、多分支语句
(1)多分支语句的基本结构:
if 条件表达式1:
条件1满足执行的代码
……
elif 条件表达式2:
条件2满足时,执行的代码
……
elif 条件表达式3:
条件3满足时,执行的代码
……
else:
以上条件都不满足时,执行的代码
……
①elif和else都必须和if联合使用,而不能单独使用。
②可以将if、elif 和else以及各自缩进的代码,看成一个完整的代码块。
③下图所示的是多分支语句的控制结构示意图。
(2)举例:
holiday_name = "平安夜" if holiday_name == "情人节": print("买玫瑰") print("看电影") elif holiday_name == "平安夜": print("买苹果") print("吃大餐") elif holiday_name == "生日": print("买蛋糕") else: print("每天都是节日啊……")2、if语句的嵌套
(1)嵌套if语句的基本结构:
if 条件表达式1:
条件1满足执行的代码
……
if 条件表达式2:
条件1和条件2均满足时,执行的代码
……
# 条件2不满足的处理
else:
条件1满足但条件2不满足时,执行的代码
# 条件1不满足的处理
else:
条件1不满足时,执行的代码
……
(2)举例:
①例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("电脑胜出!")三、循环语句——条件循环
1、while循环基本使用
(1)while循环最常用的应用场景就是让指定的代码按照指定的次数重复执行。
(2)死循环:由于程序员的原因,忘记在循环内部修改循环的判断条件,导致循环持续执行,程序无法终止。
2、条件循环
(1)条件循环的基本结构:
while(<条件>):
<语句块1> # while语句以及缩进部分是一个完整的代码块
<语句块2>
①当条件为True(真)时,执行语句块1,然后再次判断条件,当条件为False(假)时,退出循环执行语句块2。
②举例:
# 1. 定义重复次数计数器 i = 1 # 2. 使用 while 判断条件 while i <= 5: # 要重复执行的代码 print("Hello Python") # 处理计数器 i i = i + 1 print("循环结束后的 i = %d" % i)3、循环计算
(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)4、break和continue
(1)在循环体中,如果某一个条件满足后,不再希望循环继续执行,可以使用break关键字退出循环(仅退出一层循环体)。
i = 0 while i < 10: # break 某一条件满足时,退出循环体,不再执行循环体后续的代码 # i == 3 if i == 3: break print(i) i += 1 print("over")(2)在循环体中,如果某一个条件满足后,希望本轮循环不执行循环体后续的语句,然后马上开始判断下一轮循环是否继续,可以使用continue关键字提前结束本轮循环。
i = 0 while i < 10: # 当 i == 7 时,不希望执行需要重复执行的代码 if i == 7: # 在使用 continue 之前,同样应该修改计数器 # 否则会出现死循环 i += 1 continue # 重复执行的代码 print(i) i += 15、while循环嵌套
(1)while嵌套就是——while里面还有while。
while 条件1表达式:
条件1满足时,做的事情1
条件1满足时,做的事情2
条件1满足时,做的事情3
...(省略)...
while 条件2表达式:
条件2满足时,做的事情1
条件2满足时,做的事情2
条件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(a,b,s):从a到b(不含b)以s为步长产生一个序列。
①当只有一个参数x时,range返回序列(0,1,…,x-1)。
②当只有两个参数x、y(x<y)时,range返回序列(x,x+1,…,y-1)。
for i in range(4): print("第%d次循环" % (i + 1)) print("",end="\n") 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会产生ZeroDivisionError4、捕获未知错误
(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)