第一模块 第7章 短路运算、深浅copy、while循环、for循环
day07:(全为重点)
0:补充(了解)
短路运算
深浅copy
1. 流程控制之while循环
while循环的基本使用
死循环与效率问题
退出while循环的两种方式
条件改为False
while+break
while循环嵌套与结束
使用break
使用tag
while+continue
while+else
2. 流程控制之for循环
for循环的基本使用
for循环嵌套
for+break
for+continue
for+else
https://zhuanlan.zhihu.com/p/108685793
7.1 短路运算
偷懒原则:偷懒到哪个位置,就把当前位置的值返回
print(10 > 3 and 10) # 偷懒到10,返回10 print(10 > 3 and 10 and False) # 偷懒到False,返回False print(10 > 3 and 20 and True) # 偷懒到True,返回True print(10 > 3 and None and False) # 偷懒到None,返回None print(10 > 3 and 10 and 0 and 10 or 10 > 3 and 1 == 1) # 结果为True
7.2 深浅copy
注意:有的平台上Tab代表8个空格,使用时需注意。
浅copy:是把原列表第一层的内存地址完全copy一份给新的列表。如果原列表中存的都是不可变类型,改变原列表,新列表并不会改变,如果原列表中包含可变类型的数据,修改原列表中可变类型的数据,新列表中可变类型的数据也会改变。默认都是浅copy
lst1 = [1, 2, ['a', 'b']] lst2 = lst1 # 列表的赋值操作,不是copy # 浅copy lst3 = lst1.copy() print(id(lst1)) # 2595498713800 print(id(lst3)) # 2595505372424 print(id(lst1[0]), id(lst1[1]), id(lst1[2])) # 140734587855696 140734587855728 2595498713736 print(id(lst3[0]), id(lst3[1]), id(lst3[2])) # 140734587855696 140734587855728 2595498713736 # lst1[0] = 11 # lst1[1] = 22 # lst1[2] = 33 print(lst1) # [11, 22, 33] print(lst3) # [1, 2, ['a', 'b']] lst1[0] = 111 lst1[1] = 222 lst1[2][0] = 'aa' lst1[2][1] = 'bb' print(lst1) # [111, 222, ['aa', 'bb']] print(lst3) # [1, 2, ['aa', 'bb']]

深copy:是把原列表每一层的内存地址完全copy一份给新的列表。
import copy lst1 = [1, 2, ['a', 'b']] lst4 = copy.deepcopy(lst1) print(id(lst1)) # 2448171826504 print(id(lst4)) # 2448171858120 print(id(lst1[0]), id(lst1[1]), id(lst1[2])) # 140734523433808 140734523433840 2193848658312 print(id(lst4[0]), id(lst4[1]), id(lst4[2])) # 140734523433808 140734523433840 2193848659016 print(id(lst1[2][0]), id(lst1[2][1])) # 2017809243192 2017809241512 print(id(lst4[2][0]), id(lst4[2][1])) # 2017809243192 2017809241512 lst1[2][0] = 'aa' lst1[2][1] = 'bb' print(lst1) # [1, 2, ['aa', 'bb']] print(lst4) # [1, 2, ['a', 'b']]

总结:如果想产生一个新列表,并且将两个列表的改操作完全独立开,就不应该用浅copy,而应该用深copy。
7.3 流程控制之while循环
7.3.1 while循环介绍与基本使用
python中有while和for两种循环机制,其中while循环称为条件循环,语法如下:
while 条件: 代码1 代码2 代码3
死循环与效率问题
# 以下代码存在IO,CPU有休息的时间
while True: name = input('请输入姓名:') print(name)
# 以下代码是纯计算型,CPU会不停歇地一直运行 while True: 1+1
死循环本身是无害的,但是纯计算无IO的死循环会导致致命的效率问题。
注意: while True 也可以写成 while 1,后者是数字,更易转化为计算机认识的语言,效率更高。
7.3.2 退出循环的两种方式
方式一:将条件改为False,等到下次循环判断条件时才会生效,注意flag = False之后的代码还会运行
username = 'egon' password = '123' flag = True while flag: inp_name = input('请输入用户名:') inp_pwd = input('请输入密码:') if inp_name == username and inp_pwd == password: print('登录成功') tag = False else: print('用户名或密码错误')
print('=====end=====') # tag修改后会执行本行代码
方式二:break,只要运行到break,就会立刻终止本层循环
# 方式二:使用break username = 'egon' password = '123' while True: inp_name = input('请输入用户名:') inp_pwd = input('请输入密码:') if inp_name == username and inp_pwd == password: print('登录成功') break # 立刻终止本层循环 else: print('用户名或密码错误') print('=====end=====') # break后不会执行本行代码
7.3.3 while循环嵌套与结束
方式一:
while True:
while True:
while True:
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("登陆成功") while True: # 第二层循环 cmd = input('>>: ') if cmd == 'quit': break # 用于结束本层循环,即第二层循环 print('run <%s>' % cmd) break # 用于结束本层循环,即第一层循环 else: print("输入的用户名或密码错误!") count += 1
方式二:
tag = True
while tag:
while tag:
while tag:
tag = False
username = "jason" password = "123" 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 else: print('run <%s>' % cmd) else: print("输入的用户名或密码错误!")
7.3.4 while + continue
break代表结束本层循环,而continue则用于结束本次循环,直接进入下一次循环
continue:走到continue这就不往下走了,掉头回去进行下一个循环。
break:走到break这就不往下走了,退出循环。
结束掉本次循环,即本次循环continue之后的代码都不会运行了,而是直接进入下一次循环
强调:在continue后添加同级代码毫无意义,因为永远无法运行
# 打印1到10之间,除7以外的所有数字 num = 0 while num < 10: num += 1 if num == 7: continue # 结束掉本次循环,即本次循环continue之后的代码都不会运行了,而是直接进入下一次循环 print(num)
7.3.4 while + else
''' else包含的代码会在while循环结束后, 并且while循环是在没有被break打断的情况下正常结束, 才会被运行 ''' while True: pass else: pass

