第一模块 第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('你好')

 

posted @ 2020-06-18 11:41  自由者妍  阅读(248)  评论(0)    收藏  举报