十一、for语句
循环结构中 的for 语法:
for 变量名 in 集合:
(tab)语句
for循环语句中写语句之前要有一个tab键的缩进!
应用场景:
1、比如在if结构(上一篇博文中),猜大小的游戏-------》反复地猜
2、设置的游戏,在lv2充值时-------------------------》反复地充值,直到充值成功(满足充值的数目是100的倍数)
3、用户登录--------------------------------------》登录多次
在用户名和密码输入错误时可重新登录直到登陆成功
具体怎么用呢?下面开始进入介绍。
1、range()
要介绍for语句,就避不开range()函数。range函数可以在for循环中创建一个整数列表。其函数语法有三种表示形式:
range(n)----->0~n-1
range(i,j)--->i~j-1
range(start,end)
range(i,j,step)---> from i to (j-1),步长为step
range(start,end,step)
下面逐一介绍:
(1)range(n):使用系统给定range()完成范围指定
print(range(8))
#运行结果为range(0, 8) 意即:只要不特意写出起点,默认起点就是0
# 注意,这里是包含0但是不包含8的,即0≤某数<8 ,包前不包后,包含前面的0不包含后边的8
(2)range(start,end)
这里与第三种用法基本一致,此处不着重标出step为多少,则默认步长为1.
(3)range(start,end,step)
for i in range(1, 25, 3):
print(i)
运行结果:
该段程序运行结果,以1为起点,24为终点,步长为3(包含起点,不包含终点,只能到终点减一的地方)
1
4
7
10
13
16
19
22
有一点值得注意一下:
range中只要有两个参数,就默认一个是start起点,一个是end终点。写如下代码测试一下一般默认起点为0,会不会不写起点,还默认起点是0,并按照写得步长出来结果?
for i in range(50,5):
print('---->', i)
这段代码就默认50是起点,5是终点。无法倒着往前走,故该段程序执行之后无结果,但也不会报错。
所以如果想要有步长,起点一定不能省略不写!!!
2、for循环语句
举个例子来说,如果我们想要打印三次hello,码友们认为该怎么写嘞?如果像下面这样:
print('hello')
print('hello')
print('hello')
毫无疑问,运行结果符合要求,但是如果这样子写得话,代码的冗余性太高了,代码的可读性也比较低。而且,如果要求打印成百上千次的hello或者其它字符时,该怎么办呢?结合博主上面提到的内建函数range(),可以将代码写作下面的格式:
for i in range(3):
print('hello---->', i)
给大家展示一下运行结果:
hello----> 0
hello----> 1
hello----> 2
print(‘hello---->’, i)本可以直接写作print(‘hello’),这里是为了方便解释该段代码是如何进行的而在打印时加入了i。
range(3)会产生0、1、2这三个值 for in 是封装好的一个固定的格式,执行过程是:
-
A、 从for进来,就会去找range看range里面有没有值;此时 range里面有0,1,2这三个值。
一看range里面有值,它就会把排在这个序列当中的第一个值取出来,并把取出来的值给i,然后打印hello。可以认为i是个变量。这个变量i永远在等待着接受序列range里面的值。 其实在print语句里还可以打印一下i的值,写为print(‘hello------->’, i) 该语句中的变量i是属于循环的变量。 -
B、此时序列里面只剩下1,2这两个值了,紧跟上一步打印完hello之后,又去range里看有没有值,里面一看,还有两个值,它就会把现在排在这个序列当中的第一个值1又取出来,并把取出来的值给i,再打印hello
-
C、如此往复,直到range里面没有值时跳出循环,结束
再来说说下面这个程序:
for i in range(20):
print('hello--->', i)
print('-------game over--------')
只有这for循环执行完以后才可以结束循环执行print(’-------game over--------’) 这一句,在没有循环完这20次时,就一直不会打印game over(这段程序是顺序结构,是从上往下,从左往右执行的)
运行结果:
hello---> 0
hello---> 1
hello---> 2
hello---> 3
hello---> 4
hello---> 5
hello---> 6
hello---> 7
hello---> 8
hello---> 9
hello---> 10
hello---> 11
hello---> 12
hello---> 13
hello---> 14
hello---> 15
hello---> 16
hello---> 17
hello---> 18
hello---> 19
-------game over--------
注意事项:
for i in range(0):
print('-------->', i)
print('---------------')
运行结果:
---------------
range范围内没有数值,故for循环语句执行以后不会有结果,但是也不会报错,它只会执行for循环语句之外的语句。故运行结果如上。
另外:
for i in range(5):
print('-------->', i)
for i in range(5): 这一句里面是指范围为0,1,2,3,4这五个数,将0-4放到队列中,每遍历一次,就从队列中去拿一个数,赋给i
3、关于for循环的练习
practice 1:写一段代码来熟悉一下这个语法叭,比如说张三要吃5个馒头。
# 方式一的打印:
name = '张三'
for i in range(1, 6): # 1 2 3 4 5
print('%s很饿,正在吃第%d个馒头' % (name, i))
print('{}说,终于吃饱啦!'.format(name))
# 方式二的打印:
name = '张三'
for i in range(5): # 0 1 2 3 4
print('%s很饿,正在吃第%d个馒头' % (name, i+1))
print('{}说,终于吃饱啦!'.format(name))
运行结果均为如下结果:
张三很饿,正在吃第1个馒头
张三很饿,正在吃第2个馒头
张三很饿,正在吃第3个馒头
张三很饿,正在吃第4个馒头
张三很饿,正在吃第5个馒头
张三说,终于吃饱啦!
practice 2:在吃5个馒头的基础上加戏,(嘿嘿,博主之前喜欢看清宫戏,后宫真是热闹!)有人要加害舒妃,在第三个馒头上涂上了鹤顶红,所以现在要实现跳过第三个馒头的功能,不吃它。怎么办才能让舒妃免过一劫呢?
name = '舒妃'
for i in range(1, 6):
if i == 3:
print("{},赶快扔掉这个馒头,有剧毒:'鹤顶红'!".format(name))
print('%s很饿,正在吃第%d个馒头' % (name, i))
运行结果:
舒妃很饿,正在吃第1个馒头
舒妃很饿,正在吃第2个馒头
舒妃,赶快扔掉这个馒头,有剧毒:'鹤顶红'!
舒妃很饿,正在吃第3个馒头
舒妃很饿,正在吃第4个馒头
舒妃很饿,正在吃第5个馒头
(1)for i in range(1, 6):这一句产生的是1,2,3,4,5这个序列。
(2)从for进来,去找range看range里面有没有值,有值,把排在这个序列当中的第一个值取出来,并把取出来的值给i。第一个值是1,1等于3吗?1不等于3,故不会执行print("{},赶快扔掉这个馒头,有剧毒:‘鹤顶红’!".format(name))而是会执行print(’%s很饿,正在吃第%d个馒头’ % (name, i))这一句。
(3)这时候该找2了,2==3吗?2不等于3,故也不会执行print("{},赶快扔掉这个馒头,有剧毒:‘鹤顶红’!".format(name))
会执行print(’%s很饿,正在吃第%d个馒头’ % (name, i))这一句
(4)这一步,判断3,3 ==3,符合条件,执行print("{},赶快扔掉这个馒头,有剧毒:‘鹤顶红’!".format(name))这一句.但是!执行完这一句以后,还是会接着执行 print(’%s很饿,正在吃第%d个馒头’ % (name, i))这一句
(5)判断4和5与判断1和2的情况是一样的
显然,上述代码虽然提醒了舒妃娘娘第三个馒头有剧毒,但是并未指挥舒妃扔掉第三个馒头,还是难逃一死!该如何修正程序呢?
for i in range(1, 6):
if i == 3: # i=1,2,4,5时执行else
print("{},赶快扔掉这个馒头,有剧毒:'鹤顶红'!".format(name))
else:
print('%s很饿,正在吃第%d个馒头' % (name, i))
print('{}说,终于吃饱啦!'.format(name))
运行结果:
舒妃很饿,正在吃第1个馒头
舒妃很饿,正在吃第2个馒头
舒妃,赶快扔掉这个馒头,有剧毒:'鹤顶红'!
舒妃很饿,正在吃第4个馒头
舒妃很饿,正在吃第5个馒头
舒妃说,终于吃饱啦!
终于,舒妃逃过了这一劫难。下面对else与for…else进行相应解释。
else:适用于for执行完或者没有循环数据时需要去做的事情放在else里面
for....else:这是python当中独有的语句,意思是for循环结构里面有数据就执行for循环语句,for循环结构为空时执行else语句
for i in 范围:
有数据执行的语句
else:
没数据执行的语句
practice 3:关于for…else,这个语句结构是python独有的
name = '三宝'
num = int(input('请输入需要的馒头数量:'))
for i in range(num):
print('{}很饿,正在吃第{}个馒头'.format(name, i+1))
else:
print('{}说:"还没有给我馒头呢,饿哭啦..."'.format(name))
运行结果:
请输入需要的馒头数量:5
三宝很饿,正在吃第1个馒头
三宝很饿,正在吃第2个馒头
三宝很饿,正在吃第3个馒头
三宝很饿,正在吃第4个馒头
三宝很饿,正在吃第5个馒头
三宝说:"还没有给我馒头呢,饿哭啦..."
请输入需要的馒头数量:0
三宝说:"还没有给我馒头呢,饿哭啦..."
根据运行结果可以看出,只要for循环的序列里面空了,就会进入到else
4、pass关键字
if 10 > 7:
print('10是大的')
else:
pass # 此处用pass是为了防止语句报错,保证语法结构的完整性
print('-----判断结束-----')
运行结果:
10是大的
例子:
for i in range(3):
'''
运行结果:
File
"D:/DEMEO/parcharm/dream/for_210411.py", line 162
^
SyntaxError: unexpected EOF while parsing
但是命名162行没有写任何东西,这就是因为语法结构不完整,循环体里面没东西,使得162行默认有缩进,只需要在162行写上空语句pass即可
'''
将代码改为下面这样就不会报错啦,因为此时的语法结构就完整啦。
for i in range(3):
pass
下面这种写法是为了先搭建出来程序的框架,然后后续再在pass处填充程序的细节。
for i in range(3):
pass
else:
pass
5、涉及break的练习
要求:用户的账户密码登录而且只能登录三次,如果三次之后未能成功登陆,则账户锁定
- 第一个demo:
for i in range(3):
username = input('请输入用户名:')
password = input('请输入密码:')
# 验证用户名与密码
if username == 'admin2021' and password == '20210411':
print('{}用户登陆成功!'.format(username))
else:
print('用户名或密码错误!')
进入第一个demo的测试运行,运行结果如下:
运行结果:(三次输入错误之后运行结束)
请输入用户名:admin
请输入密码:2
用户名或密码错误!
请输入用户名:2
请输入密码:4
用户名或密码错误!
请输入用户名:45
请输入密码:55
用户名或密码错误!
(第二次就输入正确,还是会显示让用户键入信息)
请输入用户名:123
请输入密码:234
用户名或密码错误!
请输入用户名:admin2021
请输入密码:20210411
admin2021用户登陆成功!
请输入用户名:
- 第二个demo:
for i in range(3):
username = input('请输入用户名:')
password = input('请输入密码:')
# 验证用户名与密码
if username == 'admin2021' and password == '20210411':
print('{}用户登陆成功!'.format(username))
else:
print('用户名或密码错误!')
print('祝您购物愉快!')
进入第二个demo的测试运行,运行结果如下:
运行结果:(三次输入错误之后运行结束)
请输入用户名:admin
请输入密码:2
用户名或密码错误!
请输入用户名:2
请输入密码:4
用户名或密码错误!
请输入用户名:45
请输入密码:55
用户名或密码错误!
祝您购物愉快!
经过运行 发现三次输入错误还是会显示最后的祝您购物愉快 按照要求应该显示锁定账户
运行结果:(若三次之内输入正确)
请输入用户名:阿德民0
请输入密码:123
用户名或密码错误!
请输入用户名:admin2021
请输入密码:20210411
admin2021用户登陆成功!
请输入用户名:
明明第二次已经提示登陆成功了,光标还在等待第三次键入信息,显然程序不合理 此刻引入关键字break(跟第一个demo有相同的弊病)
经过这两次运行,修改程序 break与print(‘锁定账户’)这两句话应该加在哪里呢?print(‘祝您购物愉快!’)又到底该放在哪里嘞?
- 第三个demo:
for i in range(3):
username = input('请输入用户名:')
password = input('请输入密码:')
# 验证用户名与密码
if username == 'admin2021' and password == '20210411':
print('{}用户登陆成功!'.format(username))
print('祝您购物愉快!')
break # 跳出循环结构
else:
print('用户名或密码错误!')
else:
print('账户被锁定,需要重新激活!')
进入第三个demo的测试运行,运行结果如下:
运行结果:(三次都输入错误)
请输入用户名:yueirwbv
请输入密码:ujjl
用户名或密码错误!
请输入用户名:qeq
请输入密码:eqwrr
用户名或密码错误!
请输入用户名:erw
请输入密码:qewr
用户名或密码错误!
账户被锁定,需要重新激活!
运行结果:(若三次以内输入正确)
请输入用户名:admin
请输入密码:2021
用户名或密码错误!
请输入用户名:admin2021
请输入密码:20210411
admin2021用户登陆成功!
祝您购物愉快!
这段程序完美解决了之前出现的几个问题!
此处声明一下break的用法与意义:break用以强制退出for循环,进而继续执行下方的代码。
再来写一段代码来加深一下对break的理解:
for i in range(3):
if i == 1:
print('这家店是黑店,馒头有毒!等着关门吧!')
break # 跳出循环结构
print('abcd') # 加上这句话这句话也不会执行,break即使后面有语句也不能执行,因为它已经从循环中强制退出来了
else:
print('真香,我要多吃几个')
print('进入消费者协会大门去举报')
运行结果:
真香,我要多吃几个
这家店是黑店,馒头有毒!等着关门吧!
进入消费者协会大门去举报
range的范围正常执行完毕,而没有异常break跳出,就可以执行else。只要有break执行了就不会执行else。
验证:range的范围正常执行完毕,而没有异常break跳出,就可以执行else。将 if i == 1: 改为 if i == 4:,让程序正常执行完毕。
for i in range(3):
if i == 4:
print('这家店是黑店,馒头有毒!等着关门吧!')
break # 跳出循环结构
print('abcd') # 加上这句话这句话也不会执行,break即使后面有语句也不能执行,因为它已经从循环中强制退出来了
else:
print('真香,我要多吃几个')
print('进入消费者协会大门去举报')
运行结果:
真香,我要多吃几个
真香,我要多吃几个
真香,我要多吃几个
进入消费者协会大门去举报
for循环里面的语句正常结束,还是会执行else语句!