tongsiying

阅读|运动|自律

0%

第4篇:循环语句

本节目标

掌握Python循环语句的知识点及应用

循环结构就是程序中控制某条或某些指令重复执行的结构。在Python中构造循环结构有两种做法,一种是for-in循环,一种是while循环。

一、while循环

1. 语法格式

1
2
3
4
5
while 判断条件(condition):# 自动将表达式的值会直接转为布尔类型 即会判断 bool(表达式) 的值
执行语句(statements)…… # 当值为True时,会执行循环体,否则退出循环

while 条件:
条件满足的时候执行的事情
  • while的循环的基本格式为while后加一个空格,然后加一个判断条件,判断条件的值为布尔类型,若为True,则执行循环体的执行语句,反之,循环结束,不执行循环体。

  • 判断条件可以是任何类型的条件表达式,任何非零、非空的值均为True。

  • 注意冒号和缩进

  • 执行流程

2. 小案例

请实现一个用户登录系统,如果密码错误则反复提示让用户重新输入,直到输入正确才停止。

1
2
3
4
5
6
7
8
9
10
11
12
13
print("开始运行超级无敌系统")

flag = True
while flag:
user = input("请输入用户名:")
pwd = input("请输入密码:")
if user == "zhangyafei" and pwd == "666666":
print("登录成功")
flag = False
else:
print("用户名或密码错误")

print("系统结束")

知识点:通过改变表达式的真假可以控制循环体是否执行和跳出循环

break

break,用于在while循环中帮你终止循环,跳出整个循环体,即使表达式的值为真。

1
2
3
4
5
6
7
8
9
10
print("开始运行系统")
while True:
user = input("请输入用户名:")
pwd = input("请输入密码:")
if user == 'zhangyafei' and pwd = "666666":
print("登录成功")
break
else:
print("用户名或密码错误,请重新登录")
print("系统结束")

所以,以后写代码时候,想要结束循环可以通过两种方式实现了,即:条件判断 和 break关键字,两种在使用时无好坏之分,只要能实现功能就行。

continue

continue,在循环中用于 结束本次循环,开始下一次循环。

1
2
3
4
5
6
7
8
9
# 打印1-10中的奇数
print("开始")
i = 1
while i <= 10:
if i % 2 == 0:
continue
print(i)
i = i + 1
print("结束")

对于break和continue都是放在循环语句中用于控制循环过程的,一旦遇到break就跳出整个循环体,停止所有循环,一旦遇到continue就停止本次循环,开始下次循环。当然,通过如果没有了break和continue,我们用while条件的判断以及其他协助也能完成很多功能,有了break和continue可以在一定程度上简化我们的代码逻辑。

while else

  • 基本格式

    1
    2
    3
    4
    while <expr>(条件表达式):
    <statement(s)>
    else:
    <additional_statement(s)>
  • else执行的时机

    • 当while循环是因为表达式的布尔值为假终止循环时,执行else,可以理解为while正常结束循环,要执行else。
    • 当while循环是因为break终止循环时的时候,不执行else,可以理解为while异常结束循环,不执行else。
  • 示例:提示用户输入用户名和密码 输入正确打印其输入正确 最多输三次 若超过三次 则提示重试

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    num = 1
    while num <= 3:
    name = input('请输入用户名:')
    pwd = input('请输入密码:')
    if name == '保国' and pwd == '55555':
    print('输入正确')
    break
    print(f'用户名或密码错误,请重新输入,还剩{3 - num}次机会')
    num += 1
    else: # 当while根据条件语句正常结束循环的时候,执行else
    print('输入用户名和密码次数超过三次,请一小时后重试。')
  • 示例:猜数字游戏。规则是计算机出一个1到100之间的随机数,玩家输入自己猜的数字,计算机给出对应的提示信息(大一点、小一点或猜对了),如果玩家猜中了数字,计算机提示用户一共猜了多少次,游戏结束,否则游戏继续。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    import random

    answer = random.randint(1, 100)
    counter = 0
    while True:
    counter += 1
    number = int(input('请输入数字【1-100】: '))
    if number < answer:
    print(f'{number} 小了,请重新输入')
    elif number > answer:
    print(f'{number} 大了,请重新输入')
    else:
    print('恭喜你猜对了!')
    break
    print(f'你总共猜了{counter}次')
    if counter > 7:
    print('你的智商余额明显不足')

    上面的代码中使用了break关键字来提前终止循环,需要注意的是break只能终止它所在的那个循环,这一点在使用嵌套的循环结构(下面会讲到)需要引起注意。除了break之外,还有另一个关键字是continue,它可以用来放弃本次循环后续的代码直接让循环进入下一轮。

