python sum 函数中可以使用条件语句吗
高洛峰
高洛峰 2017-04-17 17:52:13
0
2
1151

我在学习协同过滤,遇到这样一段代码

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]])
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(2)
刘奇

sum에서 허용하는 첫 번째 매개변수는 반복 가능 매개변수입니다. 이 for 루프의 의미를 알고 싶다면 생성기와 관련된 구문 설탕을 확인해야 합니다. 포스터에 대한 간단한 예는 다음과 같습니다[i for i in range(5)] # 结果为[0,1,2,3,4]

.
洪涛

여기서 for 또는 ifsum 자체와 관련이 없습니다. @大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

하지만 List Comprehension이 더 직관적이라는 것을 알 수 있으며, List Comprehension의

문이 for을 대체하는 좋은 구문이라고 할 수 있습니다. map


하면 반복 가능한 객체에 대해 필터링 작업을 수행하는 map이 떠오를 것입니다. filter

예를 들어

:lst2에 홀수만 표시하고 싶습니다. 으아아아

도 두 번째 매개변수(반복 가능한 객체)를 방문하여 이를 인수로 순서대로 가져온 다음 첫 번째 매개변수(단일 매개변수 함수)를 호출합니다( 연산 결과가 ), 반환 값은 새 요소로 유지되고, 그렇지 않으면 ( filter )이 필터링됩니다. True False이제

에는 List Comprehension이 추가되었습니다.

으아아아

도 훨씬 간단합니다! List Comprehension의 if 문은 filter의 좋은 대체물이라고 말할 수 있습니다.


이 내용을 보시고 나면 다음 내용을 이미 이해하셨으리라 믿습니다.

으아아아

이 코드는 먼저 for...in... 문과 if 문이 포함된 목록 이해를 실행하여 목록을 생성한 다음 해당 목록을 인수로 사용하여 sum 함수를 호출합니다.


결론:

  1. for...in...ifsum과 직접적인 관련이 없습니다.

  2. for...in...if은 목록 이해의 핵심 구문입니다.

  3. List Comprehension은 반복 가능한 객체를 사용하여 목록을 생성하는 데 도움이 될 수 있습니다.

  4. 목록 이해는 mapfilter을 대체하는 좋은 방법입니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