return [vocabulary.get(w, UNK_ID) for w in words if len(words) <= 80 and len(words) >= 8]
这句代码是没有错的,但是除了以上我还想考虑一下len(words)>80的情况,所以我改成了下面:
if len(words) >= 4 and len(words) <= 80:
return [(vocabulary.get(w, UNK_ID)) for w in words]
elif len(words)>80:
return [(vocabulary.get(words[w], UNK_ID)) for w in range(80)]
然后代码报错了:TypeError: 'NoneType' object is not iterable
错误发现以后,一般都没有直接上网查的习惯,认真仔细的和之前不报错的代码比对了半天,心里还是固执的认为是没错的,上网一查,才恍然大悟。
上面的代码if在一个列表里写着,如果不符合if条件,则会返回一个空列表;而我下面改的,则并没有考虑不满足上面两个条件的情况,则这个时候函数会默认返回None,显然和列表类型是不匹配的。所以改成了如下:
l=[]
if len(words) >= 4 and len(words) <= 80:
for w in words:
l.append(vocabulary.get(w, UNK_ID))
if len(words)>80:
for w in range(80):
l.append(vocabulary.get(words[w], UNK_ID))
return l
总结:
1、在进行条件判断的时候一定要考虑到条件分支的全覆盖,否则极容易产生这个错误;
2、函数在没有设置返回值的时候,默认会返回None。