我在学习协同过滤,遇到这样一段代码
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]])
sum에서 허용하는 첫 번째 매개변수는 반복 가능 매개변수입니다. 이 for 루프의 의미를 알고 싶다면 생성기와 관련된 구문 설탕을 확인해야 합니다. 포스터에 대한 간단한 예는 다음과 같습니다
.[i for i in range(5)] # 结果为[0,1,2,3,4]
여기서
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를 매개변수
하지만 List Comprehension이 더 직관적이라는 것을 알 수 있으며, List Comprehension의map
로 사용하여 익명 함수x
를 호출합니다.lambda x:x**2
문이
for
을 대체하는 좋은 구문이라고 할 수 있습니다.map
하면 반복 가능한 객체에 대해 필터링 작업을 수행하는
예를 들어map
이 떠오를 것입니다.filter
:
lst2
에 홀수만 표시하고 싶습니다. 으아아아도 두 번째 매개변수(반복 가능한 객체)를 방문하여 이를 인수로 순서대로 가져온 다음 첫 번째 매개변수(단일 매개변수 함수)를 호출합니다( 연산 결과가 ), 반환 값은 새 요소로 유지되고, 그렇지 않으면 (
에는 List Comprehension이 추가되었습니다.filter
)이 필터링됩니다.True
False
이제으아아아
도 훨씬 간단합니다! List Comprehension의
if
문은filter
의 좋은 대체물이라고 말할 수 있습니다.이 내용을 보시고 나면 다음 내용을 이미 이해하셨으리라 믿습니다.
으아아아이 코드는 먼저
for...in...
문과if
문이 포함된 목록 이해를 실행하여 목록을 생성한 다음 해당 목록을 인수로 사용하여sum
함수를 호출합니다.결론:
for...in...
과if
는sum
과 직접적인 관련이 없습니다.for...in...
과if
은 목록 이해의 핵심 구문입니다.List Comprehension은 반복 가능한 객체를 사용하여 목록을 생성하는 데 도움이 될 수 있습니다.
목록 이해는
map
및filter
을 대체하는 좋은 방법입니다.