week2 day1流程控制之while循环和for循环
硬盘没有改操作,任何基于数据的改操作都是用新数据覆盖旧数据的过程。而对于数据的删除过程可以理解成将内存(大房子)中的一部分存储空间(小屋子)显示可以存储(挂上free的牌子)。
迄今为止我们已经学过了对于硬盘和内存的操作。当我们想要对于内存操作时,可以设置变量,变量会短暂存储数据。如果相对硬盘进行操作,就将代码保存成文件就可以了,文件可以帮助用户/应用程序永久保存数据。
零. 循环结构
0.1 什么是循环结构
循环结构就是重复执行某段代码块。
0.2 为什么要用循环结构
人额里某些时候必须要重复做某件事情,所以程序中必须有相应的机制来控制计算机具备人的这种循环做事的能力。
一. while循环
1.1 while循环基本语法
while 条件:
代码块
# while的运行步骤:
# 步骤1:如果条件为真,那么依次执行:代码1、代码2、代码3、......
# 步骤2:执行完毕后再次判断条件,如果条件为True则再次执行:代码1、代码2、代码3、......,如果条件为False,则循环终止
# 案例:输出1到5的中的值。
count=0
while count<5:
count+=1
print(count)
1.2 死循环(while条件永远为True)
条件的结果分为显式布尔值和隐式布尔值。死循环指的是while循环的条件永远为True。代码如下:
while 1:
print(1)
死循环也分为两种。一种叫做I/O密集型,在代码中,输入输出占比 较多,如上面的代码。这样的代码一般不会引发CPU使用率爆炸,因为输入输出并不会需要太多计算。第二种叫做计算密集型,在代码中,计算占比 较多。这样的程序需要CPU执行大量运算,明显提高CPU使用率。代码如下:
while 1:
1+1
1.3 如何终止while循环
- break 立刻终止循环
在循环中,碰到break立刻终止。代码如下:count=0 while 1: if count==3: break count+=1 print(count)
- 改变循环条件
在循环中,碰到改变循环条件的代码时,会执行完当前循环后,重新判定循环条件时,阻止循环进入。代码如下:
当count=0 tag=True while tag: if count ==4: tag=False count+=1 print(count)
count==4
时,循环的条件发生了改变,但是tag=False
后面的count+=1
和后面的print(count)
,还是会执行,而在重新进行while循环判断的时候才会被阻止。
1.4 嵌套多层的while循环如何终止
多层嵌套的终止必须确定每层循环都被终止。
用break终止:
while 1:
while 1:
while 1:
break
break
break
通过改变条件终止:
tag=True
while tag:
while tag:
while tag:
tag=False
案例练习:完成账号密码的验证工作,只有三次输错机会。
count=0
while count<=3:
if count==3:
print('您的机会已经使用完了')
break
name=input('input username: ')
pwd=input('input password: ')
if name=='wth' and 'pwd'=='123':
print('6666')
break
else:
count += 1
print('您还剩下%s次机会'%(3-count))
# 案例练习:当账号密码输入正确后,让用户选择进一步的操作。
count=0
while count<=3:
if count==3:
print('no opportunity left')
break
name=input('input username: ')
pwd=input('input password: ')
if name == 'wth' and pwd=='123':
print('login successfully!')
while True:
print('''
0 退出
1 转帐
2 存款
3 查询余额''')
operation=input('input your operation: ')
if operation == '1':
print('transferring...')
elif operation == '2':
print('saving...')
elif operation == '3':
print('showing balance...')
elif operation == '0':
break
else:
print('please input valid operation!')
break
else:
count+=1
print('%s chances left'%(3-count))
1.5 while+continue
continue的含义是结束本次循环,重新进入循环。请注意,不要把continue放在流程的最后,将毫无意义。和continue同级别不要写代码。
count=0
while count<5:
count+=1
if count==2:
continue
print(count)
1.6 while+else
当while循环没有被break打断的情况下,会运行else的内容。(用户登录失败后提供注册功能)
count=0
while count<5:
if count==1:
count+=1
continue
print(count)
count+=1
else:
print('===============')
1.7 while 循环应用案例
# 案例一:while循环的基本使用
#用户认证程序的基本逻辑就是接收用户输入的用户名密码然后与程序中存放的用户名密码进行判断,判断成功则登陆成功,判断失败则输出账号或密码错误
username = "jason"
password = "123"
inp_name = input("请输入用户名:")
inp_pwd = input("请输入密码:")
if inp_name == username and inp_pwd == password:
print("登陆成功")
else:
print("输入的用户名或密码错误!")
#通常认证失败的情况下,会要求用户重新输入用户名和密码进行验证,如果我们想给用户三次试错机会,本质就是将上述代码重复运行三遍,你总不会想着把代码复制3次吧。。。。
username = "jason"
password = "123"
# 第一次验证
inp_name = input("请输入用户名:")
inp_pwd = input("请输入密码:")
if inp_name == username and inp_pwd == password:
print("登陆成功")
else:
print("输入的用户名或密码错误!")
# 第二次验证
inp_name = input("请输入用户名:")
inp_pwd = input("请输入密码:")
if inp_name == username and inp_pwd == password:
print("登陆成功")
else:
print("输入的用户名或密码错误!")
# 第三次验证
inp_name = input("请输入用户名:")
inp_pwd = input("请输入密码:")
if inp_name == username and inp_pwd == password:
print("登陆成功")
else:
print("输入的用户名或密码错误!")
#即使是小白的你,也觉得的太low了是不是,以后要修改功能还得修改3次,因此记住,写重复的代码是程序员最不耻的行为。
#那么如何做到不用写重复代码又能让程序重复一段代码多次呢? 循环语句就派上用场啦(使用while循环实现)
username = "jason"
password = "123"
# 记录错误验证的次数
count = 0
while count < 3:
inp_name = input("请输入用户名:")
inp_pwd = input("请输入密码:")
if inp_name == username and inp_pwd == password:
print("登陆成功")
else:
print("输入的用户名或密码错误!")
count += 1
# 案例二:while+break使用
使用了while循环后,代码确实精简多了,但问题是用户输入正确的用户名密码以后无法结束循环,那如何结束循环呢,需要用到break或者改变循环条件。
username = "jason"
password = "123"
# 记录错误验证的次数
count = 0
while count < 3:
inp_name = input("请输入用户名:")
inp_pwd = input("请输入密码:")
if inp_name == username and inp_pwd == password:
print("登陆成功")
break # 用于结束本层循环
else:
print("输入的用户名或密码错误!")
count += 1
# 案例三:while循环嵌套+break
如果while循环钱啊套了很多层,要想退出没一层循环则需要在没一层循环都有一个break。
username = "jason"
password = "123"
count = 0
while count < 3: # 第一层循环
inp_name = input("请输入用户名:")
inp_pwd = input("请输入密码:")
if inp_name == username and inp_pwd == password:
print("登陆成功")
while True: # 第二层循环
cmd = input('>>: ')
if cmd == 'quit':
break # 用于结束本层循环,即第二层循环
print('run <%s>' % cmd)
break # 用于结束本层循环,即第一层循环
else:
print("输入的用户名或密码错误!")
count += 1
# 案例四:while循环嵌套+tag的使用
针对嵌套多层的循环,如果我们的目的很明确就是要在某一层直接退出所有层的循环,其实有一个窍门,就是让所有while循环的条件都用同一个变量,该变量的初始值为True,一旦在某一层将该变量的值改成False,则所有层的循环都结束。
username = "jason"
password = "123"
count = 0
tag = True
while tag:
inp_name = input("请输入用户名:")
inp_pwd = input("请输入密码:")
if inp_name == username and inp_pwd == password:
print("登陆成功")
while tag:
cmd = input('>>: ')
if cmd == 'quit':
tag = False # tag变为False, 所有while循环的条件都变为False
break
print('run <%s>' % cmd)
break # 用于结束本层循环,即第一层循环
else:
print("输入的用户名或密码错误!")
count += 1
# 案例五:while+else的使用
在while循环的后面,我们可以跟else语句,当while循环正常执行完并且中间没有被break终止的话,就会执行else后面的语句,所以我们可以用else来验证,循环是否正确结束。
count = 0
while count <= 5 :
count += 1
print("Loop",count)
else:
print("循环正常执行完啦")
print("-----out of while loop ------")
输出
Loop 1
Loop 2
Loop 3
Loop 4
Loop 5
Loop 6
循环正常执行完啦 #没有被break打断,所以执行了该行代码
-----out of while loop ------
如果循环过程被break打断,则不会执行else语句:
count = 0
while count <= 5 :
count += 1
if count == 3:
break
print("Loop",count)
else:
print("循环正常执行完啦")
print("-----out of while loop ------")
输出
Loop 1
Loop 2
-----out of while loop ------ #由于循环被break打断了,所以不执行else后的输出语句
# 练习1:寻找1-100之间数字7最大的倍数
number=100
while number>0:
if number%7==0:
print(number)
break
number-=1
# 练习2:猜三次年龄
age=18
count=0
while count<3:
count+=1
guess = int(input(">>:"))
if guess > age :
print("猜的太大了,往小里试试...")
elif guess < age :
print("猜的太小了,往大里试试...")
else:
print("恭喜你,猜对了...")
二. for循环
2.1 for循环的基本语法
for 变量名 in 可迭代的数据类型(字符串,列表,字典,元组):
代码块
for i in 'string':
print(i)
for i in [1,2,3,4,5,6]:
print(i)
for i in {'a1':1,'a2':2,'a3':3}:
print(i)
但需要注意,遍历字典的时候只能取到key,再取value需要进一步操作。
其实,for循环能做的while循环都可以做,但是for循环在取遍数据和控制循环次数方面比while更方便。
2.2 range()
在python2解释器中,range(3)=[0,1,2],即扔一个鸡蛋返回一筐子鸡蛋。
而在python3解释器中,range(3)=range(0,3),即扔一个鸡蛋返回了一直老母鸡。(请注意,取值时顾头不顾腚)。
可以通过range来控制循环次数。
for i in range(3):
print(111)
2.3 for循环应用案例
# 案例一:打印数字0-5
# 简单版:for循环的实现方式
for count in range(6): # range(6)会产生从0-5这6个数
print(count)
# 复杂版:while循环的实现方式
count = 0
while count < 6:
print(count)
count += 1
# 案例二:遍历字典
# 简单版:for循环的实现方式
for k in {'name':'jason','age':18,'gender':'male'}: # for 循环默认取的是字典的key赋值给变量名k
print(k)
# 复杂版:while循环确实可以遍历字典,后续将会迭代器部分详细介绍
# 案例三:for循环嵌套
#请用for循环嵌套的方式打印如下图形:
*****
*****
*****
for i in range(3):
for j in range(5):
print("*",end='')
print() # print()表示换行
# 练习1:打印9*9乘法表
for i in range(1,10):
for j in range(1,i+1):
print('%s*%s=%s' %(i,j,i*j),end=' ')
print()
# 练习2:打印金字塔
# 分析
'''
#max_level=5
* # current_level=1,空格数=4,*号数=1
*** # current_level=2,空格数=3,*号数=3
***** # current_level=3,空格数=2,*号数=5
******* # current_level=4,空格数=1,*号数=7
********* # current_level=5,空格数=0,*号数=9
# 数学表达式
空格数=max_level-current_level
*号数=2*current_level-1
'''
# 实现:
max_level=5
for current_level in range(1,max_level+1):
for i in range(max_level-current_level):
print(' ',end='') #在一行中连续打印多个空格
for j in range(2*current_level-1):
print('*',end='') #在一行中连续打印多个空格
print()