본문 바로가기
기술스택을 쌓아보자/Python

[파이썬기초] Effective Python item4: 파이썬스러운 생각- 복잡한 표현보다 Helper function을 이용하기 / 파이썬 코딩 요령?

by 소리331 2020. 12. 29.
반응형

* 제가 공부한 것을 정리하는 글이기에, 모든 예시는 effective python에서 가져옵니다(가끔 내가 만든게 섞일수도 있어용)

** 파이썬 2.5 내용은 안적음 ㅎㅎ

 

들어가기 전 선요약

더보기

-  파이썬의 특징을 이용하면 복잡하고 긴 코드를 간단히 한줄로 작성하기 쉬워진다!

- 복잡한 표현들을 helper function들로 모아 넣으세용 특히 반복적으로 필요하다고 생각되는 경우!

-  if/else문을 사용하면 boolean(참/거짓) 과 and. or 등의 연산자를 사용하는 것보다 코드가 읽기 편해집니다.

* helper function이란? 따로 많이 쓰이진 않으나, 이 글에서는 코드를 함수화 하여 사용하는 것이라고 생각하시면 편할 것 같습니다!


 

파이썬이 다른 언어에 비해 간결하다(pithy)!

 

파이썬이 사랑받는 이유중 하나는 간결함 입니다! 그렇기 때문에 item4에서는 파이썬의 간결함을 살린 코딩에 대해 이야기합니다. 

 

 

코딩 예시: 하나의 코딩내에서 하나하나 조립하고 싶다!

 

from urllib.parse import parse_qs

my_values = parse_qs(
	‘red=5&blue=0&green=’,
    keep_blank_values=True
    )

print(repr(my_values))

>>> {‘red’: [‘5’], ‘green’: [”], ‘blue’: [‘0’]}

 

‘red=5&blue=0&green=’ 이라는 text에서 각 red, grean, blue에 해당하는 값들을 파싱해온 결과를 보여주고 있습니다. 

 

그런데, 코딩하다보면 저희가 문자열이 어떤 내용을 가지고 있는지 모르고 값을 parsing 할 때도 있습니다.  있는지 없는지 존재조차 모르게 되는 때도 당연히! 있구요. 저희가 만약 문자열의 값을 모르고, 원하는 값을 파싱하고 싶다면 아래와 같이 get을 이용해서 확인해보면 되겠죠?

 

print(‘Red: ’, my_values.get(‘red’))
print(‘Green: ’, my_values.get(‘green’))
print(‘Opacity: ‘, my_values.get(‘opacity’))

>>>
Red: [‘5’]
Green: [”]
Opacity: None

 

green은 원래 문자열에 있었으나 값이 할당되지 않아 '' 을 보여주었고, Opacity는 애초에 문자열에 없다 보니 아예 None으로 return 되었네요! 여기서 더! 깔끔하게 값이 ''이거나 아예 인자가 query(문자열)에 없는 경우는 0이 나오도록 해봅시다.

 

# For query string ‘red=5&blue=0&green=’
red = my_values.get(‘red’, [”])[0] or 0
green = my_values.get(‘green’, [”])[0] or 0
opacity = my_values.get(‘opacity’, [”])[0] or 0
print(‘Red: %r’ % red)
print(‘Green: %r’ % green)
print(‘Opacity: %r’ % opacity)

>>>
Red: ‘5’
Green: 0
Opacity: 0

 

여기서 더!  red의 값만 숫자가 아니라 '문자' 인 것이 상당히 거슬립니다... 아주 상당히... 그럼 red처럼 값이 존재하는 경우를 숫자로 만들어 볼게요! 그런데 저는 파이썬 공부해서 괜찮은데, 이제 작가분은 가독성이 떨어지는 코드라고 하십니다 ㅎㅎ

 

red = int(my_values.get(‘red’, [”])[0] or 0)

 

요 코드를 가독성있게! readable하게 수정한다면

 

red = my_values.get(‘red’, [”])
red = int(red[0]) if red[0] else 0

 

깔끔하죠? red구해줘, red를 숫자로 바꿔줘. 여기서 if else문을 활용해도 코드가 상당히 읽기 편해집니다.

 

green = my_values.get(‘green’, [”])
if green[0]:
	green = int(green[0])
else:
	green = 0

 

green[0]의 값이 있으면 int로, 없으면 0으로! 한눈에 읽기 쉽죠? 요렇게 우리는 문자열 내의 쿼리값들을 파싱하기 위해 길고 긴 글을 읽어왔습니다. 

 

 

그런데, 이런 잡무는 한번만 하면 좋겠죠? 시간은 소중하니께

코딩 목적지:  계속 하나씩 조립하기 귀찮으니까 함수로 퉁쳐

 

이것을 위해 앞의 긴 예시를 넘어왔습니다. 앞의 예시와 같은 작업들이 여러번 있다면 매번 사용할 수는 없겠죠? 미쳐버릴 것 같습니다. 생각만해도... 그럴때 함수를 활용해주면 좋습니다. 아래의 코드를 보면, 한번 함수화 해놓으면 그 뒤에는 함수 한줄만 쓰면 되겠죠?

 

my_values = parse_qs(query_set,keep_blank_values=True)

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

 

여기서 더 나아가서 어떤 분들은 이런 질문도 하실 수 있을 것 같아요,

앗 그럼 위의 코드 에시에서 my_values는요? 왜 함수안에 넣지 않죠?

라고 물으신다면 함수를 호출할 때마다 매번 parse_qs를 하는 것이 비효율적이라고 생각하기 때문 아닐까요? 

 

 

생각보다 한 item의 분량이 짧네용 그치만 오늘은

너무 피곤해서 ㅠ

 

Effective python 목차 및 정리 링크: great-woman-hoseung.tistory.com/20

 

[파이썬 공부] Effective Python정리: 목차정리

파이썬 계의 교과서라는 Effective Pyhton 책을 공부하면서 내용을 정리할 생각입니다. 이미 공부한 내용들도 있지만 좀 더 짧은 코드로 더 많은 것을 하고 싶은 욕심에 계속 공부하게 되는 것 같아

great-woman-hoseung.tistory.com

 


참고자료

 Effective Python(2015)

반응형

댓글