Тип переменной изменяется от функции к другой, изменяется от 'str' до 'NoneType' - PullRequest
0 голосов
/ 18 апреля 2019

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


def encodedata(huffmanTree, dataIN):
    """
    Encodes the input string to its binary string representation.
    """
    binresult = ""
    for i in dataIN:
        tmp = _encodedata(huffmanTree, i, '') # NoneType ??
        binresult = binresult + tmp
    return binresult

def _encodedata(tree, char, val):
    if tree.key == char:
        return val # val is str
    if tree.key == None:
        _encodedata(tree.right, char, val + '1')
        _encodedata(tree.left, char, val + '0')

В моей вторичной функции val является строкой (для уверенности, что используется тип (val)), но в моей основной функции tmp имеет тип 'NoneType', тогда как он должен совпадать с val ...

РЕДАКТИРОВАТЬ : Я изменил всю свою функцию, и она работает.Вот версия, которую я отправлю:

def encodedata(huffmanTree, dataIN):
    """
    Encodes the input string to its binary string representation.
    """
    result = ''
    L = _encodedata(huffmanTree, '', [])
    for i in dataIN:
        for j in L:
            if i == j[0]:
                result = result + j[1]

    return result

def _encodedata(tree, val, L):
    if tree.key != None:
        L.append((tree.key, val))
    else:
        _encodedata(tree.right, val + '1', L)
        _encodedata(tree.left, val + '0', L)
    return L

Однако я все равно был бы благодарен за объяснение, почему мой предыдущий код не работает.Спасибо за тех, кто помог.

1 Ответ

0 голосов
/ 18 апреля 2019

Вам необходимо вернуть результат ваших рекурсивных вызовов:

def _encodedata(tree, char, val):
    if tree.key == char:
        return val # val is str
    if tree.key == None:
        return _encodedata(tree.right, char, val + '1')
        return _encodedata(tree.left, char, val + '0')

Не делая этого, вы неявно возвращаете None в функции после завершения рекурсии.

...