在我的python程序中测试som基本函数时,我得到了AsertionError。这是场景:
我编写了一个函数,可以将单个字母转换为ASCII格式的二进制文件:
def ascii8Bin(letter):
conv = ord(letter)
return '{0:08b}'.format(conv)
接下来有一个函数使用前一个函数将单词/句子中的所有字母转换为二进制:
def transferBin(string):
l = list(string)
for c in l:
print ascii8Bin(c)
现在当我尝试断言这个函数时:
def test():
assert transferBin('w') == '01110111'
print "You test yielded no errors"
print test()
抛出AssertionError。现在我查了二进制字母表并检查了tripple:二进制文件中的w肯定是01110111.我尝试只调用transferBin('w'),它就像它应该的那样产生了01110111。
我真的对断言失败的原因感兴趣。非常感谢任何见解。
答案 0 :(得分:1)
您的功能不会返回任何内容。您使用print
将文本写入stdout
,但您没有对此进行测试。
因此,transferBin()
返回None
,这是没有明确return
语句的函数的默认返回值。
您必须将每个ascii8Bin()
结果的结果收集到一个列表中,然后将结果合并到一个字符串中:
def transferBin(string):
results = [ascii8Bin(c) for c in l]
return '\n'.join(results)
这将使用换行符分隔每个字符的结果;对于你的单个字符'w'
字符串,它会给你预期的字符串。
请注意,您无需将l
转入列表;你可以直接迭代字符串;你会得到个性化的角色。
答案 1 :(得分:1)
您需要返回,您要与None
进行比较而不是字符串。如果没有指定返回值,python将从函数返回None。
def transferBin(s):
l = list(s)
for c in l:
return ascii8Bin(c) # return
你基本上正在做assert None == '01110111'
,如果你只是单个字符串只是return ascii8Bin(string)
,你的代码中有一个return
的循环会在第一个之后返回迭代,所以循环是多余的。
如果你实际上有多个字符,只需使用join,只需遍历字符串,就不需要在其上调用list来迭代字符串:
def transferBin(s):
return "".join(ascii8Bin(ch) for ch in s)
您也可以在transferBin函数中完成所有操作:
def transferBin(s):
return "".join('{0:08b}'.format(ord(ch)) for ch in s)