条件语句
1.if
语句基本语法
if 要判断的条件:条件成立时,要做的事情……else:条件不成立时,要做的事情……
案例演示
# 1. 输入用户年龄age = int(input("今年多大了?"))?# 2. 判断是否满 18 岁# if 语句以及缩进部分的代码是一个完整的语法块if age >= 18:print("可以进网吧上网……")else:print("你的年龄尚未满足,应该回家写作业!")?# 3. 无论条件是否满足都会执行print("Ok")
注意:
if
和else
语句以及各自的缩进部分共同是一个 完整的代码块。并且条件判断中表达式可以与and
,or
,not
结合实现多重判断
2.if
进阶
2.1if-elif-else
基本语法
if 条件1:条件1满足执行的代码……elif 条件2:条件2满足时,执行的代码……elif 条件3:条件3满足时,执行的代码……else:以上条件都不满足时,执行的代码……
注意:
elif
和else
都必须和if
联合使用,而不能单独使用。可以将if
、elif
和else
以及各自缩进的代码,看成一个 完整的代码块
案例演示
holiday_name = "平安夜"?if holiday_name == "情人节":print("买玫瑰")print("看电影")elif holiday_name == "平安夜":print("买苹果")print("吃大餐")elif holiday_name == "生日":print("买蛋糕")else:print("每天都是节日啊……")
2.2if
嵌套
if 的嵌套 的应用场景就是:在之前条件满足的前提下,再增加额外的判断
基本语法
if 条件 1:条件 1 满足执行的代码……if 条件 1 基础上的条件 2:条件 2 满足时,执行的代码…… else:条件 2 不满足时,执行的代码else:条件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.3assert
关键字
assert
这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssertionError
的异常。
assert (3 > 5)print("hello")
注意:在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。
循环语句
3.while
循环
基本语法
while 布尔表达式:代码块
注意:while代码块会一直执行下去,直到布尔表达式为False。且布尔表达式为非0数值时,则视为True,为0时,视为False。
案例演示
result = 0 i = 0while i <= 100:if i % 2 == 0:result += ii += 1print("0~100之间偶数求和结果 = %d" % result)
4.while-else
循环
基本语法
while 条件:条件成立重复执行的代码 else:循环正常结束之后要执行的代码
案例演示
# 循环正常结束,else后执行 i = 1 while i <= 5:print("hello world")i += 1 else:print("你好 世界") """ 输出结果: hello world hello world hello world hello world hello world 你好 世界 """
# 循环非正常结束,else后不执行,continue视为正常结束 i = 1 while i <= 5:if i == 3:break # 跳出while循环print("hello world")i += 1 else:print("你好 世界") """ 输出结果: hello world hello world """
5.for
循环
for循环是迭代循环,在Python中相当于一个通用的序列迭代器,可以遍历任何有序序列,如str
、list
、tuple
等,也可以遍历任何可迭代对象,如dict
。
基本语法
for 迭代变量 in 可迭代对象:代码块
每次循环,迭代变量被设置为可迭代对象的当前元素,提供给代码块使用。
案例演示
遍历字符串
str1 = "hellokitty" for item in str1:print(item, end='\t')
遍历列表
name_list = ['Tom', 'Alice', 'Tony', 'Smith'] # 1.直接遍历 for name in name_list:print(name, end=' ') # 2.下标遍历 for i in range(len(name_list)):print(name_list[i], end=' ')
遍历字典
alien_0 = {'color': 'green','points': 5} # 遍历字典的key for key in alien_0.keys():print(key)# 遍历字典的value for value in alien_0.values():print(value)# 遍历字典键值对 for item in alien_0.items():print(item)# 使用for循环搭配items方法分开遍历键值对 for key, value in alien_0.items():print("Key: " + key)print("Value: " + str(value))
6.for-else
循环
基本语法
for 迭代变量 in 可迭代对象:代码块 else:代码块
注意:
for
循环正常执行完的情况下,执行else
输出,如果for
循环中执行了跳出循环的语句,比如break
,将不执行else
代码块的内容,与while - else
语句一样。
案例演示
for num in range(10, 20): # 迭代 10 到 20 之间的数字for i in range(2, num): # 根据因子迭代if num % i == 0: # 确定第一个因子j = num / i # 计算第二个因子print('%d 等于 %d * %d' % (num, i, j))break # 跳出当前循环else: # 循环的 else 部分print(num, '是一个质数')
7.Python
内置函数
7.1range
函数
基本语法
range(start,end,step) # 生成从start到end的数字,步长为step,供for循环使用,前闭后开
案例演示
for i in range(1, 10, 3):print(i)
7.2enumerate
函数
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标。
基本语法
enumerate(sequence, [start=0]) """ sequence -- 一个序列、迭代器或其他支持迭代对象。 start -- 下标起始位置。 返回 enumerate(枚举) 对象 """
案例演示
name_list = ['Tom', 'Alice', 'Tony', 'Smith'] number_tuple = (1, 4, 5, 7, 8) # 默认下标起始位置为0 print(list(enumerate(name_list))) # [(0, 'Tom'), (1, 'Alice'), (2, 'Tony'), (3, 'Smith')] # 默认下标起始位置为2 print(tuple(enumerate(number_tuple, start=2))) # ((2, 1), (3, 4), (4, 5), (5, 7), (6, 8))
enumerate
函数和for
循环结合使用基本语法
用
enumerate(A)
不仅返回了A
中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用enumerate(A, j)
还可以确定索引起始值为j
。
for i, a in enumerate(A)do something with a
案例演示
name_list = ['Tom', 'Alice', 'Tony', 'Smith']for i, name in enumerate(name_list, 1):print('number=' + str(i) + ' name=' + name) """ 输出结果: number=1 name=Tom number=2 name=Alice number=3 name=Tony number=4 name=Smith """
8.break
语句
在循环过程中,如果 某一个条件满足后,不 希望 循环继续执行,可以使用 break
退出循环
案例演示
i = 0while i < 10:# break 某一条件满足时,退出循环,不再执行后续重复的代码# i == 3if i == 3:breakprint(i)i += 1print("over") """ 输出结果: 0 1 2 over """
9.continue
语句
在循环过程中,如果 某一个条件满足后,不 希望 执行循环代码,但是又不希望退出循环,可以使用 continue
案例演示
i = 0while i < 10:# 当 i == 7 时,不希望执行需要重复执行的代码if i == 7:# 在使用 continue 之前,同样应该修改计数器# 否则会出现死循环i += 1continue# 重复执行的代码print(i)i += 1 """ 输出结果: 0 1 2 3 4 5 6 8 9 """
10.推导式
10.1列表推导式
基本语法
[ expr for value in collection [if condition] ]
案例演示
list1 = [i for i in range(10) if i % 2 == 0] print(list1) # [0, 2, 4, 6, 8]list2 = [(i, j) for i in range(1, 3) for j in range(3)] print(list2) # [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]list3 = [[i, j] for i in range(0, 3) for j in range(0, 3)] print(list3) # [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]list3[0][1] = 10 # 此处可看作是二维数组 print(list3) # [[10, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]a = [(i, j) for i in range(0, 3) if i < 1 for j in range(0, 3) if j > 1] print(a) # for i in range(0, 3): # if i < 1: # for j in range(0, 3): # if j > 1: # print(i, j)# [(0, 2)]
10.2元组推导式
基本语法
( expr for value in collection [if condition] )
案例演示
a = (x for x in range(10)) print(a) # 返回一个generator对象 <generator object <genexpr> at 0x000001B0EEFC8390> print(tuple(a)) # (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 每访问一个元素,generator对象中删除一个对象 print(list(a)) # []
10.3字典推导式
基本语法
{ key_expr: value_expr for key, value in collection [if condition] }
案例演示
counts = {'BMP': 268, 'HP': 125, 'DELL': 201, 'Lenovo': 199, 'acer': 99} # 需求:提取上述电脑数量大于等于200的字数据 count1 = {key: value for key, value in counts.items() if value >= 200} print(count1)
10.4集合推导式
基本语法
{ expr for value in collection [if condition] }
案例演示
list1 = [1, 1, 2] set1= {i ** 2 for i in list1} print(set1) #{1, 4},set不包含重复元素
11.综合例子
passwdList = ['123', '345', '890'] # 密码列表 valid = False # 初始密码状态为False count = 3 # 输入密码次数 while count > 0:password = input('enter password:')for item in passwdList: # 用于遍历密码列表# 如果输入的密码在密码列表中,则更新密码状态为True,并且跳出for循环,结束此次遍历密码列表if password == item: valid = Truebreak# 此处用于判断倘若输入的密码不在密码列表中,则密码状态无法更新,仍会为False,请给出友好提示,并进行密码次数-1,结束当前while循环,继续下一次while循环输入密码 ,如果三次机会使用完毕,输入密码不在密码列表中,则会因为count不满足大于0跳出while循环 if not valid:print('invalid input')count -= 1continue# 当输入密码在密码列表中,密码状态更新为True,此时不应再继续执行while循环继续输入密码,使用break跳出while循环else:break
12.练习题
编写一个Python程序来查找那些既可以被7整除又可以被5整除的数字,介于1500和2700之间。
for num in range(1500, 2701):if (num % 7 == 0) and (num % 5 == 0):print(num, end=' ')
龟兔赛跑题目描述:
话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比中,一旦任一秒结束后兔子发现自己领先t米或以 上,它们就会停下来休息s秒。对于不同的兔子,
t
,s
的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度
v1
(表示每秒兔子能跑v1
米),乌龟的速度v2
,以及兔子对应的t
,s
值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找 到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1
,v2
,t
,s
,l
,预测该场比赛的结果。输入:
输入只有一行,包含用空格隔开的五个正整数
v1
,v2
,t
,s
,l
,其中(v1
,v2
< =100;t
< =300;s
< =10;l
< =10000且为v1
,v2
的公倍数)输出:
输出包含两行,第一行输出比赛结果——一个大写字母“T”或“R”或“D”,分别表示乌龟获胜,兔子获胜,或者两者同时到达终点。
第二行输出一个正整数,表示获胜者(或者双方同时)到达终点所耗费的时间(秒数)。
样例输入:10 5 5 2 20样例输出D 4
""" v1 兔子速度 v2 乌龟速度 s1 兔子路程 s2 乌龟路程 i 获胜者时间秒数 """ v1, v2, t, s, l = map(int, input().split()) if v1 <= 100 and v2 <= 100 and t <= 300 and s <= 10 and l <= 10000 and l % v1 == 0 and l % v2 == 0:s1, s2, i = 0, 0, 0while s1 < l and s2 < l:s1, s2, i = v1+s1, v2+s2, i+1if s1 == l or s2 == l:breakelif s1-s2 >= t:s2, i = s2 + v2 * s, i+sif s1 > s2:print('R')if s1 == s2:print('D')if s1 < s2:print('T')print(i)