Что происходит с этим "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)