二、for循环

1. 语法格式

1
2
3
4
for <variable> in <sequence>:
<statements>
else:
<statements>
  • for循环又称for-in循环,基本语法格式为for+空格+序列的元素+in+序列+冒号,下面统一缩进的代码块为循环体。

  • 序列表示Python中的容器,包含字符串、列表、元组、字典、集合等。

  • 执行流程

2. 循环示例

  • 循环字符串

    1
    2
    3
    motto = 'Life is short, I use Python!'
    for ch in motto:
    print(ch)
  • 循环列表

    1
    2
    3
    names = ['乔丹', '科比', '詹姆斯', '奥尼尔', '邓肯']
    for name in names:
    print(name)
  • 循环元组

    1
    2
    3
    names = ('乔丹', '科比', '詹姆斯', '奥尼尔', '邓肯')
    for name in names:
    print(name)
  • 循环字典

    1
    2
    3
    4
    5
    6
    names = {'控卫': '乔丹', '分位': '科比', '小前锋': '詹姆斯', '中锋': '奥尼尔', '大前锋': '邓肯'}
    for postion in names:
    print(postion, names[postion])

    for postion, name in names.items():
    print(postion, names[postion])
  • 循环集合

    1
    2
    3
    names = {'乔丹', '科比', '詹姆斯', '奥尼尔', '邓肯'}
    for name in names:
    print(name)

break、continue和else

for循环中的break、continue和else用法和while循环中一样,break是跳出整个循环,continue是跳出当前循环,else是当for循环是因为break跳出循环时,不执行else语句,反之,执行else语句。

示例:输入两个正整数,计算它们的最大公约数和最小公倍数。

提示:两个数的最大公约数是两个数的公共因子中最大的那个数;两个数的最小公倍数则是能够同时被两个数整除的最小的那个数。

1
2
3
4
5
6
7
8
9
10
11
12
x = int(input('x = '))
y = int(input('y = '))
# 如果x大于y就交换x和y的值
if x > y:
# 通过下面的操作将y的值赋给x, 将x的值赋给y
x, y = y, x
# 从两个数中较的数开始做递减的循环
for factor in range(x, 0, -1):
if x % factor == 0 and y % factor == 0:
print(f'{x}{y}的最大公约数是{factor}')
print(f'{x}{y}的最小公倍数是{x * y // factor}')
break

range

  • 语法格式

    1
    range(start, stop[, step])
  • 参数说明:

    • start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
    • stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
    • step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
  • 示例1:下面代码中计算1~100求和的结果。

    1
    2
    3
    4
    sum = 0
    for x in range(101):
    sum += x
    print(sum)

    需要说明的是上面代码中的range(1, 101)可以用来构造一个从1到100的范围,当我们把这样一个范围放到for-in循环中,就可以通过前面的循环变量x依次取出从1到100的整数。当然,range的用法非常灵活,下面给出了一个例子:

    • range(101):可以用来产生0到100范围的整数,需要注意的是取不到101。
    • range(1, 101):可以用来产生1到100范围的整数,相当于前面是闭区间后面是开区间。
    • range(1, 101, 2):可以用来产生1到100的奇数,其中2是步长,即每次数值递增的值。
    • range(100, 0, -2):可以用来产生100到1的偶数,其中-2是步长,即每次数字递减的值。
  • 示例2:实现1-100之间的偶数求和。

    1
    2
    3
    4
    sum = 0
    for x in range(2, 101, 2):
    sum += x
    print(sum)

    当然,也可以通过在循环中使用分支结构的方式来实现相同的功能,代码如下所示。

    1
    2
    3
    4
    5
    sum = 0
    for x in range(1, 101):
    if x % 2 == 0:
    sum += x
    print(sum)
  • 在for循环中使用range和容器相结合

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sites = ["Baidu", "Google","Xiaomi","Taobao", 'Tencent']
    for i in range(len(sites)):
    print(i, sites[i])

    输出:
    0 Baidu
    1 Google
    2 Xiaomi
    3 Taobao
    4 Tencent

三、循环嵌套

1. while循环嵌套

1
2
3
4
5
6
7
8
9
10
11
while expression:
while expression:
statement(s)
statement(s)

while 条件:
条件满足的时候做的事情1
条件满足的时候做的事情2
。。。。
while 条件2:
条件2 满足的时候做的事情。。。。

