zoukankan      html  css  js  c++  java
  • python学习之while循环

    今日温故知新内容

    python底层数据存放知识延伸——数据的深拷贝和浅拷贝

    有如下需求,通过复制一个列表得到另一个列表,对其中一个列表进行任意的改操作,完全不会影响到另一个列表,也就是说复制得到的列表是完全独立的

    首先,我们试下如下操作:

    list01 = ['tom','susan',[11,22]]
    list02 = list01
    list01[2][0] = 111
    list02[2][1] = 222
    print(list01)
    #['tom', 'susan', [111, 222]]
    print(list02)
    #['tom', 'susan', [111, 222]]
    

    上面的操作,其实就是变量的赋值,和拷贝半毛钱关系都没有;

    list02 = list01本质上就是在内存栈区将变量名list01与列表['tom','susan',[11,22]]内存地址的对应关系复制了一份,直接丢给了变量list02,在堆区中没有发生任何事情,又何来拷贝一说,实际过程如下图所示。

    list01和list02引用的是堆区中的同一个内存地址,相当于一个人有两个不同的名字。

    根据上面的信息来运行python中的copy操作,代码如下:

    list01 = ['tom','susan',[11,22]]
    list02 = list01.copy()
    print(id(list01),id(list01[0]),id(list01[1]),id(list01[2]))
    #38881792 38856368 38856688 38856064
    print(id(list02),id(list02[0]),id(list02[1]),id(list02[2]))
    #39511232 38856368 38856688 38856064
    list01[0] = 'egon'
    list02[1] = 'alex'
    list01[2][0] = 111
    list02[2][1] = 222
    print(list01)
    #['egon', 'susan', [111, 222]]
    print(list02)
    #['tom', 'alex', [111, 222]]
    

    list02 = list01.copy()是python中的浅拷贝操作;从list02和list01内存地址不一样,可以看出copy操作在堆区中开辟了一个全新的内存空间;而从所有元素的id一模一样可以看出,新的内存空间存的内容与原来的是一模一样的;

    对于不可变类型来说,对它进行了直接引用,如果对其修改,必定指向新的内存地址,因此不会影响另外一个列表的值;这一点可以从list01、list02最后的打印结果进行验证。

    而对于可变类型(容器类型)来说,对它进行的是间接引用,如果对其修改,只是修改了容器内单个元素指向的内存地址,它本身的内存地址没有发生变化,另外一个列表仍然对它进行了引用,因此另一个列表的值也会发生变化。这一点可以从list01、list02最后的打印结果进行验证。

    copy操作并不能实现需求,最后再实验一下deepcopy操作。

    import copy
    list01 = ['tom','susan',[11,22]]
    list02 = copy.deepcopy(list01)
    print(id(list01),id(list01[0]),id(list01[1]),id(list01[2]))
    #39511616 38855920 38856688 39579712
    print(id(list02),id(list02[0]),id(list02[1]),id(list02[2]))
    #39697408 38855920 38856688 39696768
    list01[0] = 'egon'
    list02[1] = 'alex'
    list01[2][0] = 111
    list02[2][1] = 222
    print(list01)
    #['egon', 'susan', [111, 22]]
    print(list02)
    #['tom', 'alex', [11, 222]]
    

    list02 = copy.deepcopy(list01)是python中的深拷贝操作;从list02和list01内存地址不一样,可以看出copy操作在堆区中开辟了一个全新的内存空间;deepcopy将可变和不可变类型进行了区分,把列表中不可变类型元素的内存地址对应关系完整复制了一份,将可变类型元素的索引指向新的内存地址。这样改变操作最终只作用到了不可变类型身上,原列表和拷贝的列表互不影响。

    1、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('顶级代码----->')
    

    2、死循环与效率问题

    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')

    3、循环的应用

    两个问题:
    1)重复代码
    2)输对了应该不用再重复

    username = 'egon'
    password = '123'
    while True:
        inp_name=input('请输入您的账号:')
        inp_pwd=input('请输入您的密码:')
    
        if inp_name  == username and inp_pwd == password:
            print('登录成功')
        else:
            print('账号名或密码错误')
    

    4、退出循环的两种方式

    方式一:将条件改为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====')
    

    5、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('账号名或密码错误')
    

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

    强调:在continue之后添加同级代码毫无意义,因为永远无法运行

    count=0
    while count < 6:
        if count == 4:
            count+=1
            continue
            # count+=1 # 错误
        print(count)
    	count+=1
    

    7、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('======>')
    

    8、应用案列:

    版本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次,退出')
    
    
    
  • 相关阅读:
    Mysql的四种引擎介绍
    电商项目实战(架构三)——redis的启动,安装和运用(windows下)
    bug篇——ERROR: Maven JVM terminated unexpectedly with exit code 137
    电商项目实战(架构二)——Swagger-UI实现在线api文档
    电商项目实战(架构一)——SpringBoot+MyBatis搭建基本骨架
    bug篇——上传图片大小限制配置
    bug篇——Mybatis中Mapper.xml文件的if判断问题
    bug篇——线上移动端跳转页面
    安装篇——xshell评估过期解决
    bug篇——vue跨域时cookies问题
  • 原文地址:https://www.cnblogs.com/leilijian/p/12452864.html
Copyright © 2011-2022 走看看