Powerful Iterator object in Python
파이썬으로 컴퓨터 랭귀지에 입문하신 분들 많으실 거 같아요! 아무래도, 사용하기 간단한 언어다 보니, 그런 경우가 있는 것 같습니다. 하지만 생각보다는 그렇게 쉬운 랭귀지는 아닙니다. 역사가 거의 30년에 가까운 언어이며, 동시에 사용할 수 있는 라이브러리의 수도 많고 그만큼 기반이 튼튼한 언어이기 때문에 학습을 열심히 하셔야 합니다!
다름이 아니라, Python의 map함수와 zip함수에 대해서 알아보고자 합니다!!
map
주어진 iterable(list, tuple 등, iteration이 가능한 object)의 각 항목에 주어진 함수 혹은, 키워드를 사용해서 반복 가능한 map객체를 반환하는 역할을 합니다.
위의 알고리즘을 보면 알 수 있듯이 첫번째 인자에는 적용될 함수 혹은 키워드가 들어갑니다. 그리고 두 번째 인자로는 적용되어야 할 반복자 객체가 들어갑니다. 그렇다면 실제 코드에서는 어떻게 동작할지 한번 작성해보도록 하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Foo(dict):
def __init__(self, value = None):
self.value = value
def __iter__(self):
for foo,bar in self.items():
print(foo, bar)
def show(self):
return self.__iter__()
def addOne(v):
return v + 1
bar = [1,2,3,4]
barr = map(addOne, bar)
if __name__ == "__main__":
f = Foo(3)
f[1] = 4
f[2] = 5
f.show()
print(list(barr))
|
cs |
제가 dict객체를 상속하는 클래스와 map함수를 같이 사용했습니다. 클래스는 저번 포스팅에서 dict를 객체가 상속해서 사용하는 방법을 알려드렸어야 했는데, 기입을 못해서 같이 올립니다!! 여하튼, 밑에 map함수를 보도록 하겠습니다. addOne이라는 함수는 인자를 하나 받아서 하나를 더하기 한 다음 반환하는 함수입니다. 그리고 밑에 리스트가 하나 선언되어있고요~ 15번째 줄에는 map함수를 통해서 iterable객체로 묶어주었습니다. 그러고 나서 아래 프로그램 실행부에서 print(list(barr))하게 되면, iterable객체는 list객체로 임시적으로 변환되어 출력되게 되고 bar의 리스트의 요소들은 모두 1씩 더해진 결괏값이 출력되게 됩니다!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
from collections import Sequence
class Foo(Sequence):
def __init__(self, *value):
self.value = list(value)
def next(self):
if not self.value:
raise StopIteration
else:
return self.value.pop()
def __getitem__(self, idx):
return self.value[idx]
def __len__(self):
return len(self.value)
def doubleAddOne(i):
return i+1
if __name__ == "__main__":
f = Foo(3,23,4,35,1,21)
d = map(doubleAddOne, f)
print(list(d))
|
cs |
조금 코드가 복잡해졌죠? collection모듈 내부에 Sequence를 추출했습니다. 그리고 클래스 Foo는 이를 상속하는 것을 확인할 수 있습니다. 아래에는 여러 매직메서드와 iteration기능이 추가되어있습니다. 만약 클래스 객체 자체를 그냥 iterable객체로 만들고 싶다면 위의 매직 메서드는 추가되어야 할 것입니다. 이유로는,
아까 말씀드렸듯이, map은 반복자를 생성해서 반환한다고 말씀드렸습니다. 그렇다면, 첫번째 인자로 들어온 함수 혹은 키워드를 두 번째 인자에 적용하기 위해선 두 번째 인자가 반복자여야 가능하지 않겠습니까? 그렇기 때문에 __getitem__, __len__ 매직 메서드가 필요한 거죠, 반복하면서 돌아가야 하기 때문에 길이와 각 인덱스에 맞는 element가 반환돼야 하니까요!!
Zip
zip내장 함수 또한 map과 그렇게 차이가 나지 않습니다. 임의의 반복자 내부에 element에 매핑하기 위한 기능을 지원하는 함수이기 때문에 정말 많이 사용됩니다.

우선 코드를 보면서 사용방법에 대해서 알아보도록 하겠습니다!!!
1
2
3
4
5
6
7
8
9
|
a = ['a','b','c','d','e']
b = [1,2,3,4,5]
c = [6,7,8,9,10]
d = zip(a,b,c)
print(list(d))
RESULT >
[('a', 1, 6), ('b', 2, 7), ('c', 3, 8), ('d', 4, 9), ('e', 5, 10)]
|
cs |
위처럼 사용할 수 있습니다. 어떤 반복자든 인덱스를 이용해서 매핑하기 때문에 사용방법이 조금 까다로울 수 있으나 사용할 때가 많기 때문에 잘 사용하기 바랍니다!! 물론 아래와 같은 반복 또한 가능합니다!
1
2
3
4
5
6
7
8
9
10
|
korea = ['대한민국', '만세', '화이팅']
strong = ['강한 나라', '우리 나라', '언제나 ']
for rea,reb in zip(korea,strong):
print(f'{reb} {rea}')
RESULT >
강한 나라 대한민국
우리 나라 만세
언제나 화이팅
|
cs |
아래와 같이 반복자로서 바로 사용해도 됩니다!!!
오늘 map이랑 zip 사용방법과 그에 대한 설명을 진행했는데, 조금 어려우실수도 있을 거라 생각합니다. 하지만, 천천히 읽어보시면 다 이해가 되니 천천히 읽어보시길 추천드립니다!!
글 잘 보셨다면, 댓글 하트 남겨주시면 감사하겠습니당😍
댓글로 피드백, 문의, 질문 모두 환영합니다!!
'Python' 카테고리의 다른 글
[Python 자료구조] 트리자료구조 구현_implemented Tree Structure@_탐색, 순회, 추가 및 삭제 (0) | 2021.01.04 |
---|---|
[Python활용]파이썬 제너레이터를 이용한 파일 읽기 및 쓰기!! (1) | 2020.12.14 |
[Python] DefaultDict 다루기!!! (0) | 2020.12.10 |
[Python_Class#1] 파이썬 Class 손 쉽게 이해하기!! (0) | 2020.12.08 |
파이썬 dict && DefaultDict 다루기!! 이 정도면 편하게 쓴다! (0) | 2020.12.01 |
댓글