• 58.python递归函数错误使用方式


    1.python递归函数入坑:

    ip_list = []
    def chooseDebugLinux():
        import random
        info = {}
        dockerip = random.randint(1, 3)
    
        global ip_list
        if dockerip not in ip_list:
            print(dockerip, '*' * 50)
            ip_list.append(dockerip)
        else:
            chooseDebugLinux()
    
        print("dockerip列表:", ip_list)
    
        info['dockerip'] = dockerip
        # info['dockerip'] = "10.2xxxxxx1"
        info['dockername'] = 'docker--%s--%s' % ("11111111111", info['dockerip'])
        print(info['dockername'], '*' * 50)
        return info, info['dockername']
    
    
    if __name__ == '__main__':
    
        import threading
        for i in range(10):
            threading.Thread(target=chooseDebugLinux).start()
    
    问题产生:一段时间内并发10个请求,我的ip是一个范围内的,所以当有人使用了我就不能让其他人使用,这个时候我用到了递归函数.
        大致如上,在进行递归的过程中,我在递归下面写了部分代码.但是令我们想不到的错误发生了,他虽然产生了递归,但是当递归结
    束他还会回到上一次产生递归的条件,也就是将函数内的变量回滚到上一次的递归中,直到递归第一次产生的地方(变量也回滚了),这
    个时候,才会执行递归下面的代码但是我需要的而变量是递归之后产生的变量,而现在却因为递归的回滚操作,是的变量回滚到最初的
    时候.这个时候的变量不是我需要的,所以程序一直报错.(所以我认为这是python的垃圾回收机制导致的内存释放问题,递归下面不要
    出现调用递归之上的变量的代码,否则你永远拿不到正确的结果)
        
    下面是更改之后的代码:
    ip_list = []
    def chooseDebugLinux():
        import random
        info = {}
        dockerip = random.randint(1, 3)
    
        global ip_list
        if dockerip not in ip_list:
            print(dockerip, '*' * 50)
            ip_list.append(dockerip)
            info['dockerip'] = dockerip
            info['dockername'] = 'docker--%s--%s' % ("11111111111", info['dockerip'])
        else:
            chooseDebugLinux()
        return info, info['dockername']
    
    
    if __name__ == '__main__':
    
        import threading
        for i in range(10):
            threading.Thread(target=chooseDebugLinux).start()
    

    2.错误二:

    def check_file_exists(planName):
        """检查脚本文件是否存在"""
        jmeter_xml_root = os.path.join(settings.BASE_DIR, "xxxxx")
        ret = os.path.exists(jmeter_xml_root)
        num = 3
        if not ret and num > 0:
            num -= 1
            time.sleep(1)
            check_file_exists(planName)
        return ret
    
    这次又写了一个bug,这个函数是一个死循环,递归进去之后每次都将num重新改为3,根本出不来.
    

    3.错误三:

    def connection():
        print("进入函数")
        flag = False
        count = 3
        while not flag and count > 0:
            try:
                # 由于这里莫名其妙到第四个docker链接之后一直报错,所以在这里尝试连接三次
                1/0
                count -= 1
                flag = True
            except Exception as e:
                print("发生错误,进入循环")
                pass
    这次又是个bug还好我检查了,因为我将count-=1卸载D.SFTPConnect()下面,如果连接错误它永远
    也不会减一,导致循环我先进行.所以这次有给我提了个醒,关于递归和while这种容易出现死循环的
    代码必须进行测试才可以使用.其实只需要将count-=1移动到 1/0 上面就能解除.
    
  • 相关阅读:
    Agile PLM bom表结构学习笔记
    火狐书签同步服务无法同步问题解决
    EasyExcel使用笔记
    给EasyUI查询按钮添加回车事件.
    让bat异常之后不直接关闭窗口的办法.
    DROP TABLE、TRUNCATE TABLE和DELETE的区别
    DUMPBIN工具的使用
    Java Build Path 详解
    用eclipse中打开已存在的Java Project
    .net core、微服务 开源项目
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/13155795.html
Copyright © 2020-2023  润新知