上次课程中我们简单介绍了while循环的使用,在开发中使用循环的场景很多,比如:
A. 我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中,让机器人向球门方向移动就是一个需要重复的动作,当然这里还会用到上一课讲的分支结构来判断机器人是否持球以及是否进入射门范围。
B. 再举一个简单的例子,如果要实现每隔1秒中在屏幕上打印一次“hello, world”并持续打印一个小时,我们肯定不能够直接把print('hello, world')
这句代码写3600遍,这里同样需要循环结构。
通过上次讲解我们知道循环结构就是程序中控制某条或某些指令重复执行的结构。
在Python中构造循环结构有两种做法,一种是 for-in
循环,一种是 while
循环。
本次我们介绍 for-in
循环。
for循环也是Python实现循环的一种方式,比如上面打印1-5之间的数字,5次直播时间打印等,但是格式却与while的有所不同。我们先从了解其语法格式开始。
for循环的格式
for 临时变量 in 序列:
循环满足条件时执行的代码
上面提到了序列,比如字符串、列表、元组,我们只接触过字符串,后面我们会慢慢带着大家学习列表、元组、集合等内容。所以从字符串说起。

遍历字符串:
for s in "hello":
print(s)
输出结果:
h
e
l
l
o
换一种字符串的打印
str1 = 'abc'
for x in str1:
print('你今天学习了吗?')
输出结果:
你今天学习了吗?
你今天学习了吗?
你今天学习了吗?
现在思考一个问题,如果要使用for循环打印10次【你今天学习了吗?】怎么做?100次呢?
按照上面的规律,如要要让for循环循环10次就需要in后面的字符串中有10个元素,同理,100次的时候就需要in后面的字符串有100个元素。可是当字符串中元素的个数比较多的时候,提供字符串本身就会变成一个问题。
range()函数
为了可以让for循环更好的控制次数,我们需要学习for循环的最佳拍档range函数!
range()函数通常是结合 for 使用的,单独使用没有什么意义,下面我们结合 for 来看一下它的使用:
for x in range(5):
print(x)
打印结果是:
0
1
2
3
4
以我们知道 range(5)产生的序列是 0-4 之间的数字。如果换成 range(10)那自然打印的是 0-9 之间的数字。
其实 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是步长,即每次数字递减的值。
我们尝试使用带两个参数的range()函数for循环打印一下,大家猜一下,下面代码的打印结果会是什么?会不会有 6 这个数字打印出来。
for x in range(1,6):
print(x)
通过运行我们看到的是 1-5 之间的数字并不包含数字6。这是因为给定的 1 表示起始值,而6 表示结束值。
第三种方式,里面又多了一个参数,那第三个参数又是做什么的呢?下面代码最终打印结果是什么:
for x in range(1,20,3):
print(x)
我们发现打印结果是:1、4、7、10、13、16、19 . 这是什么原因呢?

step 就类似我们"迈步子",step 为 1 则表示每次迈一步。step为 2 则表示每次迈两步,以此类推。所以打印的结果是 1,3,5,7。
知道了这一点,我们可以用下面的代码来实现1~100之间的偶数求和。
total = 0
for x in range(2, 101, 2):
total += x
print(total)
break和continue
break和continue都用在循环语句里,用来控制循环。
break:表示跳出整个循环结构
continue:表示跳过本次循环后面的语句不执行,继续下一次循环
看下面的代码运行结果是什么呢?
i = 0
while i <= 12:
i += 1
if i == 7 or i==11:
break
print(i)
输出结果:
1
2
3
4
5
6
大家发现在7的时候就结束了循环,即使有i==11也没有任何作用,因为在7的时候就结束了。
此时将break换成continue,来看一下运行结果。
i = 0
while i <= 12:
i += 1
if i == 7 or i==11:
continue
print(i)
运行结果是:
1
2
3
4
5
6
8
9
10
12
continue是在7和11的时候跳过没有打印数字。
注意点:
在Python中,break和continue只能用于循环语句中。
break和continue在嵌套循环中使用时,只对最内层循环有效。
while和for与else的使用
在Python中,循环语句还可以和else语句联合使用。
语法结构:
while 判断条件:
条件成立时,循环体代码
else:
循环后,不符合循环条件执行的代码
或者
for x in 序列:
循环体代码
else:
循环完所有序列,执行的代码
从上述结构中,我们可以看出,在非死循环中,正常情况下else里的语句都是会被执行的。那这个else语句到底有什么作用呢?一般情况下,循环语句和else共同出现时,在循环语句里都会配合break语句来使用。
i = 0
while i <= 12:
if i == 7:
break
i += 1
else:
print('循环条件不成立时执行的代码')
上述代码中,else语句的代码是否会执行,为什么?
执行后发现没有被执行,因为只要循环没有顺利完成,中间被break中断了则else里面的内容就不会执行。
综合案例
掷骰子游戏
欢迎进入皇家游戏厂
输入用户名,默认用户是没有币
提示用户充值买币(100块钱30币,充值必须是100的倍数,充值不成功可以再次充值)
玩一局游戏扣除2个币,猜 大【两个骰子相加和大于6】、 小【两个骰子相加和小于6】(系统用1-6之间的随机数模拟骰子产生值)
只要猜对了奖励1个币,可以继续玩(想不想继续玩,也可以没有金币自动退出)
代码参考:
print('*'*30)
print('欢迎进入澳门皇家娱乐城')
print('*'*30)
username = input('输入用户名:')
coins = 0
answer = input('是否加入"猜猜乐"游戏(yes/no)?')
if answer == 'yes':
# 同意进入游戏
while True:
num = int(input('%s!当前您的金币为%d!请充值(100块钱30币,充值必须是100的倍数):' % (username,coins)))
if num%100==0 and num>0:
# 充值成功
coins+=(num/100)*30
else:
print('充值失败!')
ans = input('是否继续充值(yes/no)?')
if ans == 'no': # not 5>3
break
print('当前金币数是:',coins)
# 开始玩
print('玩一局扣除5个金币,进入游戏中........')
# 计数器
count=0
# 可以玩多局
while True:
# 模拟两个骰子 使用随机数
ran1 = random.randint(1,6)
ran2 = random.randint(1,6)
# 扣金币
coins-=5
# 押大 押小 买定离手
print('系统洗牌完毕,押大?押小? 买定离手!')
guess = input('输入大小:')
#判断输赢 6 如果赢返3金币,玩5局送10个
if (ran1+ran2)>6 and guess=='大' or (ran1+ran2)<=6 and guess=='小':
# 金币累加
coins+=3
print('恭喜!你赢啦!当前金币数是:',coins)
else:
print('很遗憾!赌术一般呀!加油吧!当前金币数是:',coins)
# 计数的累加
count+=1
# 送金币
if count%5==0:
print('满五局送金币15个!!!!')
coins+=15
# 是否继续
flag = input('是否再玩一局游戏(yes/no)?')
if flag == 'no' or coins<5:
print('主动离开或者是金币不足!')
break
else:
print('欢迎下次再来!!!!!')