* 제가 공부한 것을 정리하는 글이기에, 모든 예시는 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(2015)
'기술스택을 쌓아보자 > Python' 카테고리의 다른 글
pandas 번역: Computational tools, pandas의 연산툴 (pandas User guide 번역/pandas 기초 입문/Pandas 간단 요약) (0) | 2021.01.06 |
---|---|
pandas user guide 번역: 목차 (0) | 2021.01.06 |
[파이썬 공부] Effective Python정리: 목차정리 (0) | 2020.12.29 |
[Pandas] 데이터프레임을 병합하는 다양한 방법들(1) how: outer, inner, left, right (밥먹고 마저쓴다) (0) | 2020.12.29 |
[pandas/판다스] 해당 기간 내의 날짜 구하기 (0) | 2020.09.13 |
댓글