示例:99乘法表

1
2
3
4
5
6
7
8
i = 1
while i <= 9:
j = 1
while j <= i:
print(f'{i}*{j}={i*j:<2}', end=' ')
j += 1
print()
i += 1

输出

1
2
3
4
5
6
7
8
9
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

2. for循环嵌套

1
2
3
4
for iterating_var in sequence:
for iterating_var in sequence:
statements(s)
statements(s)

示例:99乘法表

1
2
3
4
for i in range(1, 10):
for j in range(1, i + 1):
print(f'{i}*{j}={i*j:<2}', end=' ')
print()

输出

1
2
3
4
5
6
7
8
9
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81

四、简单小结

经过上面的学习,知道了Python中有whilefor循环两种循环语句,那么这两种循环语句有什么区别或者说具体应用场景有什么不同呢?

  • 如果明确的知道循环执行的次数或者要对一个容器进行迭代,那么我们推荐使用for-in循环,
  • 如果要构造不知道具体循环次数的循环结构,我们推荐使用while循环。while循环通过一个能够产生或转换出bool值的表达式来控制循环,表达式的值为True则继续循环;表达式的值为False则结束循环。

五、最佳练习

练习1:输入一个正整数判断是不是素数。

提示:素数指的是只能被1和自身整除的大于1的整数。

参考答案1:

1
2
3
4
5
6
7
8
9
10
11
12
13
from math import sqrt

num = int(input('请输入一个正整数: '))
end = int(sqrt(num))
is_prime = True
for x in range(2, end + 1):
if num % x == 0:
is_prime = False
break
if is_prime and num != 1:
print('%d是素数' % num)
else:
print('%d不是素数' % num)

参考答案2:

1
2
3
4
5
6
7
8
9
10
11
12
13
from math import sqrt

num = int(input('请输入一个正整数: '))
if num == 1:
print('1是素数')
else:
end = int(sqrt(num))
for x in range(2, end + 1):
if num % x == 0:
print(f'{num}不是素数')
break
else:
print(f'{num}是素数')

练习2:打印如下所示三角形图案

1
2
3
4
5
*
**
***
****
*****
1
2
3
4
5
    *
**
***
****
*****
1
2
3
4
5
    *
***
*****
*******
*********

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
row = int(input('请输入行数: '))
for i in range(row):
for _ in range(i + 1):
print('*', end='')
print()


for i in range(row):
for j in range(row):
if j < row - i - 1:
print(' ', end='')
else:
print('*', end='')
print()

for i in range(row):
for _ in range(row - i - 1):
print(' ', end='')
for _ in range(2 * i + 1):
print('*', end='')
print()

练习3:猜数字游戏【限制次数】

要求:随机生成一个1-100的数字,允许用户最多尝试10次,10次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出。

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random

num = random.randint(1, 100) # 随机生成一个1-100的整数
times = 1
while times <= 10:
num2 = int(input('请输入数字【1-100】(共10次机会):'))
if num2 == num:
print('恭喜你,猜对了。')
break
elif num2 < num:
print(f'{num2} 小了,请重新输入,您还剩{10 - times}次机会')
else:
print(f'{num2} 大了,请重新输入,您还剩{10 - times}次机会')
times += 1
else:
print('很遗憾,您已经浪费了太多机会了,下次再来吧!')

练习4:猜数字游戏升级版

要求:允许用户最多尝试5次,每尝试5次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y,就继续让其猜5次,以此往复,如果回答N,就退出程序,如何猜对了,就直接退出。

参考答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import random

num = random.randint(1, 100) # 随机生成一个1-100的整数

total_times, times = 5, 1
while True:
if times > total_times:
print('很遗憾,您的机会已经使用完了!')
res = input('还想玩【回复Y】退出并查看正确数字【回复N】:')
if res == 'Y':
times = 1
continue
elif res == 'N':
print(f'已退出,正确数字是{num},欢迎下次再来!')
break
num2 = int(input(f'请输入数字【1-100】(共{total_times}次机会):'))
print(total_times, times)
if num2 == num:
print('恭喜你,猜对了。')
break
elif num2 < num:
if times != total_times:
print(f'{num2} 小了,请重新输入,您还剩{total_times - times}次机会')
else:
print(f'{num2} 小了')
else:
if times != total_times:
print(f'{num2} 大了,请重新输入,您还剩{total_times - times}次机会')
else:
print(f'{num2} 大了')
times += 1
赞赏一下吧~