다음은 열거형(sequence)의 정보를 얻는 내장 함수들이다.
[표 1] 열거형의 정보를 얻는 내장 함수들
함수명 | 기능 |
len(seq) | 시퀀스형을 받아서 그 길이를 반환한다. |
iter(obj [,sentinel] ) next(iterator) | 객체의 이터레이터(iterator)를 반환한다. 이터레이터의 현재 요소를 반환하고 포인터를 하나 넘긴다. |
enumerate(iterable, start=0) | 이터러블에서 enumerate 형을 반환한다. |
sorted(iterable[,key][,reverse]) | 정렬된 *리스트*를 반환 |
reversed(seq) | 역순으로 된 *iterator*를 반환한다. |
filter(func, iterable) | iterable의 각 요소 중 func()의 반환값이 참인 것만을 묶어서 이터레이터로 반환. |
map(func, iterable) | iterable의 각 요소를 func()의 반환값으로 매핑해서 이터레이터로 반환. |
iter()은 seq형으로부터 이터레이터를 반환하는 함수이다. next()는 이터레이터의 현재 요소를 반환하고 이터레이터의 포인터를 그 다음 요소로 넘기는 함수이다.
enumerate()은 시퀀스로부터 enumarate형을 반환한다. 이것은 인덱스와 해당 값의 튜플을 반환하는 이터레이터를 가진다.
>>> seasons = ['spring','summer','fall','winter']>>> list(enumerate(seasons))[(0, 'spring'), (1, 'summer'), (2, 'fall'), (3, 'winter')]>>> list(enumerate(seasons, start=1))[(1, 'spring'), (2, 'summer'), (3, 'fall'), (4, 'winter')] |
보통은 for 문과 같이 사용되어서 반복문 안에서 이터러블의 요소값 뿐만 아니라 그 인덱스 정보도 필요할 경우 편리하게 사용할 수 있다.
>>> seasons=['spring','summer','fall','winter']>>> for i,v in enumerate(seasons): …: print("%s:%s"%(i,v)) 0:spring1:summer2:fall3:winter |
filter(func, iterable)는 함수와 이터러블을 입력으로 받아서 이터러블의 요소가 하나씩 함수에 인수로 전달될 때, 참을 반환시키는 것만을 따로 모아서 이터레이터로 반환하는 함수이다.
다음 예를 살펴보자.
def positive(l): result = [] for i in l: if i > 0: result.append(i) return result
>>> print(positive([1,-3,2,0,-5,6])) [1, 2, 6] |
위의 positive함수는 리스트를 입력값으로 받아서 각각의 요소를 판별해 양수값만 따로 리스트에 모아 그 결과값을 돌려주는 함수이다.
filter()함수를 이용하면 아래와 같이 똑같은 일을 동일하게 구현할 수 있다.
>>> def positive(x): … return x > 0 >>> print(list(filter(positive, [1,-3,2,0,-5,6])))[1, 2, 6] |
filter() 함수는 첫 번째 인수로 함수명을, 두 번째 인수로는 그 함수에 차례로 들어갈 이터러블(리스트, 터플, 문자열 등)을 받는다. filter 함수는 두 번째 인수인 이터러블의 각 요소들이 함수에 들어갔을 때 리턴값이 참인 것만을 이터레이터로 묶어서 돌려준다. 위의 예에서는 1, 2, 6 만이 양수로 x > 0 이라는 문장이 참이 되므로 [1, 2, 6]이라는 결과 값을 돌려주게 된다.
익명함수(lambda)를 쓰면 더욱 간편하게 쓸 수 있다.
>>> list(filter(lambda x: x > 0, [1,-3,2,0,-5,6])) [1, 2, 6] |
filter()와 유사한 map() 함수가 있다. 이것은 함수와 이터러블을 입력으로 받아서 각각의 요소가 함수의 입력으로 들어간 다음 나오는 출력값을 묶어서 이터레이터로 돌려주는 함수이다. 만약 어떠 리스트의 모든 요소의 제곱값을 갖는 새로운 리스트를 만들고 싶다면 다음과 같이 하면 된다.
>>> a = [2, 3, 4, 7, 8, 10]>>> a2 = list(map(lambda x:x**2, a))[4,9,16,49,64,100] |
파이썬 2.7은 filter()와 map()의 결과가 리스트이므로 위 예에서 list함수를 이용하여 리스트로 변환하지 않아도 된다. 파이썬 3.x에서는 이들 함수의 반환값이 리스트가 아닌 반복형(iterable)이므로 이것을 리스트로 만들기 위해서는 list()함수를 명시적으로 사용해야 한다.