python - 变量类型从一个函数变为另一个,从“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
但是,我仍然希望能解释一下为什么我以前的代码不起作用。感谢那些帮助过的人。
解决方案
您需要返回递归调用的结果:
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
在递归完成后隐式返回函数。
推荐阅读
- php - 如何按计数过滤帖子(通过从数据库中搜索和计数)?
- typescript - TypeScript 中可以使用哪种类型的“对象”替代方案?
- haskell - 如何为 Haskell 安装“Data.List.Split”模块?
- javascript - EventListener 不会通过点击 div 触发
- java - 如何在 Eclipse 插件中以编程方式编辑 xml 模式文件
- ios - 是否可以延迟 iOS Safari 上的视频播放?
- shell - 如何为文件夹中的所有pdf添加页眉和页脚
- c++ - 代码为相似的输入给出不同的结果
- git - 如何切换到不同的分支但维护文件夹和提交历史
- python - C#:从另一个进程正在使用的文件中快速读取