7.4 流程控制之for循环
7.4.1 for循环介绍与基本使用
1.什么是for循环
for循环是python提供的第二种循环机制,又称迭代循环。
2.为何要有for循环
理论上,for循环能做的事情,while循环都能做,之所以要有for循环,是因为for循环在循环取值(遍历取值)方面比while循环更简洁
3.如何用for循环
语法:
for 变量名 in 可迭代对象:
代码块
可迭代对象:如字符串、列表、字典、元祖、集合
示例1:列表循环取值
# 案例1:循环取出列表中的值 # for循环版 lst = [1, 2, 3, 4, 5] for item in lst: print(item) ''' 步骤1:从列表中读出第一个值赋值给item(item=1),然后执行循环体代码 步骤2:从列表中读出第二个值赋值给item(item=2),然后执行循环体代码 步骤3: 重复以上过程直到列表中的值读尽 ''' # while循环版 i = 0 while i < len(lst): print(lst[i]) i += 1
示例2:字典循环取值
注意:for 循环默认取的是字典的key赋值给变量名k
# 案例2:字典循环取值 dic = {'name': 'egon', 'age': 18, 'hobby': ['篮球', '足球']} # for循环版 for k in dic: print(dic[k]) # while循环版:while循环可以遍历字典,太麻烦了
示例3:字符串循环取字符
# 案例3:字符串循环取字符 s = '今天天气不是很好' # for循环版 for el in s: print(el) # while循环版 i = 0 while i < len(s): print(s[i]) i += 1 ''' 注意:字符串、列表、字典都使用[]取索引或关键字 空格也算字符 '''
小结:总结for循环与while循环
1.相同之处
都是循环,for循环能做的事,while循环也能干
2.不同之处
while循环称为条件循环,循环次数取决于何时为假
for循环称为迭代循环/取值循环,循环次数取决于in后包含的值的个数
7.4.2 for + range
for循环控制循环次数:range
range(1,10) 前闭后开,顾头不顾尾 [1,2,3,4,5,6,7,8,9]
range(1, 10, 2) 其中,2为步长,每两个取一个,如果不指定步长,默认为1
range(3) 指[0, 1, 2]
for搭配range可以按照索引取值,但是比较麻烦
for i in range(len(lst)):
pass
python2和python3对range的处理不同,但是两者用法相同:

7.4.3 for + break + else
for + break:同while循环一样
for + else:同while循环一样
for + continue:同while循环一样
username = 'egon' password = '123' for i in range(3): inp_name = input('请输入姓名:') inp_pwd = input('请输入密码:') if inp_name == username and inp_pwd == password: print('登录成功') break else: print('登录次数超过3次')
for i in range(5): if i == 3: continue print(i)
注意:如果if后的代码块只有一行,可以直接上移使其与if同处一行,这样写可以,但是不符合规范。如:
if i == 3: continue
7.4.4 for循环嵌套
for循环嵌套:外层循环循环一次,内存循环需要完整地循环完
for i in range(3): print('===') for j in range(2): print('***')
'''
结果:
===
***
***
===
***
***
===
***
***
'''
跳出for循环只有一种方式:break,要跳出哪层循环就在哪层加break。
7.5 print补充
''' 1. print可以同时打印多个值,中间用逗号分隔,逗号显示出来是空格 2. print()默认换行结束 def print(self, *args, sep=' ', end='\n', file=None): ''' print('苹果', 1, ['aa', 'bb']) # 结果:苹果 1 ['aa', 'bb'] print('hello') # 3. 可以自定义末尾符号 print('hi', end='*') # 结果:hi*你好 print('你好')
浙公网安备 33010602011771号