首页 > 解决方案 > 变量类型从一个函数变为另一个,从“str”变为“NoneType”

问题描述

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


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

但是,我仍然希望能解释一下为什么我以前的代码不起作用。感谢那些帮助过的人。

标签: pythonbinary-treehuffman-code

解决方案


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

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在递归完成后隐式返回函数。


推荐阅读