Python:这个局部变量是静态的吗?

时间:2013-02-13 08:10:33

标签: python django recursion

我的第一次尝试:

def generate_id():

    """ Create unique id of alphanumeric characters """
    i = 0
    id = ''
    while i!=10:
        id = id + random.choice(string.ascii_letters + string.digits)
        i+=1

    if check_unique(id):
           return id 

    id = generate_id()
    return id


def check_unique(id):
    """Check if id is unique"""
    try:
        instances = SomeModel.objects.get(id=id)
    except ObjectDoesNotExist:
        return True

    return False

第二种方式:

def generate_id():

    """ Create unique id of alphanumeric characters """
    i = 0
    id = ''
    while i!=10:
        id = id + random.choice(string.ascii_letters + string.digits)
        i+=1

    if check_unique(id):
           return id 

    generate_id()



def check_unique(id):
    """Check if id is unique"""
    try:
        instances = SomeModel.objects.get(id=id)
    except ObjectDoesNotExist:
        return True

    return False

如果我以 第二种方式 执行此操作,那么生成唯一ID的逻辑不会出错吗?因为我可能会在最后一次通话中丢失id。

我是python的新手,我不知道,但我认为我的recursion概念看起来搞砸了

2 个答案:

答案 0 :(得分:3)

按照您的代码:

if check_unique(id):  # If this is `false`, you keep going
    return id 

generate_id()  # Now what? You call the function. Nothing gets returned.

如果要创建唯一ID,请不要使用递归。只需使用while循环并生成新ID,只要它们不是唯一的:

characters = string.ascii_letters + string.digits

def generate_id(length=10):
    return ''.join(random.choice(characters) for i in range(length))

def generate_unique_id(length=10):
    id = generate_id(length)

    while not check_unique(id):
        id = generate_id(length)

    return id

答案 1 :(得分:0)

在第二种方式中,你应返回一个generate_id函数的结尾:

return generate_id()

我还建议进行迭代而不是递归调用...在这种情况下看起来更清晰。

相关问题