我理解下面的代码,除了下面的sum函数调用。我不理解sum函数究竟接受什么作为其参数的逻辑?那里的for循环是什么?那是什么东西??
def sim_distance(prefs,person1,person2):
# Get the list of shared_items
si={}
for item in prefs[person1]:
if item in prefs[person2]: si[item]=1
# if they have no ratings in common, return 0
if len(si)==0: return 0
# Add up the squares of all the differences
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in si])
return 1/(1+sum_of_squares)
答案 0 :(得分:3)
因此,有两个概念在起作用 - sum
和列表理解。
sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in si])
首先,列表理解。
[pow(prefs[person1][item]-prefs[person2][item],2) for item in si]
这可以分解为for
循环,如下所示:
result_list = [] # Note that this is implicitly created
for item in si:
result_list.append(pow(prefs[person1][item]-prefs[person2][item], 2))
通过在每次迭代中运行pow
函数,使用item
中的每个si
并将结果附加到result_list
来创建值列表。假设循环结果类似于[1, 2, 3, 4]
- 现在sum
正在做的就是对列表中的每个元素求和并返回结果。
关于sum
函数接受什么作为参数的问题,它正在寻找一个可迭代的东西,它可以被迭代(字符串,列表,字典的键/值等等) )。就像您在for
循环中看到的那样,sum
会在iterable中添加每个项目(在本例中为list)并返回总计。还有一个可选的start
参数,但我会首先关注基本功能:)
答案 1 :(得分:1)
这只是一个list comprehension - 所以你的'for'循环用于构建一个功率为2的diff值列表
它非常相似:
lVals = []
for item in si:
lVals.append(pow(prefs[person1][item]-prefs[person2][item],2))
sum_of_squares = sum(lVals)