day07-python深浅拷贝、while循环

今日内容:流程控制

补充(了解)
	短路运算:偷懒原则,偷懒到哪个位置,就把当前位置的值返回
	深浅copy

循环之while循环
	循环的语法与基本使用
	死循环与效率问题

循环的应用
	退出循环的两种方式
	条件
	while+break

while循环嵌套
	while+continue
	while+else

2、循环之for循环
	for循环的语法与基本使用
	for循环应用
	for循环嵌套
	for+break
	for+continue
	for+else

今日内容详细

深浅copy

二者分隔不开,list改list2也跟着该,因为指向的就是同一个地址

import copy
list1 = [
    'egon',
    'lxx',
    [1, 2]
]
list2 = list1  # 这不叫copy
list1[0] = 'EGON'
print(list2)

需求如下

拷贝一下原列表产生一个新的列表
想让两个列表完全独立开,并且针对的是改操作的独立而不是读操作

如何copy列表

浅copy

浅copy: 是把原列表第一层的内存地址不加区分完全copy一份给新列表

list1 = [
    'egon',
    'lxx',
    [1, 2]
]

list3 = list1.copy()
print(list3)
print(id(list1))
print(id(list3))

print(id(list1[0]), id(list1[1]), id(list1[2]))
print(id(list3[0]), id(list3[1]), id(list3[2]))

# 实验1:对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的
# 内存地址,并不会影响新列表
list1[0] = 'EGON'
list1[1] = 'LXX'
# list1[2]=123

# 实验2:但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变
# 即原列表的索引指向仍然指向原来的内存地址,于是新列表也跟着一起受
# 影响,如下
list1[2][0] = 111
list1[2][1] = 222
print(list1)
print(list3)
# 综合实验1和实验2可以得出,要想copy得到的新列表与原列表的改操作完全独立开
# 必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy

深copy

list1 = [
    'egon',
    'lxx',
    [1, 2]
]

list3 = copy.deepcopy(list1)
print(id(list1))
print(id(list3))
print(list3)

#          不可变        不可变        可变
print(id(list1[0]), id(list1[1]), id(list1[2]))
print(id(list3[0]), id(list3[1]), id(list3[2]))
'''
4497919088 4498367856 4498449216
4497919088 4498367856 4498595328
'''
print(list3)
print(id(list1[2][0]), id(list1[2][1]))
print(id(list3[2][0]), id(list3[2][1]))

list1[0] = 'EGON'
list1[1] = 'LXX'

list1[2][0] = 111
list1[2][1] = 222
print(list1)

print(list3)

流程控制之while循环

循环的语法与基本使用

语法

'''
print(1)
while 条件:
     代码1
     代码2
     代码3
print(3)
'''
count=0
while count < 5: # 5 < 5
    print(count) # 0,1,2,3,4
    count+=1 # 5

print('顶级代码----->')

死循环与效率问题

count=0
while count < 5: # 5 < 5
    print(count) # 0,1,2,3,4

while True:
    name=input('your name >>>> ')
    print(name)

纯计算无io的死讯会导致致命的效率问题

while True:
    1+1

while 1:
    print('xxxx')

循环的应用

username = 'egon'
password = '123'

两个问题:
1、重复代码
2、输对了应该不用再重复
while True:
    inp_name=input('请输入您的账号:')
    inp_pwd=input('请输入您的密码:')

    if inp_name  == username and inp_pwd == password:
        print('登录成功')
    else:
        print('账号名或密码错误')

退出循环的两种方式

方式一:将条件改为False,等到下次循环判断条件时才会生效

tag=True
while tag:
    inp_name=input('请输入您的账号:')
    inp_pwd=input('请输入您的密码:')

    if inp_name  == username and inp_pwd == password:
        print('登录成功')
        tag = False # 之后的代码还会运行,下次循环判断条件时才生效
    else:
        print('账号名或密码错误')

    # print('====end====')

方式二:break,只要运行到break就会立刻终止本层循环

while True:
    inp_name=input('请输入您的账号:')
    inp_pwd=input('请输入您的密码:')

    if inp_name  == username and inp_pwd == password:
        print('登录成功')
        break # 立刻终止本层循环
    else:
        print('账号名或密码错误')

    # print('====end====')

while循环嵌套与结束

'''
tag=True
while tag:
    while tag:
        while tag:
            tag=False
    

# 每一层都必须配一个break
while True:
    while True:
        while True:
            break
        break
    break
'''
# break的方式
while True:
    inp_name=input('请输入您的账号:')
    inp_pwd=input('请输入您的密码:')

    if inp_name  == username and inp_pwd == password:
        print('登录成功')
        while True:
            cmd=input("输入命令>: ")
            if cmd == 'q':
                break
            print('命令{x}正在运行'.format(x=cmd))
        break # 立刻终止本层循环
    else:
        print('账号名或密码错误')

    # print('====end====')

# 改变条件的方式
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 == 'q':
                tag=False
            else:
                print('命令{x}正在运行'.format(x=cmd))
    else:
        print('账号名或密码错误')

while +continue:结束本次循环,直接进入下一次

# 强调:在continue之后添加同级代码毫无意义,因为永远无法运行
count=0
while count < 6:
    if count == 4:
        count+=1
        continue
        # count+=1 # 错误
    print(count)
    count+=1

while + else:针对break

count=0
while count < 6:
    if count == 4:
        count+=1
        continue
    print(count)
    count+=1
else:
    print('else包含的代码会在while循环结束后,并且while循环是在没有被break打断的情况下正常结束的,才不会运行')

count=0
while count < 6:
    if count == 4:
        break
    print(count)
    count+=1
else:
    print('======>')

应用案列:

版本1:

count=0
tag=True
while tag:
    if count == 3:
        print('输错三次退出')
        break
    inp_name=input('请输入您的账号:')
    inp_pwd=input('请输入您的密码:')

    if inp_name  == username and inp_pwd == password:
        print('登录成功')
        while tag:
            cmd=input("输入命令>: ")
            if cmd == 'q':
                tag=False
            else:
                print('命令{x}正在运行'.format(x=cmd))
    else:
        print('账号名或密码错误')
        count+=1

版本2:优化

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 == 'q': # 整个程序结束,退出所有while循环
                break
            else:
                print('命令{x}正在运行'.format(x=cmd))
        break
    else:
        print('账号名或密码错误')
        count+=1
else:
    print('输错3次,退出')
原文地址:https://www.cnblogs.com/zdw20191029/p/14553366.html