-1

我的第一次尝试:

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概念看起来很混乱

4

2 回答 2

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
于 2013-02-13T08:18:56.493 回答
0

在第二种方式中,您应该返回generate_id 函数的结尾:

return generate_id()

我还建议进行迭代而不是递归调用……在这种情况下似乎更干净。

于 2013-02-13T08:14:45.967 回答