반응형
enumerate 함수의 형식은 다음과 같다.
enumerate(iterable, start=0)
iterable한 데이터를 입력받아 iteration한 값과 start부터 증가하는 값을 묶은 튜플을 반환한다.
예시는 다음과 같다.
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')]
구현을 해보면
def my_enumerate(sequence, start=0):
result=[]
for i in range(len(sequence)):
result.append((i+start, sequence[i]))
return result
이렇게 sequence를 for문으로 돌며 append를 하는 방식으로 구현을 했다.
하지만!!
python docs엔 아래와 같이 조금 더 pythonic한 스타일로 다음과 같이 구현이 되어 있었다.
def my_enumerate(sequence, start=0):
i=start
for element in sequence:
yield i, element
i+=1
여기서 yield는 return과 비슷하지만 데이터 대신 제너레이터를 반환하며 모든 값을 메모리에 담고 있지 않고 그때그때하나씩 생성해서 메모리에 올린다는 장점이 있다고 한다.
이 같은 특성 때문에 한번에 한개의 값만 순환할 수 있다고 한다.
마지막으로 테스트를 해보면
test1 = [60, 50, 20, 10]
test2 = [True, None, 'test']
assert list(enumerate(test1)) == list(my_enumerate(test1))
assert list(enumerate(test2, 12)) == list(my_enumerate(test2, 12))
테스트 아웃풋이 잘 나온 것을 확인할 수 있다.
반응형
'Studying > Python' 카테고리의 다른 글
[Python] 내장함수 range 구현 (0) | 2022.05.18 |
---|---|
[Python] 내장함수 max, min 구현 (0) | 2022.05.16 |
[Python] 내장함수 round 구현 (0) | 2022.05.15 |
[Python] 내장함수 abs 구현 (0) | 2022.05.13 |
[Python] 내장함수 all 구현 (0) | 2022.05.12 |
댓글