当前位置: 代码迷 >> 综合 >> Task2-条件循环语句.
  详细解决方案

Task2-条件循环语句.

热度:45   发布时间:2024-01-31 09:18:53.0

条件语句

1.if语句基本语法

if 要判断的条件:条件成立时,要做的事情……else:条件不成立时,要做的事情……
  • 案例演示

# 1. 输入用户年龄age = int(input("今年多大了?"))?# 2. 判断是否满 18 岁# if 语句以及缩进部分的代码是一个完整的语法块if age >= 18:print("可以进网吧上网……")else:print("你的年龄尚未满足,应该回家写作业!")?# 3. 无论条件是否满足都会执行print("Ok")

注意:ifelse 语句以及各自的缩进部分共同是一个 完整的代码块。并且条件判断中表达式可以与andornot结合实现多重判断

2.if进阶

2.1if-elif-else

  • 基本语法

if 条件1:条件1满足执行的代码……elif 条件2:条件2满足时,执行的代码……elif 条件3:条件3满足时,执行的代码……else:以上条件都不满足时,执行的代码……

注意:elifelse 都必须和 if 联合使用,而不能单独使用。可以将 ifelifelse 以及各自缩进的代码,看成一个 完整的代码块

  • 案例演示

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")

TIM截图20200723090914

注意:在进行单元测试时,可以用来在程序中置入检查点,只有条件为 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中相当于一个通用的序列迭代器,可以遍历任何有序序列,如strlisttuple等,也可以遍历任何可迭代对象,如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.练习题

  1. 编写一个Python程序来查找那些既可以被7整除又可以被5整除的数字,介于1500和2700之间。

    for num in range(1500, 2701):if (num % 7 == 0) and (num % 5 == 0):print(num, end=' ')
  2. 龟兔赛跑题目描述:

    话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比中,一旦任一秒结束后兔子发现自己领先t米或以 上,它们就会停下来休息s秒。对于不同的兔子,ts的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。

    然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1 米),乌龟的速度v2,以及兔子对应的ts值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找 到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1v2tsl,预测该场比赛的结果。

    输入:

    输入只有一行,包含用空格隔开的五个正整数v1v2tsl,其中(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)