Python入门——循环
一、深浅copy
什么是深浅拷贝
-
浅拷贝:是把原列表第一层的内存地址完全拷贝一份给新列表。即只能保证对原列表中第一层地址(不可变类型)的改操作不受影响,涉及到原列表中第二层地址(可变类型)的改操作时,原列表变,新列表也跟着变-
-
深拷贝:将两个列表的改操作完全的独立开。即不管原列表对第几层地址的改操作,新列表都不受影响,保持最开始复制的列表元素不变。
怎么用深浅拷贝
'''
浅拷贝:列表中的不可变类型元素改变,新列表中的不可变类型元素不变,
列表中的可变类型元素改变,新列表的不可变类型元素也跟着变
'''
list1 = ['Umi', 2233, ['Egon', 'Alex']]
list2 = list1.copy()
print('list1:', id(list1), id(list1[0]), id(list1[1]), id(list1[2]))
print('list2:', id(list2), id(list2[0]), id(list2[1]), id(list2[2]))
print(list1) # ['Umi', 2233, ['Egon', 'Alex']]
print(list2) # ['Umi', 2233, ['Egon', 'Alex']]
# 对于不可变类型的赋值、都是产生了新值,让原列表的索引指向新的内存地址、并不会影星新列表
list1[0] = 'UMI'
list1[1] = 21
'''
但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变,
即原列表的索引指向仍然指向原来的内存地址,
于是新列表也跟着受影响,如下
'''
list1[2][0] = 'EGON'
list1[2][1] = 'ALEX'
print(list1) # ['UMI', 21, ['EGON', 'ALEX']]
print(list2) # ['Umi', 2233, ['EGON', 'ALEX']]
# 深拷贝
import copy
list1 = ['Umi', 2233, ['Egon', 'Alex']]
list2 = copy.deepcopy(list1)
# 不可变 不可变 可变
print('list1:', id(list1[0]), id(list1[1]), id(list1[2]))
print('list2:', id(list2[0]), id(list2[1]), id(list2[2]))
list1[0] = 'UMI'
list1[1] = 21
list1[2][0] = 'EGON'
list1[2][1] = 'ALEX'
print(list1) # ['UMI', 21, ['EGON', 'ALEX']]
print(list2) # ['Umi', 2233, ['Egon', 'Alex']]
二、循环结构——while循环
什么是循环结构
- 循环结构就是重复执行某段代码块
为什么要用循环结构
- 让计算机能够具备人重复执行某件事情的能力
如何使用循环结构
-
while循环语法
while 条件: 代码1 代码2 代码3 ''' while的运行步骤: 步骤1:如果条件为真,则自上而下的执行代码1、2、3... 步骤2:执行完最后一条代码时再次判断条件,如果条件为Treu则重复步骤1,如果条件为False,则结束循环 '''
-
while循环以应用案例
-
案例1:while循环的基本使用
# 用户认证程序 # 为了避免代码的重复,所以引入while循环
-
案例2:while+break的使用
- 注意:break用来结束本层循环,break后面的代码都不会执行
# 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
-
案例3: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
-
案例4: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
-
案例5:while+continue的使用
- continue用来跳出当前次循环(即跳过本次循环直接进入下一次循环)
- 注意:在continue之后添加同级代码毫无意义,因为永远无法运行
# 打印1到10之间,除7以外的所有数字 number=11 while number>1: number -= 1 if number==7: continue print(number)
-
案例6:while+else的使用
- 注意:如果while循环被break终止了,则不会运行else里的代码
# 无break 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 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后的输出语句
-
-
while循环练习
-
练习1:寻找1到100之间数字7最大的倍数(结果是98)
number = 100 while number >= 1: if number % 7 == 0: print(number) break number -= 1
-
练习2:猜年龄
Umi = 21 tag = True while flog: inp_age = input("请输入年龄:").strip() if inp_age.isdigit(): age = int(inp_age) if age > Umi: print('猜大啦') elif age < Umi: print('猜小啦') else: print('猜对了') tag = False else: print('请输入数字')
-
三、for循环
什么是for循环
- for循环是python提供的第二种循环机制
为何要用for循环
- 理论上for循环能做的,while循环都能做
- for循环在循环取值(遍历取值)比while循环更简洁
如何用for循环
-
for循环与while循环的异同
''' # 相同之处:都是循环,for循环可以干的while循环都能干 # 不同之处: while循环称之为条件循环,循环次数取决于条件何时变为假 for循环称之为"取值循环",循环次数取决in后包含的值的个数 # for x in [1, 2, 3]: print('====>') print('88888') '''
-
for循环语法
for 变量名 in 可迭代对象(字符串、列表、字典): 代码1 代码2 ... #例1 for item in ['a','b','c']: print(item) # 运行结果 a b c # 参照例1来介绍for循环的运行步骤 # 步骤1:从列表['a','b','c']中读出第一个值赋值给item(item=‘a’),然后执行循环体代码 # 步骤2:从列表['a','b','c']中读出第二个值赋值给item(item=‘b’),然后执行循环体代码 # 步骤3: 重复以上过程直到列表中的值读尽
-
for循环应用案例
-
案例1:打印数字0-5
''' for i in [0,1,2,3,4,5]: print(i) ''' # for循环控制循环次数:range() # range(),顾头不顾尾,只能取到从头开始到尾的前一个数的值 for i in range(0, 6): print(i)
-
range补充(了解)
# 1、for搭配range,可以按照索引取值,但是麻烦,所以不推荐 l=['aaa','bbb','ccc'] # len(l) for i in range(len(l)): print(i,l[i]) for x in l: print(l) # 2、range()在python3里得到的是一只"会下蛋的老母鸡" ''' >>> range(3) range(0, 3) >>> ''' # range()在python2里得到的是一框"鸡蛋" ''' >>> range(3) [0, 1, 2] >>> '''
-
案例2:for+continue、for+break(唯一能终止for循环的方案)、for+else
# 与while循环相同 # for+continue ''' for i in range(6): if i == 4: continue print(i) ''' # for+break(终止for循环只有break一种方案) ''' for i in range(6): if i == 4: break print(i) ''' # for+else ''' for i in range(6): print(i) else: print('else已被执行') '''
-
案例3:遍历字典
''' # 遍历字典默认遍历的是字典的key # .keys():遍历字典的key # .values():遍历字典的value # .items():遍历字典的key:value(返回值是元组) ''' dic = {'name': 'Umi', 'age': 21, 'sex': 'male', 'birth': '1999-04-05'} for i in dic: print(i)
-
案例4:for循环嵌套
for i in range(3): print('外层循环——>', i) for j in range(5): print('内存——>', j)
-
-
for循环练习
-
练习1:打印九九乘法表
for i in range(1, 10): for j in range(1, i+1): print('{i} * {j} = {z} '.format(i=i, j=j, z=i*j), end=' ') print()
-
练习2:打印金字塔
for line in range(0, 5): for space in range(1, 5-line): print(' ', end='') for star in range(0, 2*line+1): print('*', end='') print('')
-