我在学习协同过滤,遇到这样一段代码
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 prefs[person1] if item in prefs[person2]])
return 1/(1+sum_of_squares)
比较困惑的是下面这段代码,为什么sum里面可以写for 循环呢,这个是什么意思,为什么我写了个类似的函数就会报错
sum([pow(prefs[person1][item]-prefs[person2][item],2)
for item in prefs[person1] if item in prefs[person2]])
怪我咯2017-04-17 17:54:13
sum에서 허용하는 첫 번째 매개변수는 반복 가능 매개변수입니다. 이 for 루프의 의미를 알고 싶다면 생성기와 관련된 구문 설탕을 확인해야 합니다. 포스터에 대한 간단한 예는 다음과 같습니다[i for i in range(5)] # 结果为[0,1,2,3,4]
PHP中文网2017-04-17 17:54:13
여기서 for
또는 if
는 sum
자체와 관련이 없습니다. @大quail이 말했듯이 sum
는 이 예제에서 반복 가능한 개체를 매개 변수로 허용합니다. List Comprehension을 사용하여 생성된 리스트입니다.
리스트 컴프리헨션(연속제작)에 대해 간단히 소개하겠습니다.
이것은 함수형 프로그래밍의 특징을 지닌 직관적이고 우아한 구문입니다.
이름에서 알 수 있듯이 시리즈를 생성하는 데 사용됩니다.
따라서 중요한 원칙이 있습니다.
오늘 코드의 목적이 목록을 생성하는 것이라면 사용을 고려해야 하고, 그렇지 않으면 전혀 사용하지 말아야 합니다
사용법을 살펴보겠습니다. 목록을 생성하려면 문자 그대로 두 쌍의 대괄호 []
(목록의 리터럴 생성 구문)를 사용하고 for...in...
반복을 삽입합니다. for
을 사용하여 방문한 요소는 목록의 각 요소를 순서대로 생성하는 데 사용됩니다.
예를 들어 오늘 정수 목록 lst
이 있고 각 요소가 lst2
에 있는 요소의 제곱인 또 다른 목록 lst
을 만들고 싶다고 가정해 보겠습니다.
으아아아
루프를 사용했지만 for...in...
list comprehension을 사용하면 동일한 작업을 더 간결하고 우아하게 수행할 수 있습니다.
으아아아
는 for i in lst
의 요소를 순차적으로 꺼내어 제곱 연산을 수행하여 lst
의 새로운 요소가 됩니다. 이는 lst2
기능을 연상시킵니다. map
매핑 을 사용하여 비슷한 효과를 얻을 수도 있습니다.
으아아아
은 두 번째 매개변수(반복 가능한 객체)의 요소를 순차적으로 방문하고 해당 요소를 매개변수로 사용하여 첫 번째 매개변수(단일 매개변수 함수)를 호출합니다. 1, 2, 3, 4를 매개변수 map
로 사용하여 익명 함수 x
를 호출합니다. lambda x:x**2
문이 for
을 대체하는 좋은 구문이라고 할 수 있습니다. map
하면 반복 가능한 객체에 대해 필터링 작업을 수행하는 map
이 떠오를 것입니다. filter
:lst2
에 홀수만 표시하고 싶습니다.
으아아아
도 두 번째 매개변수(반복 가능한 객체)를 방문하여 이를 인수로 순서대로 가져온 다음 첫 번째 매개변수(단일 매개변수 함수)를 호출합니다( 연산 결과가 <🎜). > ), 반환 값은 새 요소로 유지되고, 그렇지 않으면 ( filter
)이 필터링됩니다. True
False
이제
으아아아
도 훨씬 간단합니다! List Comprehension의 if
문은 filter
의 좋은 대체물이라고 말할 수 있습니다.
이 내용을 보시고 나면 다음 내용을 이미 이해하셨으리라 믿습니다.
으아아아이 코드는 먼저 for...in...
문과 if
문이 포함된 목록 이해를 실행하여 목록을 생성한 다음 해당 목록을 인수로 사용하여 sum
함수를 호출합니다.
결론:
for...in...
과 if
는 sum
과 직접적인 관련이 없습니다.
for...in...
과 if
은 목록 이해의 핵심 구문입니다.
List Comprehension은 반복 가능한 객체를 사용하여 목록을 생성하는 데 도움이 될 수 있습니다.
목록 이해는 map
및 filter
을 대체하는 좋은 방법입니다.