python递归函数错误使用方式

枫铃3年前 (2021-09-30)Python236

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的垃圾回收机制导致的内存释放问题,递归下面不要出现调用递归之上的变量的代码,否则你永远拿不到正确的结果)

下面是更改之后的代码:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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.错误二:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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上面就能解除.

相关文章

利用python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。