-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

2 番目の方法で行うと、一意の 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

2番目の方法では、generate_id関数の終わりを返す必要があります。

return generate_id()

また、再帰呼び出しの代わりに反復を行うことをお勧めします...この状況ではよりクリーンに見えます。

于 2013-02-13T08:14:45.967 に答える