python-6

十一、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语句!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值