在python中这个“POST for loop”发生了什么? - Python noob

时间:2012-11-09 02:15:08

标签: python pyscripter

我理解下面的代码,除了下面的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)

2 个答案:

答案 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)