我不理解python中的以下代码:
def frequency(text):
if text == "":
return ""
cuvinte = text.split(" ")
frecv = {}
for cuv in cuvinte:
try:
frecv[cuv] += 1
except:
frecv[cuv] = 1
print (frecv)
例如,如果我跑:
frequency('zero one two three one four two one five')
它会告诉我们:
{'four': 1, 'three': 1, 'two': 2, 'one': 3, 'five': 1, 'zero': 1}
但为什么呢?
的含义是什么 try:
frecv[cuv] += 1
except:
frecv[cuv] = 1 ?
答案 0 :(得分:0)
这会处理W: Failed to fetch http://repo.mongodb.org/apt/ubuntu/dists/freya/mongodb-org/3.0/multiverse/binary-amd64/Packages 404 Not Found
W: Failed to fetch http://repo.mongodb.org/apt/ubuntu/dists/freya/mongodb-org/3.0/multiverse/binary-i386/Packages 404 Not Found
E: Some index files failed to download. They have been ignored, or old ones used instead.
异常。 KeyError
相当于frecv[cuv] += 1
,这意味着frecv[cuv] = frecv[cuv] + 1
密钥必须出现在字典中。所以代码可以读作“如果有cuv
的值,则为其添加1;否则将其设置为1”。
更优雅的方式是写
cuv
答案 1 :(得分:0)
当您frecv[cuv] += 1
实际检索frecv[cuv]
的当前值时,向其添加1,然后将其分配给frecv[cuv]
。当frecv[cuv]
没有任何值时,因此无法检索它,因此会发生异常(KeyError
)。
答案 2 :(得分:0)
try..except..
是exception handling mechanism in Python。
该块意味着,当freecv[cuv] += 1
失败时(在这种情况下,当cuv
中没有freecv
时),它会运行freecv[cuv] = 1
。它只是首先尝试增加单词的计数,当它失败时(因为该单词尚未添加)存在,它使用1。
顺便说一下,这段代码可以写得更简单:
>>> from collections import Counter
>>> def frequency(text):
... return Counter(text.split(" "))
...
>>> frequency('zero one two three one four two one five')
Counter({'one': 3, 'two': 2, 'three': 1, 'four': 1, 'zero': 1, 'five': 1})
答案 3 :(得分:0)
try..except是处理 frecv 字典不包含 cuv 引用的键的情况的一种非常懒惰的方式。更好的方法是这样写:
if cuv not in frecv:
frecv[cuv] = 1
else:
frecv[cuv] += 1
try..except在这里工作的原因是,如果字典中不存在 cuv 键,将抛出KeyError异常。在这种情况下,代码将设置为默认值为1。
这样的try..except案例是(非常)不好的做法的原因是因为它实际上也可能捕获其他错误。想象一下这就是代码:
try:
freqv[cuv] += 1
except:
frecv[cuv] = 1
注意try..except块中的拼写错误?这将由异常处理程序捕获,并且所有字典值最终都为1。