Функция, возвращающая ту же переменную, разделенную запятой - PullRequest
0 голосов
/ 16 ноября 2018

Я не понимаю смысла этой функции, возвращающей две одинаковые переменные:

def construct_shingles(doc,k,h):
    #print 'antes -> ',doc,len(doc)
    doc = doc.lower()
    doc = ''.join(doc.split(' '))
    #print 'depois -> ',doc,len(doc)
    shingles = {}
    for i in xrange(len(doc)):
        substr = ''.join(doc[i:i+k])
        if len(substr) == k and substr not in shingles:
            shingles[substr] = 1

    if not h:
        return doc,shingles.keys()

    ret = tuple(shingles_hashed(shingles))

    return ret,ret

Кажется избыточным, но для этого должна быть веская причина, я просто не вижуЗачем.Возможно, потому что есть два возвращаемых заявления?Если 'h' истинно, он возвращает оба оператора возврата?Вызывающие функции выглядят так:

def construct_set_shingles(docs,k,h=False):
    shingles = []
    for i in xrange(len(docs)):
        doc = docs[i]
        doc,sh = construct_shingles(doc,k,h)
        docs[i] = doc
        shingles.append(sh)
    return docs,shingles

и

def shingles_hashed(shingles):
    global len_buckets
    global hash_table
    shingles_hashed = []
    for substr in shingles:
        key = hash(substr)
        shingles_hashed.append(key)
        hash_table[key].append(substr)
    return shingles_hashed

Набор данных и вызов функции выглядят следующим образом:

k = 3 #number of shingles

d0 = "i know you"
d1 = "i think i met you"
d2 = "i did that"
d3 = "i did it"
d4 = "she says she knows you"
d5 = "know you personally"
d6 = "i think i know you"
d7 = "i know you personally"

docs = [d0,d1,d2,d3,d4,d5,d6,d7]
docsChange,shingles = construct_set_shingles(docs[:],k)

Местоположение github: LSH / LHS

1 Ответ

0 голосов
/ 16 ноября 2018

Ваше предположение верно, и относительно того, почему return ret,ret, ответ таков: оператор return предназначен для возврата пары равных значений, а не одного.

Это скорее стиль кодирования, нежели алгоритм, потому что это может быть сделано другими синтаксисами. Однако в некоторых случаях этот вариант является предпочтительным, например, если мы напишем

def func(x, y, z):
    ...
    return ret

a = func(x, y, z)
b = func(x, y, z)

, тогда func будет выполнено дважды. Но если:

def func(x, y, z):
    ...
    return ret, ret

a, b = func(x, y, z)

затем func можно выполнить только один раз, при этом можно вернуться как к a, так и к b

.

Также в вашем конкретном случае:

Если h равен false, то программа пока не будет выполнена до строки return doc,shingles.keys(), а затем переменные doc и sh в construct_set_shingles соответственно принимают значения doc и shingles.keys().

В противном случае первый оператор возврата пропускается, второй выполняется, а затем оба значения doc и sh принимают равные значения, в частности равные значению tuple(shingles_hashed(shingles))

...