变量类型从一个函数更改为另一个,从“ str”更改为“ NoneType”

时间:2019-04-18 13:20:12

标签: python binary-tree huffman-code

作为学校作业的一部分,我必须编写霍夫曼算法的代码,但我的变量之一有问题,我不明白为什么。


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是一个字符串(必须使用type(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 :(得分:0)

您需要返回递归调用的结果:

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