内容补充:
1.直接赋值(二者分隔不开,list改list2也跟着改,因为指向的就是同一个地址)
1 list1=[
2 'egon',
3 'lxx',
4 [1,2]
5 ]
6 list2=list1 # 这不叫copy
7 list1[0]='EGON'
8 print(list2)
2、需求:
1、拷贝一下原列表产生一个新的列表
2、想让两个列表完全独立开,并且针对的是改操作的独立而不是读操作
3、如何copy列表
3.1 浅copy:是把原列表第一层的内存地址不加区分完全copy一份给新列表
1 list1=[
2 'egon',
3 'lxx',
4 [1,2]
5 ]
6
7 list3=list1.copy()
8 print(list3)
9 print(id(list1))
10 print(id(list3))
11
12 print(id(list1[0]),id(list1[1]),id(list1[2]))
13 print(id(list3[0]),id(list3[1]),id(list3[2]))
实验1:对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的
内存地址,并不会影响新列表
list1=[
'egon',
'lxx',
[1,2]
]
list3=list1.copy()
print(list3)
print(id(list1))
print(id(list3)
list1[0]='EGON'
list1[1]='LXX'
list1[2]=123
实验2:但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变
即原列表的索引指向仍然指向原来的内存地址,于是新列表也跟着一起受
影响,如下
1 list1=[
2 'egon',
3 'lxx',
4 [1,2]
5 ]
6 list3=list1.copy()
7 print(list3)
8 print(id(list1))
9 print(id(list3)
10 list1[2][0]=111
11 list1[2][1]=222
12 print(list1)
13 print(list3)
综合实验1和实验2可以得出,要想copy得到的新列表与原列表的改操作完全独立开
必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy
3.2 深copy
1 import copy 2 list1=[ 3 'egon', 4 'lxx', 5 [1,2] 6 ] 7 8 list3=copy.deepcopy(list1) 9 print(id(list1)) 10 print(id(list3)) 11 print(list3) 12 13 # 不可变 不可变 可变 14 print(id(list1[0]),id(list1[1]),id(list1[2])) 15 print(id(list3[0]),id(list3[1]),id(list3[2])) 16 ''' 17 4497919088 4498367856 4498449216 18 4497919088 4498367856 4498595328 19 '''
1 import copy 2 list1=[ 3 'egon', 4 'lxx', 5 [1,2] 6 ] 7 list1[0]='EGON' 8 list1[1]='LXX' 9 10 list1[2][0]=111 11 list1[2][1]=222 12 print(list3)
一.流程控制即控制流程,具体指控制程序的执行流程,而程序的执行流程分为三种结构:顺序结构and分支结构(if)and循环结构(while与for)
二.分支结构
1.什么是分支结构?
分支结构就是根据条件判断的真假去执行不同分支对应的子代码
2.为什么要用分支结构?
人类某些时候需要根据条件来决定做什么事,比如:如果醒了,就起床
所以程序中必须有相应的机制来控制计算机具备人的这种判断能力
3.分支结构如何使用
1)if语法
用if关键字来实现分支结构,完整语法如下:
1 if 条件1: # 如果条件1的结果为True,就依次执行:代码1、代码2,...... 2 代码1 3 代码2 4 ...... 5 elif 条件2: # 如果条件2的结果为True,就依次执行:代码3、代码4,...... 6 代码3 7 代码4 8 ...... 9 elif 条件3: # 如果条件3的结果为True,就依次执行:代码5、代码6,...... 10 代码5 11 代码6 12 ...... 13 else: # 其它情况,就依次执行:代码7、代码8,...... 14 代码7 15 代码8 16 ...... 17 # 注意: 18 # 1、python用相同缩进(4个空格表示一个缩进)来标识一组代码块,同一组代码会自上而下依次运行 19 # 2、条件可以是任意表达式,但执行结果必须为布尔类型 20 # 在if判断中所有的数据类型也都会自动转换成布尔类型 21 # 2.1、None,0,空(空字符串,空列表,空字典等)三种情况下转换成的布尔值为False 22 # 2.2、其余均为True
1)if案例应用
案例一:假如男孩的年龄>18,那么叫"成年"
1 age_of_boy = 19 2 if age_of_boy > 18 3 print("成年")
案例二:如果男 > 18,那么"成年",否则"未成年"
1 age_of_boy = 17
2 if age_of_boy > 18:
3 print("成年")
4 else:
5 print("未成年")
案例三:22>女>=18岁,身高>170,体重<100,漂亮,那么:表白,否则:不表白
1 age_of_girl=18
2 height=171
3 weight=99
4 is_pretty=True
5 if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_pretty == True:
6 print('表白...')
7 else:
8 print('不表白')
案例四:
1)让学生输入自己的分数查询成绩的级别。
2)学生等级分别为:
a) 90分以上 打印“优秀”
b) 76—89分之间 打印“良好”
c) 60—75之间 打印“及格”
d) 60分以下打印“不及格”
1 score = input('请输入你的成绩:') 2 score = int(score) 3 4 if score >= 90: 5 print('优秀') 6 elif score >= 75: 7 print('良好') 8 elif score >= 60: 9 print('及格') 10 elif score >= 0: 11 print('不及格')
案例五:if嵌套
1 #在表白的基础上继续: #如果表白成功,那么:在一起 #否则:打印。。。 age_of_girl=18
2 height=171
3 weight=99
4 is_pretty=True
5 success=False
6
7 if age_of_girl >= 18 and age_of_girl < 22 and height > 170 and weight < 100 and is_pretty == True:
8 if success: print('表白成功,在一起')
9 else:
10 print('什么爱情不爱情的,爱nmlgb的爱情,爱nmlg啊...')
11 else:
12 print('阿姨好')
1 #根据用户输入内容打印其权限
2 '''
3 egon --> 超级管理员
4 tom --> 普通管理员
5 jack,rain --> 业务主管
6 其他 --> 普通用户
7 '''
8 name=input('请输入用户名字:')
9 if name == 'egon':
10 print('超级管理员')
11 elif name == 'tom':
12 print('普通管理员')
13 elif name == 'jack' or name == 'rain':
14 print('业务主管')
15 else:
16 print('普通用户')
三.循环结构
1.什么是循环结构?
循环结构就是重复执行某段代码
2.为什么要用循环结构?
人类有些时候需要做某件重复的事
所以程序中必须有相应的机制控制计算机具备同样像循环结构做事的能力
3.如何使用循环结构?
1)while循环语法(条件循环),语法如下:
1 while 条件: 2 代码1 3 代码2 4 代码3 5 ...... 6 # while的运行步骤: 7 # 步骤1:如果条件为真,那么依次执行:代码1、代码2、代码3、...... 8 # 步骤2:执行完毕后再次判断条件,如果条件为True则再次执行:代码1、代码2、代码3、......,如果条件为False,则循环终止
2)while循环应用案例
1 count= 0 2 whilecount < 5: 3 print(count)count += 1 4 5 print(''顶级代码----->')
3)死循环与效率问题
1 count = 0 2 while count < 5: #<5 3 print(count) #0,1,2,3,4 4 5 while true: 6 name = input('your name >>>') 7 print(name) 8 9 while true: 10 1 + 1
11 while 1:
12 print('123")
纯计算无io的死循环导致致命的效率问题
案例一:while循环的基本使用
用户认证程序
1 #用户认证程序的基本逻辑就是接收用户输入的用户名密码然后与程序中存放的用户名密码进行判断,判断成功则登陆成功,判断失败则输出账号或密码错误 2 username = "jason" 3 password = "123" 4 5 inp_name = input("请输入用户名:") 6 inp_pwd = input("请输入密码:") 7 if inp_name == username and inp_pwd == password: 8 print("登陆成功") 9 else: 10 print("输入的用户名或密码错误!") 11 #通常认证失败的情况下,会要求用户重新输入用户名和密码进行验证,如果我们想给用户三次试错机会,本质就是将上述代码重复运行三遍,你总不会想着把代码复制3次吧。。。。 12 username = "jason" 13 password = "123" 14 15 # 第一次验证 16 inp_name = input("请输入用户名:") 17 inp_pwd = input("请输入密码:") 18 if inp_name == username and inp_pwd == password: 19 print("登陆成功") 20 else: 21 print("输入的用户名或密码错误!") 22 23 # 第二次验证 24 inp_name = input("请输入用户名:") 25 inp_pwd = input("请输入密码:") 26 if inp_name == username and inp_pwd == password: 27 print("登陆成功") 28 else: 29 print("输入的用户名或密码错误!") 30 31 # 第三次验证 32 inp_name = input("请输入用户名:") 33 inp_pwd = input("请输入密码:") 34 if inp_name == username and inp_pwd == password: 35 print("登陆成功") 36 else: 37 print("输入的用户名或密码错误!") 38 39 #即使是小白的你,也觉得的太low了是不是,以后要修改功能还得修改3次,因此记住,写重复的代码是程序员最不耻的行为。 40 #那么如何做到不用写重复代码又能让程序重复一段代码多次呢? 循环语句就派上用场啦(使用while循环实现) 41 42 username = "jason" 43 password = "123" 44 # 记录错误验证的次数 45 count = 0 46 while count < 3: 47 inp_name = input("请输入用户名:") 48 inp_pwd = input("请输入密码:") 49 if inp_name == username and inp_pwd == password: 50 print("登陆成功") 51 else: 52 print("输入的用户名或密码错误!") 53 count += 1
案例二:while + break的使用
使用了while循环后,代码确实精简多了,但问题是用户输入正确的用户名密码以后无法结束循环,那如何结束掉一个循环呢?这就需要用到break了
1 username = "jason" 2 password = "123" 3 # 记录错误验证的次数 4 count = 0 5 while count < 3: 6 inp_name = input("请输入用户名:") 7 inp_pwd = input("请输入密码:") 8 if inp_name == username and inp_pwd == password: 9 print("登陆成功") 10 break # 用于结束本层循环 11 else: 12 print("输入的用户名或密码错误!") 13 count += 1
案例三:while循环嵌套+break
如果while循环嵌套了很多层,要想退出每一层循环则需要在每一层循环都有一个break
1 username = "jason" 2 password = "123" 3 count = 0 4 while count < 3: # 第一层循环 5 inp_name = input("请输入用户名:") 6 inp_pwd = input("请输入密码:") 7 if inp_name == username and inp_pwd == password: 8 print("登陆成功") 9 while True: # 第二层循环 10 cmd = input('>>: ') 11 if cmd == 'quit': 12 break # 用于结束本层循环,即第二层循环 13 print('run <%s>' % cmd) 14 break # 用于结束本层循环,即第一层循环 15 else: 16 print("输入的用户名或密码错误!") 17 count += 1
案例四:while循环嵌套+tag的使用
针对嵌套多层的while循环,如果我们的目的很明确就是要在某一层直接退出所有层的循环,其实有一个窍门,就让所有while循环的条件都用一个变量,该变量的初始值为true,一旦在某一层将该变量的值改成false,则所有层的循环都结束
1 username = "jason" 2 password = "123" 3 count = 0 4 5 tag = True 6 while tag: 7 inp_name = input("请输入用户名:") 8 inp_pwd = input("请输入密码:") 9 if inp_name == username and inp_pwd == password: 10 print("登陆成功") 11 while tag: 12 cmd = input('>>: ') 13 if cmd == 'quit': 14 tag = False # tag变为False, 所有while循环的条件都变为False 15 break 16 print('run <%s>' % cmd) 17 break # 用于结束本层循环,即第一层循环 18 else: 19 print("输入的用户名或密码错误!") 20 count += 1
案例五:while+continue的使用
break代表结束本层循环,而continue则用于结束本次循环,直接进入下一次循环
1 # 打印1到10之间,除7以外的所有数字 2 number=11 3 while number>1: 4 number -= 1 5 if number==7: 6 continue # 结束掉本次循环,即本次循环continue之后的代码都不会运行了,而是直接进入下一次循环 7 print(number)
案例六:.while+else的使用
1 count = 0 2 while count <= 5 : 3 count += 1 4 print("Loop",count) 5 else: 6 print("循环正常执行完啦") 7 print("-----out of while loop ------") 8 输出 9 Loop 1 10 Loop 2 11 Loop 3 12 Loop 4 13 Loop 5 14 Loop 6 15 循环正常执行完啦 #没有被break打断,所以执行了该行代码 16 -----out of while loop ------
如果执行过程中被break,就不会执行else的语句
1 count = 0 2 while count <= 5 : 3 count += 1 4 if count == 3: 5 break 6 print("Loop",count) 7 else: 8 print("循环正常执行完啦") 9 print("-----out of while loop ------") 10 输出 11 Loop 1 12 Loop 2 13 -----out of while loop ------ #由于循环被break打断了,所以不执行else后的输出语句
四。for循环
for循环语法如下:
1 for 变量名 in 可迭代对象: # 此时只需知道可迭代对象可以是字符串列表字典,我们之后会专门讲解可迭代对象 2 代码一 3 代码二 4 ... 5 6 #例1 7 for item in ['a','b','c']: 8 print(item) 9 # 运行结果 10 a 11 b 12 c 13 14 # 参照例1来介绍for循环的运行步骤 15 # 步骤1:从列表['a','b','c']中读出第一个值赋值给item(item=‘a’),然后执行循环体代码 16 # 步骤2:从列表['a','b','c']中读出第二个值赋值给item(item=‘b’),然后执行循环体代码 17 # 步骤3: 重复以上过程直到列表中的值读尽
案例一:打印数字0-4
1 # 简单版:for循环的实现方式 2 for count in range(6): # range(6)会产生从0-5这6个数 3 print(count) 4 5 # 复杂版:while循环的实现方式 6 count = 0 7 while count < 6: 8 print(count) 9 count += 1
案例二:遍历字典
1 # 简单版:for循环的实现方式 2 for k in {'name':'jason','age':18,'gender':'male'}: # for 循环默认取的是字典的key赋值给变量名k 3 print(k) 4 5 # 复杂版:while循环确实可以遍历字典,后续将会迭代器部分详细介绍
案例三:for循环嵌套
1 #请用for循环嵌套的方式打印如下图形: 2 ***** 3 ***** 4 ***** 5 6 for i in range(3): 7 for j in range(5): 8 print("*",end='') 9 print() # print()表示换行
注意:break与continue也可以用于for循环,使用语法同while循环