Python tech/고급 파이썬 공부

[파이썬 스킬업 #2] unpacking, enumerate, zip 활용하자

콜레오네 2022. 1. 26. 02:07
파이썬 코딩의 기술 정리 #2

1. 인덱싱 indexing 대신, 언패킹 Unpacking을 사용합니다.

- 파이썬 언패킹이란?

  • 여러 객체를 포함하고 있는 하나의 객체를 풀어주는 행위
  • 반대 개념으로 당연하 패킹 packing이 있겠죠 (=여러 객체를 하나로 묶어주는 행위)
#packing
packing_tuple = (a, b, c)
packing_list = [a, b, c, d]

#unpacking
a, b, c = packing_tuple
a, _, c, d = packing_list  #언패킹과 동시에 b는 메모리에 할당하지 않음

#########################

# indexing을 사용할 경우
a = pack[0]
b = pack[1]

# unpacking을 사용할 경우
a, b, _ = pack

인덱싱을 사용할 때보다 훨씬 깔끔하고 코드 라인도 줄어든 것을 확인할 수 있습니다.

 

 

Unpacking을 이용해 손쉽게 값을 치환할 수 있습니다.

버블 정렬과 같은 경우에 잘 활용될 수 있습니다.

# 일반적인 case
temp = a
a = b
b = temp

# unpacking을 통한 치환
a, b = b, a

 

Unpacking은 물론 for문에서도 잘 활용될 수 있습니다.

세 원소로 구성된 iterator를 반복해봅시다.

# 일반적인 case
for foo in bar:
    a = foo[0]
    b = foo[1]
    c = foo[2]
    pass
    
# unpacking case
for a, b, c in bar:
    pass

 

- 언패킹 Unpacking을 적극적으로 사용해야하는 이유??

  1. 모든 iterator에 적용 가능하다 (list, tuple, dictionary, set 등)
  2. 인덱스로 시퀀스 내부에 접근하는 것보다 시각적으로 간단하고 명확하게 표현된다.

 

 


2. range 대신 enumerate를 사용하자

- enumerate란?

# enumerate는 인덱스를 함께 반환할 때 유리하다.
# 기존 인덱스를 알고 싶을 때 우리는
count = 0
for i in range(n):
    count += 1
    # 이런 식으로 for문 내에서 연산을 해주어야 했다.
    pass
    
# enumerate를 사용하면
for count, i in enumerate(n):
    # 이렇게 별도의 연산 과정을 거치지 않아도
    # 자동으로 인덱스를 반환할 수 있어서 명확하고 편리하다.
    pass

 

기존 인덱스를 알기 위해서 다음과 같은 과정을 거쳐야 했다.

  1. list 길이 측정을 위한 연산 -> O(n)
  2. index로 list 접근 -> O(n)

하지만 enumerate를 활용한다면, 보다 손쉽게 구현 가능하다.

다음과 같은 장점이 있다.

  1. enumerate(list, n)을 활용한다면, n번째 원소부터 접근 가능하다.
  2. 모든 원소에 불필요하게 접근하는 것을 방지할 수 있다.

 


3. 여러 iterator를 활용한다면, zip을 활용하자

  • index를 통해 여러 iterator에 중복으로 접근되는 것을 방지할 수 있다.
  • 불필요한 메모리 소비를 줄여서, 복잡하고 메모리 소비가 많은 프로그램에서 효율적으로 작동할 수 있다.
  • 다만, iterator 길이가 동일한 경우에만 사용 가능하다.
  • 만약 길이가 다르다면? 짧은 iterator가 끝나면 반복이 종료된다.

 

만약 길이가 긴 iterator를 기준으로 하고싶으면?

import itertools
# 모듈을 활용하자
# default 값은 None이다.
for _ in itertools.zip_longest(list1, list2):
    pass

 

반응형