Что происходит с этим "POST for loop" в python? - Питон нуб

Я понимаю код ниже, за исключением вызова функции суммы ниже. Я не понимаю логику того, что именно функция суммы принимает в качестве аргумента? Что за цикл там? Что это такое??

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 ответа

Решение

Так что там работают две концепции - 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 добавляет каждый элемент в итерируемое (список в данном случае) и возвращает итоговое значение. Существует также дополнительный start аргумент, но я бы сосредоточился на понимании базовой функциональности в первую очередь:)

Это просто понимание списка, так что ваш цикл for используется для построения списка значений diff в степени двух

это почти так же, как:

lVals = []
for item in si:
    lVals.append(pow(prefs[person1][item]-prefs[person2][item],2))

sum_of_squares = sum(lVals)
Другие вопросы по тегам