파이썬 코딩의 기술 정리 #2
- 출판사 Github >> https://github.com/gilbutITbook/080235
- 저자 Github >> https://github.com/bslatkin/effectivepython
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을 적극적으로 사용해야하는 이유??
- 모든 iterator에 적용 가능하다 (list, tuple, dictionary, set 등)
- 인덱스로 시퀀스 내부에 접근하는 것보다 시각적으로 간단하고 명확하게 표현된다.
2. range 대신 enumerate를 사용하자
- enumerate란?
# enumerate는 인덱스를 함께 반환할 때 유리하다.
# 기존 인덱스를 알고 싶을 때 우리는
count = 0
for i in range(n):
count += 1
# 이런 식으로 for문 내에서 연산을 해주어야 했다.
pass
# enumerate를 사용하면
for count, i in enumerate(n):
# 이렇게 별도의 연산 과정을 거치지 않아도
# 자동으로 인덱스를 반환할 수 있어서 명확하고 편리하다.
pass
기존 인덱스를 알기 위해서 다음과 같은 과정을 거쳐야 했다.
- list 길이 측정을 위한 연산 -> O(n)
- index로 list 접근 -> O(n)
하지만 enumerate를 활용한다면, 보다 손쉽게 구현 가능하다.
다음과 같은 장점이 있다.
- enumerate(list, n)을 활용한다면, n번째 원소부터 접근 가능하다.
- 모든 원소에 불필요하게 접근하는 것을 방지할 수 있다.
3. 여러 iterator를 활용한다면, zip을 활용하자
- index를 통해 여러 iterator에 중복으로 접근되는 것을 방지할 수 있다.
- 불필요한 메모리 소비를 줄여서, 복잡하고 메모리 소비가 많은 프로그램에서 효율적으로 작동할 수 있다.
- 다만, iterator 길이가 동일한 경우에만 사용 가능하다.
- 만약 길이가 다르다면? 짧은 iterator가 끝나면 반복이 종료된다.
만약 길이가 긴 iterator를 기준으로 하고싶으면?
import itertools
# 모듈을 활용하자
# default 값은 None이다.
for _ in itertools.zip_longest(list1, list2):
pass
반응형
'Python tech > 고급 파이썬 공부' 카테고리의 다른 글
Python 이해하기 쉬운 코드 이름 짓기 (0) | 2023.02.26 |
---|---|
가독성 좋은 파이썬 코드 작성방법 (5) | 2023.02.19 |
올바른 코딩 질문하는 방법 (0) | 2023.02.18 |
[파이썬 스킬업 #3] slicing과 key parameter를 활용하자 (1) | 2022.01.26 |
[파이썬 스킬업 #1] PEP8 스타일 가이드 핵심 정리 (1) | 2022.01.17 |