파이썬의 enumerate,zip 라는 어원에서 알 수 있듯이,
- enumerate 함수는 Iterator를 하나하나 열거(수를 세면서)하면서 각 원소들을 탐색하는 함수
- zip함수는 여러 Iterator의 각 Iterator의 행(Row)들을 열(Column)로 min(여러 iterator 인스턴스들의 요소 갯수들) 만큼 앞쪽에서부터 탐색하는 함수
라고 할 수 있습니다.
정확한 건 아니지만 이해하기 쉽게 개념적인 그림으로 나타내보면,
enumerate함수

zip함수

다음은 enumerate와 zip함수의 매개변수에 관해 살펴보겠습니다.
enumerate, zip 함수의 매개변수
함수명 | 파라메터 명 | 파라메터 기본값 | 설명 | 예제 |
enumerate함수 | ||||
iterable | iter()함수가 불려질 수 있는 인스턴스 | enumerate([chr(i+97) for i in range(10)]) | ||
start | 0 | 첫번째 열거되는 번호(오프셋) | enumerate([chr(i+97) for i in range(10)],start=-10) | |
zip함수 | ||||
*iterables | iter()함수가 불려질 수 있는 인스턴스들 | zip(range(10),range(11),range(12),range(13),...) | ||
strict | False | *iterables 매개변수에 여러개의 iterator들이 들어올 수 있으므로, 각각의 *iterables들이 같은 크기를 가져야 하는 지의 여부 활성화됐을때 iterables의 각각의 요소 갯수가 다르면 에러출력 |
zip(range(10),ranage(10),strict=True) 이면 에러안나고 정상작동, zip(range(10),ranage(14),strict=True) 이면 에러발생 |
기본 코드 사용 예시
#enumerate함수 예제
strings = ["string"+str(i) for i in reversed(range(-20,-10,1))]
print("strings:",strings)
print()
print("enumerate함수:")
start_number = 0
for idx,item in enumerate(strings,start=start_number):
print(f" 열거번호:",str(idx).zfill(2)+f" {type(idx)}"," 값:", item)
print()
print()
#zip함수 예제:
print("zip함수:")
ranges = [range(i*2,10+i*2) for i in range(5)]
print(" 원래 ranges값들:",)
for i in range(len(ranges)):
print(f" ranges[{i}]=",*map(lambda x: str(x).zfill(2),ranges[i]))
print()
print(" zip함수를 통해 묶은 결과")
for packed_row in zip( ranges[0],
ranges[1],
ranges[2],
ranges[3],
ranges[4],
strict=False):
print("\t",packed_row)
print()
#아래는 위의 zip사용 코드와 거의 유사하게 동작하는 리팩터링된 코드입니다.
if(True!=True):
#리팩터링1
for packed_row in zip( *ranges,strict=False):
print("\t ",*packed_row)
print()
#리팩터링2
for (v1,v2,v3,v4,v5) in zip( *ranges,strict=False):
print("\t ",v1,v2,v3,v4,v5)
print()
#리팩터링3
for v1,v2,v3,v4,v5 in zip( *ranges,strict=False):
print("\t ",v1,v2,v3,v4,v5)
print()
#...

추가적인 사항
enumerate
- start매개변수는 정수값만 허용되며, 이때 음의 정수도 가능하다.
zip
- strict매개변수값이 True일 경우, [len(iter1),len(iter2),len(iter3),...] 이 있을때 이들의 값이 [2,2,2,...] 처럼 전부 같은 값을 가지지 않고 [1,2,2,...] 같이 어느 한개 이상의 iterator의 요소 갯수도 틀리다면 에러를 발생시킨다.
- strict매개변수값이 False일때 [len(iter1),len(iter2),len(iter3),...] 의 값이 [1,2,3,...]처럼 서로 다를 경우, 탐색 횟수는 min([len(iter1),len(iter2),len(iter3),...])의 값을 가지며, 통합된 전체 갯수를 탐색하고 싶은 경우, 따로 구현하거나 itertools같은 라이브러리를 사용해야 한다.(itertools라이브러리는 다른 포스트에서 언급하기로 하겠습니다)
'Program Languages > Python' 카테고리의 다른 글
파이썬 filter,map 사용법 (1) | 2023.01.12 |
---|---|
파이썬 iterable, iterator, generator에 대해 알아보자 (0) | 2023.01.09 |
파이썬에서 심플한 웹서버 작동시키기 (2) | 2023.01.06 |
파이썬 비트 연산자 사용법 (0) | 2023.01.06 |
파이썬 에러 핸들링 문법 사용법 (0) | 2023.01.04 |