理解Python

时间:2009-11-10 13:45:36

标签: python

我正在阅读编程集体智能这本书,下面的python代码到底是做什么的?

  # Add up the squares of all the differences 
  sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) 
                      for item in prefs[person1] if item in prefs[person2]]) 

我正在尝试使用Java中的示例。

Prefs是人物到电影评级的地图,电影评级是另一个评级名称地图。

4 个答案:

答案 0 :(得分:6)

首先,它构建一个包含以下结果的列表:

for each item in prefs for person1:
    if that is also an item in the prefs for person2:
        find the difference between the number of prefs for that item for the two people
        and square it (Math.pow(x,2) is "x squared")

然后将它们添加起来。

答案 1 :(得分:2)

如果对pow的调用被显式使用'**'指数运算符替换,那么这可能是 little 更具可读性:

sum_of_squares=sum([(prefs[person1][item]-prefs[person2][item])**2
                   for item in prefs[person1] if item in prefs[person2]])

解除一些不变量也有助于提高可读性:

p1_prefs = prefs[person1]
p2_prefs = prefs[person2]

sum_of_squares=sum([(p1_prefs[item]-p2_prefs[item])**2
                      for item in p1_prefs if item in p2_prefs])

最后,在Python的最新版本中,不需要列表理解符号,sum将接受生成器表达式,因此[]也可以删除:

sum_of_squares=sum((p1_prefs[item]-p2_prefs[item])**2
                      for item in p1_prefs if item in p2_prefs)

现在看起来更简单了。

具有讽刺意味的是,为了追求可读性,我们还进行了一些性能优化(两项通常是相互排斥的):

  • 将不变量移出循环
  • 用'**'运算符
  • 的内联评估替换了函数调用pow
  • 删除了不必要的列表构造

这是一种很棒的语言还是什么?!

答案 2 :(得分:1)

01 sum_of_squares =
02 sum(
03  [
04      pow(
05         prefs[person1][item]-prefs[person2][item],
06         2
07      ) 
08    for
09       item
10    in
11       prefs[person1]
12    if
13       item in prefs[person2]
14  ]
15 )

Sum(第2行)一个列表,它包含在第4行中为第11行指定的列表中定义的每个'item'计算的值,其中第13行的条件适用于。

答案 3 :(得分:0)

它计算prefs[person1][item] prefs[person2][item]字典item中每prefsperson1prefs之差的平方和在person2的{​​{1}}字典中。

换句话说,假设person1person2对电影Ratatouille有评分,person1评分5星,person2评分它2星。

prefs[person1]['Ratatouille'] = 5
prefs[person2]['Ratatouille'] = 2

person1的评分和person2评分之差的平方为3^2 = 9

它可能正在计算某种Variance