반응형
롯데V3
롯데 우승하는 그날까지 개발...ing
롯데V3
전체 방문자
오늘
어제
  • 분류 전체보기 (216)
    • Computer Science (0)
      • 운영체제 (0)
    • Problem Solving (160)
      • 프로그래머스 (93)
      • 백준 (60)
      • 리트코드 (2)
      • SQL (5)
    • 언어 (8)
      • 파이썬 (8)
    • 취준 (1)
      • 합격후기 (1)
    • 도서 리뷰 (21)
      • IT 도서 리뷰 (20)
      • 기타 도서 리뷰 (1)
    • 논문 리뷰 (1)
    • 회고 (5)
      • TIL (5)
    • 머신러닝 (9)
      • 통계 (3)
      • 전처리 (1)
      • 클러스터링 (3)
    • 딥러닝 (3)
      • 자연어처리 (1)
      • LLM (1)
    • 프로젝트 (5)
    • Util (0)
    • Tool (1)
      • Poetry (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • DP
  • 티스토리챌린지

최근 댓글

최근 글

티스토리

250x250
hELLO · Designed By 정상우.
롯데V3

롯데 우승하는 그날까지 개발...ing

언어/파이썬

[Effective Python] BETTER WAY 5 - 복잡한 식을 쓰는 대신 도우미 함수를 작성하라

2022. 12. 28. 17:56
728x90
반응형

1. 복잡한 식 사용

파이썬은 문법이 간결하여 상당한 로직이 들어가는 식도 한 줄로 매우 쉽게 작성할 수 있다. 다음은 URL의 질의 문자열을 구문 분석하는 예제이다.

from urllib.parse import parse_qs

my_values = parse_qs('빨강=5&파랑=0&초록=', keep_blank_values=True)
print(repr(my_values))

>>>
{"빨강": ['5'], '파랑': ['0'], '초록':['']}

get 메서드를 활용하면 상황에 따라 다른 값이 반환된다.

print('빨강:', my_values.get('빨강'))
print('초록:', my_values.get('초록'))
print('투명도:', my_values.get('투명도'))

>>>
빨강: ['5']
초록: ['']
투명되: None

파라미터가 없거나 비어 있을 경우 0이 디폴트 값으로 대입되면 좋을 것이다. if 식을 통해 간단히 처리할 수 있다. 빈 문자열, 빈 리스트, 0이 모두 암시적으로 False로 평가되므로 오른쪽 식으로 계산된다.

red = my_values.get('빨강', [''])[0] or 0
green = my_values.get('초록', [''])[0] or 0
opacity = my_values.get('투명도', [''])[0] or 0
print(f'빨강: {red!r}')
print(f'초록: {green!r}')
print(f'투명도: {opacity!r}')

>>>
빨강:  '5'
초록: 0
투명도: 0

하지만 이 식은 읽기 어려울뿐만 아니라 원하는 기능(정수로 변환해서 즉시 수식에 활용)을 수행하지 못한다. 원하는 기능을 위해서는 다음처럼 int 내장 함수로 감싸야 한다.

red = int(my_values.get('빨강', [''])[0] or 0)

하지만 읽기 어렵기 때문에 if/else 조건식을 활용할 수 있다.

red_str = my_values.get('빨강', [''])
red = int(red_str[0]) if red_str[0] else 0

다음처럼 여러 줄로 나눠 쓴다면 더욱 명확해질 것이다.

green_str = my_values.get('초록', [''])
if green_str[0]:
	green = int(green_str[0])
else:
	green = 0

2. 도우미 함수 활용

위 로직을 반복 적용하려면 도우미 함수를 작성해야 하며 훨씬 명확해진다.

def get_first_int(values, key, default=0):
	found = values.get(key, [''])
    if found[0]:
    	return int(found[0])
    return default
    
green = get_first_int(my_values, '초록')

식이 복잡해지기 시작하면 바로 식을 더 작은 조각으로 나눠서 로직을 도우미 함수로 옮길지 고려해야 한다. 코드를 짧게 쓰는 것보다 가독성을 좋게 하는 것이 더 가치있다. '반복하지 말라(Don't Repeat Yourself)'라는 뜻의 DRY 원칙을 따르라.

728x90
반응형
저작자표시 (새창열림)

'언어 > 파이썬' 카테고리의 다른 글

[Effective Python] BETTER WAY 9 - for나 while 루프 뒤에 else 블록을 사용하지 말라  (0) 2022.12.31
[Effective Python] BETTER WAY 7 - range보다는 enumerate를 사용하라  (0) 2022.12.29
[Effective Python] BETTER WAY 6 - 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹해라  (0) 2022.12.29
[Effective Python] BETTER WAY 4 - C 스타일 형식 문자열을 str.format과 쓰기보다는 f-문자열을 통한 인터폴레이션을 사용하라  (0) 2022.12.28
[Effective Python] BETTER WAY 3 - bytes와 str의 차이를 알아두라  (0) 2022.12.24
    '언어/파이썬' 카테고리의 다른 글
    • [Effective Python] BETTER WAY 7 - range보다는 enumerate를 사용하라
    • [Effective Python] BETTER WAY 6 - 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹해라
    • [Effective Python] BETTER WAY 4 - C 스타일 형식 문자열을 str.format과 쓰기보다는 f-문자열을 통한 인터폴레이션을 사용하라
    • [Effective Python] BETTER WAY 3 - bytes와 str의 차이를 알아두라
    롯데V3
    롯데V3

    티스토리툴바