Python 不仅支持 if 语句相互嵌套,while 和 for 循环结构也支持嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,如for里面还有for,while里面还有while,甚至while中有for或者for中有while也都是允许的。
寻找规律写循环
循环嵌套的规律
for循环可以简化程序中重复的代码。
for语句的格式如下:
for i in range(重复次数):
下级代码
for i in range(3): #外层循环变量
for j in range(i): #内层循环变量
print('up')
print('walk')
print('get')
外循环变量i是一个变化的值,变化的规律是0,1,2,刚好 与print(‘up’)每次要被执行的次数一致。我们就可以通过外层 循环变量i,来控制内循环的循环次数,完成操作。
print()命令拓展
end 是print()命令的一个参数,用来设定打印结果以什么结尾。
print(打印内容,end = 结尾内容 )
省略参数end时,默认end = ‘\n’,\n是换行符,所以执行 print()命令会默认换行。我们可以把end设为其他字符串。
print(1)
print(2)
省略end参数,打印默认换行。运行结果:
1
2
print(1, end = '')
print(2)
让end等于空字符串, 打印时不会换行。运行结果:
12
print(1, end = '*')
print(2)
让end等于星号*, 打印时会以*结尾。运行结果:
1*2
for循环嵌套的应用
打印图形
for i in range(4):
for j in range(5):
print('*', end = '')
print()
外循环:控制打印哪一行
内循环:打印一行中的每个星号
*****
*****
*****
*****
for i in range(5):
for j in range(i + 1):
print('*', end = '')
print()
利用循环变量控制每行星号的个数
*
**
***
****
*****
for i in range(5):
for j in range(i + 1):
print('*', end = '')
print()
for i in range(4):
for j in range(4 - i):
print('*', end = '')
print()
分成上下2个三角形
*
**
***
****
*****
****
***
**
*
循环嵌套中的continue
continue语句可以结束当前一次循环,直接进入下一次循环。它的控制范围是有限的,只能控制一层循环。
for i in range(4):
print('next')
for j in range(3):
print('yellow')
print('red')
if i == 2:
continue
print('green')
i=2 时,执行continue语句,跳过print(‘green’), 继续执行下一次外循环。
for i in range(4):
print('next')
for j in range(3):
print('yellow')
if i == 1:
continue
print('red')
print('green')
i=1时,执行continue语句,跳过print(‘red’),继续执行下一次内循环。
内循环中的continue语句,只会结束当前的一次内循环,继续执行下一次内循环,不会影响到外循环中其他下级代码的执行。
循环嵌套中的break
遍历列表
列表的索引是从0开始的。
遍历列表:把列表中的元素,从头到尾一个一个地取出来使用。
data = ['X', 'W', 'Z']
for z in data:
print(z)
z的值是data列表中的元素。
循环嵌套中的break
使用break语句可以结束循环。 在一个有多层循环嵌套的结构中,break的位置,决定了它能结束哪个循环。
for j in range(3):
for k in range(3):
print('小王')
break
print('小王子')
break
print('你好')
小王
小王子
你好
第一处break语句是内层for循环的下级代码,当程序 执行这个break语句时,只会结束内层for循环,继续执行print(‘小王子’)
第二处break语句是外层for循环的下级代码,当程序执 行这个break语句时,会结束外层for循环,继续执 行print(‘你好’)。
要分析出break会结束哪个循环,我们可以把每一层的循环结构看做一个整体,观察break语句,它 在哪一层,就会结束哪一层循环。
标志变量的使用
可以使用一个标志变量flag,来记录不同的状态。
flag=0,表示列表中有字母E
flag=1,表示列表中没有字母E
data = input().split()
flag = 0 #初始化,没有字母E
for d in data:
print(d)
if d == 'E':
flag = 1
break
print(flag)
当条件成立时,表示列表中 有字母E,把flag设置为1, 再终止内层循环。
当输入为:G E Q时, 运行结果为:
G
E
1
输入为:G F Q时, 运行结果为:
G
F
Q
0
综合应用
在for循环嵌套中同时使用标志变量和break语句。
flag = 0
for i in range(3):
print('go')
for j in range(4):
if i == 1 and j == 2
print('Apple')
flag = 1
break
if flag == 1
break
print('end')
内循环:当i=1并且j=2时,打印Apple,把flag设置为1,再执行break,会结束内循环。
go
go
Apple
end
外循环:当flag=1时,会执行break,结束外循环。
标志变量一般用来记录不同的状态。 break语句可以结束它所在的那个循环。
项目分析
说明
每次运行程序,随机生成一个三位密码,用户猜出正确的密码即为成功。
用户可以多次输入,每当输入错误时,程序会分别对每一位数字给出提示,用户需要根据提示信息推测出正确的密码。
生成密码
生成三位的随机密码,每一位是0-9中的一个数字,三个数字各不相同。实现步骤:
- 创建列表,存储0-9 [‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9’]
- 打乱列表 [‘8′,’1′,’3′,’5′,’6′,’0′,’9′,’4′,’7′,’2’]
- 组合密码 ‘813’
代码实现:
import random #导入random库,才能使用shuffle()函数
numbers = ['0','1','2','3','4','5','6','7','8','9']
random.shuffle(numbers) #打乱列表numbers中的元素顺序
password = numbers[0] + numbers[1] + numbers[2]
shuffle( )是random库中的函数,它可以让列表中的所有元素随机排列。
使用时先导入random库
import random
random.shuffle(列表名)
判断输入是否正确
生成密码以后,系统需要接收用户的输入,并判断输入的密码是否正确。
代码实现
import random
numbers = ['0','1','2','3','4','5','6','7','8','9']
random.shuffle(numbers)
password = numbers[0] + numbers[1] + numbers[2]
while True:
guess = input('请输入三位数密码:')
if guess == password:
print('密码正确')
break
输入正确时,break语句结束while循环。
错误提示信息
用户输入错误时,需要针对每一位数字给出提示信息:
- 这一位数字正确,提示“正确”;
- 数字应该在密码的其他位置上,提示“在其他位置”;
- 数字不是密码中的任何一个数字,会提示“错误”。
代码实现:
while True:
guess = input('请输入三位数密码:')
if guess == password:
print('密码正确')
break
else:
for i in range(3):
if guess[i] == password[i]:
print(guess[i], '正确')
elif guess[i] in password:
print(guess[i],'在其他位置')
else:
print(guess[i],'错误')
判断数字属于哪种情况,并给出对应提示。
项目优化
优化1:检查输入是否是三位数
while True:
guess = input('请输入三位数密码:')
if len(guess) != 3:
print('输入格式错误')
continue
输入以后,先判断输入,位数错误跳出本次循环,继续下一轮输入。
优化2:猜测次数限制,成功失败效果
times = 5
unlock = 0
while times > 0:
if guess == password:
print('密码正确')
unlock = 1
break
程序最后,通过unlock的值判断是否解锁成功:
if unlock == 1:
print('解锁成功!')
print('^O^')
else:
print('解锁失败!')
print('*_*')