2011년 11월 19일 토요일

파이썬 List comprehension

파이썬의 List comprehension은 이걸 또 한글로 번역하면 말이 이상해지기때문에,

그냥 이대로 쓰겠습니다.

파이썬의 고차언어의 특징인 lambda , filter, map, reduce 알고리즘을 리스트로 간단히 구현하는 방법입니다.

보통 람다식을 써서,

a = [1,2,3,4,5] 이중에서 홀수만 골라낸다고 할때

filter (lambda x : x % 2 , a)

이런식으로 씁니다.

또, [1,2,3,4,5]의 리스트를 [2,4,6,8,10]으로 바꾸려면, 다음과 같이 합니다.

map(lambda x : x*2, a) 이런식으로 써줍니다.

그러면 list comprehension은 모냐, 똑같습니다.

[x for x in a if x % 2]
--> [1,3,5] 홀수만 골라내고,

[x*2 for x in a ]
--> [2,4,6,8,10]  두배로 튀겨줍니다.

그러면 람다식으로 하는거랑 리스트 컴프리헨션이 뭐가 다른가 하면,

다른거 없습니다. 똑같습니다.

결과도 똑같고, 사용문법만 조금 다른데,

뭐가 다른가하면 그냥 취향차이입니다.

커뮤니티에서는 그나마 list comprehension이 readable하다는 이유로 , list comprehension을 추천합니다.

이것을 일반적인 형태로 쓰면 아래와 같은데,
[expression for item1 in iterable1 if condition1
                   for item2 in iterable2 if condition2
                   ...
                   for itemN in iterableN if conditionN]


람다식으로 쓰면 훨씬 지저분해지겠죠, 괄호에 괄호가 중첩되는 형태이니,

이 리스트 컴프리헨션식은 for문을 중첩하는 것과 똑같습니다.

그럼 다시, for문이 낫냐, list 컴프리헨션이 낫냐의 문제로 돌아가면,

for문은 C언어부터 자바는 물론 현재도 많이 쓰는 방식이죠,,,

이것의 문제는 문제에 집중할 수 없는게 문제입니다.
if와 for문이 중첩되게 되면, 어디서 부터 끊어야 되는지,
또 차후에 코드를 다시 리뷰할때 이해가 쉽지 않습니다.

그리고, 정말 문제보다 바운더리컨디션에 신경을 많이 써야 됩니다.
그러다보니 그에 대한 반발로 function형 언어들이 나오게 된것이고

이러한 function형 언어는 , 익숙해지면, 정말 좋은 방법중의 하나입니다.

간단한 for문 if문 은 list comprehension으로  하면 됩니다.

남들 열줄쓸거 한두줄로 끝낼 수 있는거죠, 차후에 리뷰도 쉽고요,

C언어계열에서는 잘안쓰는 형태인데,  익숙해지면 정말 좋습니다.



댓글 없음:

댓글 쓰기