Python/2.7 information

파이썬을 더 멋있게 쓰기위한 함수, itertools 모듈

qkqhxla1 2015. 3. 5. 19:50

파이썬 코드를 더 간지나게 짜기 위한 함수들..



1. reduce

map과 비슷한거지만 조금 다르다. 두번째인자로 순서형 자료(리스트같은거.)를 받는데 이걸 받아서 첫번째 함수를 실행시킨다. 첫번째 함수로 반드시 인자가 두개씩 들어가게된다. 두번째로 들어온 인자가 2개 이상이면, 차례차례 들어가게 된다. 

import operator

print operator.add(1,2)
print reduce(operator.add,[1,2,3,4,5]) #((((1+2)+3)+4)+5) 의 순서로 함수가 실행된다. map은 이런거 안됨.


2. apply

첫번째 인자로 함수를 받지만 두번째 인자로는 첫번째 인자 함수의 인자 갯수만큼만 받을 수 있다. reduce처럼 자동으로 만들어서 실행시키는게 안됨.

print apply(lambda x,y:x+y,[1,2])
#print apply(lambda x,y:x+y,[1,2,3,4,5]) #에러뜨는 코드.


3. filter

이것도 두번째 인자를 받아서 첫번째 함수를 실행한다. map과 비슷한데 map과 다른점은 첫번째 함수에서 참인 값만 반환한다는 것이다. 아래 코드를 실행시켜서 차이점을 알아보자.

print filter(lambda x:x if x>0 else None,[-1,1,-5,10,60])
print map(lambda x:x if x>0 else None,[-1,1,-5,10,60])


4. enumerate

아래 코드를 실행시켜보면 알 수 있다. enumerate는 인자로 받은 리스트나 튜플로 인덱스와 내부의 내용을 서로 연결해준다. enumerate의 요점은 인덱스와 내용을 한번에! 인듯. 

a = ['hi','hello','my','name','is hong gil dong']
for i in enumerate(a):
    print i
print ''
for index,say in enumerate(a):
    print index,say


5. zip

함수 내부의 순서형 자료들의 인덱스가 같은 것끼리 튜플로 묶어준다. 아래 실행 결과처럼 리스트와 튜플이 들어가도 알아서 찾아서 튜플로 바꿔준다.

print zip((1,4,7),(2,5,8),[3,6,9])
print zip((1,3),(2,4))
#print zip((1,3),(2)) #서로 갯수가 맞지 않으면 에러뜸.


6. itertools 모듈

docs : https://docs.python.org/2/library/itertools.html 쓸모가 많을것같다. 

1) takewhile함수. 

while문을 돌려주는것처럼 계산해준다. 코드가 짧은게 장점이지만 출력하려면 아래처럼 for문으로 출력하거나 odd.next()등의 .next()메소드로 출력해야 한다. .next()메소드를 호출할때마다 값이 하나씩 나오는게 마치 제너레이터 같다.

10이하의 홀수를 구하는 간지코드... 출력부분을 제외하면 한줄이면 된다니....

# -*- encoding: cp949 -*-
import itertools
odd = itertools.takewhile(lambda i: i <= 10, (x for x in xrange(1000) if x % 2))
for i in odd:
    print i


2) ifilter함수.

앞의 함수와 연산해서 1이면 반환하고, 0이면 반환하지 않는다. 이걸 조금 응용해본 1~100사이의 소수 구하기. 코드 길이가 많이 줄어든다.

# -*- encoding: cp949 -*-
import itertools

for i in range(100):
    for j in range(1,i):
        if i%j==0 and j!=1:
            break
        if j==i-1:
            print i,

print ''

n = itertools.ifilter(lambda x:0 if [i for i in range(1,x) if x%i==0 and i!=1] else 1, range(2,100))
for i in n:
    print i,


나머지 함수들은 살펴봐도 왜 굳이 이런걸 쓸까..? 하는 생각밖에 안든다.(실력이 낮아서 이유를 모르겠네요.) 굳이 여기서 찾지 않더라도 손으로 구현할수 있을것 같기 때문이다... 코드길이가 특히 짧아질것 같지도 않고, 특별한 점이 있는것 같지도 않아서 이 두개만 소개..

'Python > 2.7 information' 카테고리의 다른 글

wargame.kr pyc_decompile  (0) 2015.03.29
분수 관련 fraction과 struct모듈  (0) 2015.03.28
*args, **kwargs  (0) 2015.03.01
pyv8 (python javascript engine)  (0) 2015.02.24
파이썬의 멀티쓰레딩과 멀티프로세싱.  (0) 2015.02.13