前文讲了流程控制和if判断语句,本章节就是来介绍循环的,循环结构就是重复执行某段代码块,人类某些时候需要重复做某件事情,所以程序中必须有相应的机制来控制计算机具备人的这种循环做事的能力
python中有while与for两种循环机制
while循环
while循环又被称之为条件循环,它是先进行判断,后进行循环
基本语法
伪代码
while 条件:
代码1
代码2
代码3
...
先判断while后面的条件是否成立,成立就执行下面的循环语句,语句执行完成后,再次判断while后面的条件是否成立,然后不停的往复,直到while条件语句不成立了,然后跳出循环
演示代码
count = 0
while count <= 5:
print(count) # 输出count当前值
count+=1
print("循环结束") # 此代码不属于循环
输出结果
死循环与效率问题
所谓死循环,就是不会结束的循环,最简单的例子
count = 0
while True:
print(count)
count+=1
print("循环结束")
开始运行后,由于while的条件语句永远为True,它就会被无休止的自加下去
而且这句话,本身控制的是CPU,让CPU不停的进行高速运算,CPU就会大量散热,就会听到CPU的风扇开始转了起来
但是呢,有时候死循环并不是一定的坏事,比如用户的操作本来就需要循环进行的时候
演示代码
# ATM机简易场景
while True:
passwd = input("请输入密码:")
if(passwd == '123456'):
print('登陆成功,功能没有开发完全即将退出')
else:
print('登陆失败,请重新登陆')
输出结果
这里由于场景需求,我们需要它死循环,而且因为他有IO交互,交互的时候程序会等待,所以给CPU留出了休息的时间,避免了不停运算的情况
结束循环的方式
方式一:判断条件改为False
while循环会判断循环条件是否为真,为真才进行循环操作,所以我们让他为假就不会循环了
注意:如果本次判断已经是True了,修改之后,还是同样会完成本次循环,直到下次判断为False才会终止
演示代码
# ATM机简易场景
tag = True
while tag: # 判断tag
passwd = input("请输入密码:")
if(passwd == '123456'):
print('登陆成功')
tag = False #tag修改为False,本次循环完成后再次进行while检测就为假了
else:
print('登陆失败,请重新登陆')
print('您的账户余额为0')
输出结果
方式二:添加break
只要运行到break,就会立即终止本层循环
演示代码
# ATM机简易场景
while True:
passwd = input("请输入密码:")
if(passwd == '123456'):
print('登陆成功')
break # 立刻终止本层循环
print('break之后的代码') # 由于break是立即跳出循环,故此行不运行
else:
print('登陆失败,请重新登陆')
print('您的账户余额为0')
输出结果
如果是多层嵌套循环,想要跳出多层循环,就需要每一层都添加break
伪代码
while True:
while True:
while True:
while True:
break
break
break
break
方式三:continue
while可以和continue连用,其作用是结束掉本次循环,直接进入下一次
演示代码
# 跳过4的打印
a = 1
while a<=10:
if a == 4:
a += 1 # 如果这里没有+1,本次循环跳出之后,a还是等于4,就会陷入死循环
continue
print(a)
a += 1
输出结果
while与else连用
在while中也可以使用else,但是要想让else的代码运行,必须要是while结束循环之后,并且循环不是因为break中途打断才结束才可以
演示代码
count = 0
b = int(input(请输入最大值))
while count <= b:
print(count)
if count == 5:
break
count += 1
else:
print("正常的退出")
这个代码是让程序从0输出到我们想要的整数,但是我们在6的位置添加了break,也就是说限制到小于6,大于6会被break给退出
我们输入小于6的任意数,else都会同步输出
但是如果大于了5,就不会运行else语句
案例用法
将上面的ATM取款机代码进行优化(取款机代码限制输错次数3次)
count = 0 #计次
while count < 3:
username = input("请输入账号:")
password = input("请输入密码:")
if username == "admin" and password == "admin":
print("登陆成功!")
break
else:
count += 1
print("密码错误{}次".format(count))
else:
print("密码错误三次,卡已经冻结")
登陆成功返回
密码错误返回
for循环
for循环,又被称为迭代循环(取值循环),是python提供的第二种循环机制,从理论上for循环能做的事情,while循环都能做,for循环在循环取值上面比while更加简便
基本循环
伪代码
# 可迭代对象可以是:列表、字典、字符串、元组、集合
for 变量名 in 可迭代对象:
代码1
代码2
代码3
....
演示代码
for x in ['kinght','amber','alisa','AYM']:
print(x)
输出结果
for循环会将可迭代对象中的值一个一个的取出来,直到整个可迭代对象的值被取干净为止
for循环的次数取决于可迭代对象内部值的个数
for循环取字典,默认取出来的是字典的key,取value可以通过dic[key]的方式
dic = {'kinght':'amber','alisa':'AYM'}
for x in dic:
print(x,':',dic[x])
输出结果
for循环控制循环次数
range()
在这里首先介绍一个函数range()
,这是一个在python2就有的功能,他的功能是生成从0开始的数组,括号里是多少,就生成序号到多少的列表
也可以直接指定列表数字(python2),头能取,尾取-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1qaKhqi9-1603172924431)(jpg/13.python%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6%E4%B9%8B%E5%BE%AA%E7%8E%AF/image-20200912002330702.png)]
指定步长取等差数列(步长为2)
Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表,这样做内存空间优化了,使用并不会有什么区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qGe8hFbI-1603172924433)(jpg/13.python%E6%B5%81%E7%A8%8B%E6%8E%A7%E5%88%B6%E4%B9%8B%E5%BE%AA%E7%8E%AF/image-20201011110507902.png)]
对前文模拟登陆代码的修改
sys_name = 'admin'
sys_pwd = 'admin'
for x in range(3):
name = input("请输入账号:")
pwd = input('请输入密码:')
if(name == sys_name and pwd == sys_pwd):
print("密码正确")
break
else:
print("密码错误{}次,还有{}次机会".format((x+1),(2-x)))
else:
print("账号验证错误次数过多,请联系管理员找回密码")
len()
数列表个数
l = [1,2,3,'a','b','c']
print(len(l)) #输出结果为6
for+continue
for循环和while循环与continue连用效果相同,其作用是结束掉本次循环,直接进入下一次
for i in range(6):
if i == 3:
continue
print(i) #0 1 2 4 5
for循环嵌套
for循环也是可以进行嵌套的
案例:10以内的乘法
for a in range(1,10):
for b in range(1,10):
print('{}x{}={}'.format(a,b,a*b))
t(len(l)) #输出结果为6
for+continue
for循环和while循环与continue连用效果相同,其作用是结束掉本次循环,直接进入下一次
for i in range(6):
if i == 3:
continue
print(i) #0 1 2 4 5
for循环嵌套
for循环也是可以进行嵌套的
案例:10以内的乘法
for a in range(1,10):
for b in range(1,10):
print('{}x{}={}'.format(a,b,a*b))