2011-03-24 3 views
11

Google Python Style Guide은 필터, 맵핑 및 축소 대신 목록 내장 및 루프를 선호합니까?Google Python 스타일 가이드

되지 않는 언어 기능 : ... "사용 지능형리스트와 대신 루프에 대한 필터,지도, 그리고 줄일 수 있습니다."

주어진 설명 : 우리는 다음을 지원하지 않는 파이썬 버전을 사용하지 않는를 " 기능이 없으므로 새로운 스타일을 사용하지 않아도됩니다. "

답변

21

mapfilter은 목록 이해력보다 덜 강력합니다. LC를 한 단계에서 모두 필터링 및 매핑을 수행 할 수 있습니다, 그들은 명시 적 기능을 필요로하지 않고지도를 선호 또는 LC에 걸쳐 필터링 할 이유가 단순히 없습니다 때문에 특수 구문

# map and filter 
map(lambda x:x+1, filter(lambda x:x%3, range(10))) 
# same as LC 
[x+1 for x in range(10) if x%3] 

의보다 효율적으로 컴파일 할 수 있습니다.

reduce은 약간 다른데, 그 이유는 동등한 LC가 없기 때문이지만 일반적인 for 루프보다 큰 장점이 없습니다.

+9

'map()'이 여전히 논쟁의 여지가없는 정규 사용 사례는 기존 단일 인수 함수를 sequ에 적용하는 것입니다 'map (str, seq)'와 같이. 이런 종류의 작업이 파이썬 3에서 결국 유지 된 이유입니다. – ncoghlan

3

나는 그것이 모든 사람들이 그 기능을 잘 사용하는 방법을 알지 못하기 때문에 그것이라고 생각할 것이다. 익숙하지 않은 사람들은 가독성이 떨어질 수 있습니다. 또한 for 루프 및 목록 이해는 널리 사용되며 이해하기 쉽습니다. 비록 후자가 함수 프로그래밍에서 나온다고하더라도, map, filterreduce과 같이, 목록과 for 루프를 아주 잘 반영합니다. 어쨌든 람다를 키우거나 map, filter 또는 reduce와 함께 사용하는 함수를 정의하는 것은 성가신 일이 될 수 있습니다. 특히 람다가 단일 표현식 일 뿐이고 함수가 코드를 복잡하게 만들 수 있습니다. 당신은 어쨌든 그것들을 필요로하지 않습니다. map(func, seq)[func(x) for x in seq]이고 filterif 구성 요소와의 목록입니다. 루프 for을 사용하여 reduce을 수행 할 수 있습니다.

간략히 말하자면, for과 목록수록은 명확하며 대부분의 경우 기본적으로 동등한 기능을 제공합니다.

5

목록 내재는 일반적으로 filter, mapreduce보다 "피 니콘"으로 간주됩니다.

이 내용은 Python 제작자 Guido van Rossum이 article을 참조하십시오.

는 지금까지 스타일 가이드에서 "사용되지 않는 언어 기능"에 따라 본을 제출로, 분명히 (위에서 언급 한 article 참조) 파이썬 3 filter, mapreduce을 지양 할 계획이 있었다.

결국 이러한 계획 중 일부가 변경되었습니다. reduce이 내장 함수에서 삭제되어 functools 모듈로 이동되었지만 filtermap은 여전히 ​​기본 제공으로 available입니다.Google Python Style guide

+2

'functools' 그 자체가 표준 라이브러리의 일부입니다. 'reduce()'의 강등은 실제로 더 이상 내장되어 있지 않게 만들었습니다. – ncoghlan

+0

감사합니다 ncoghlan. 나는 이것을 반영하기 위해 나의 대답을 편집했다. 문맥 안에 따옴표를두기를 위해 – cschol

21

는 지능형리스트를 선호하는 대신 필터,지도의 루프 말을하지 않으며, 오히려

, 전체 문장 읽기,

사용을 줄이기 필터 및 맵 대신에리스트 comprehension과 for 루프 함수 인수 wo 어쨌든 uld는 인라인 된 람다입니다.. 예를 들어 (내 강조) 그래서

당신이 완전히 map를 사용하지 않는 것이 권장되지는 - 단지

[expression(item) for item in iterable] 

는이 경우에

map(lambda item: expression(item), iterable) 

하는 것이 바람직하다 목록 이해가보다 직접적이고 읽기 쉽다는 것을 분명히하십시오.

In [57]: %timeit map(str,range(100)) 
100000 loops, best of 3: 12.6 us per loop 

In [58]: %timeit [str(item) for item in range(100)] 
100000 loops, best of 3: 17 us per loop 
: 대신 그것은 부팅에 잘 수행

[str(item) for item in range(100)] 

긴 호흡의

map(str, range(100)) 

을 : 한편

이 같은 map를 사용하여 아무 잘못이 없습니다
+4

+1! – wim

+1

+1 성능 비교를 위해 ... 재미있는지도는이 경우 더 빠르게 실행됩니다. – noumenon

관련 문제