goodthings4me.tistory.com
■ Effective_python1.Pythonic #2
05.복잡한 식 대신 도우미 함수 작성
from urllib.parse import parse_qs ## query_string parsing
## 파라미터에서 값을 정수로 얻어야 하는 경우,
my_value = parse_qs('빨강=5&파랑=0&초록=', keep_blank_values=True) ## dict 반환
print(repr(my_value))
# {'빨강': ['5'], '파랑': ['0'], '초록': ['']}
print('빨강', my_value.get('빨강')) ## get()은 list 반환
# 빨강 ['5']
print('파랑', my_value.get('파랑'))
# 파랑 ['0']
print('투명도', my_value.get('투명도')) ## get()은 값이 없으면 None 반환
# 투명도 None
## if 표현식 - [true] or [false] 왼쪽 식이 True이면 왼쪽, False면 오른쪽의 식 값 계산
red = my_value.get('빨강', [''])[0] or 0 ## True이면 index [0], False이면 0
print(f'빨강: {red!r}') ## f-문자열 repr
# 빨강: '5'
opacity = my_value.get('투명도', [''])[0] or 0
print(f'투명도: {opacity!r}') ## get()은 키가 없을 때 두번째 인자 반환
# 투명도: 0
## 파라미터 정수를 얻기
red = int(my_value.get('빨강',[''])[0] or 0)
print(red)
# 5
## 파라미터가 많은 경우, 로직 반복(중복)이 많아진다.
## 식이 복잡해지면 식을 더 작은 조각으로 나눠서 로직을 도우미 함수로 할지 고민하는 것이 좋으며,
## 이유는, 코드를 줄여쓰는 것보다 가독성을 좋게 하는 것이 가치가 있다.
def get_first_int(value, key, default=0):
found = value.get(key, [''])
if found[0]:
return int(found[0])
return default
print(get_first_int(my_value, '빨강'))
# 5
print(get_first_int(my_value, '파랑'))
# 0
print(get_first_int(my_value, '초록'))
# 0
print(f"투명도: {get_first_int(my_value, '투명도')}")
red_str = my_value.get('빨강', [''])
red = red_str[0] if red_str[0] else 0 # 삼항 조건식
print(red)
# 5
06.인덱스 대신 언패킹(풀기) 대입 방법 사용
item = ('호박엿', '식혜')
first = item[0]
second = item[1]
print(first, '&', second) ## index 사용 출력
# 호박엿 & 식혜
first, second = item ## 언패킹 사용
print(first, '&', second)
# 호박엿 & 식혜
## 리스트 요소에 index 통해 접근
snacks = [('베이컨', 358), ('도넛', 240), ('머핀', 190)]
for i in range(len(snacks)):
item = snacks[i]
name = item[0]
calories = item[1]
print(f'#{i + 1}: {name}은 {calories}칼로리입니다.')
#1: 베이컨은 358칼로리입니다.
#2: 도넛은 240칼로리입니다.
#3: 머핀은 190칼로리입니다.
## 내장함수(enumerate)와 언패킹 사용 시, 리스트 요소에 쉽게 접근
for rank, (name, calories) in enumerate(snacks, 1):
print(f'#{rank}: {name}은 {calories}칼로리입니다.')
#1: 베이컨은 358칼로리입니다.
#2: 도넛은 240칼로리입니다.
#3: 머핀은 190칼로리입니다.
07.range보다는 enumertate 사용
## 리스트 이터레이션 시 몇 번째 요소 처리중인지 알아야 할 때
flavor_list = ['바닐라', '초콜릿', '딸기', '아이스크림']
for i in range(len(flavor_list)):
flavor = flavor_list[i]
print(f'{i + 1}: {flavor}')
# 1: 바닐라
# 2: 초콜릿
# 3: 딸기
# 4: 아이스크림
for i, flavor in enumerate(flavor_list):
print(f'{i + 1}: {flavor}')
# 1: 바닐라
# 2: 초콜릿
# 3: 딸기
# 4: 아이스크림
## enumerate 동작 방식
it = enumerate(flavor_list)
print(next(it))
print(next(it))
# (0, '바닐라')
# (1, '초콜릿')
08.여러 이터레이터 루프 수행 시 zip 사용
names = ['사과', '바나나', '감', '파인애플']
counts = [len(n) for n in names]
print(counts)
# [2, 3, 1, 4]
longest_name = None
max_count = 0
for i in range(len(names)):
count = counts[i]
if count > max_count:
longest_name = names[i]
max_count = count
print(longest_name)
# 파인애플
## zip은 둘 이상의 이터레이터를 지연 계산 제너레이터를 사용해 묶어준다
## 단, 이터레이터의 길이가 같아야 한다(zip은 짧은 길이를 기준으로 처리)
for name, count in zip(names, counts):
if count > max_count:
longest_name = name
max_count = count
print(longest_name)
# 파인애플
## 길이가 다른 이터레이터를 zip에 전달 --> itertools.zip_longest 사용
## 존재하지 않는 값은 fillvalue(default는 None)로 대체
names.append('망고')
import itertools
for name, count in itertools.zip_longest(names, counts):
print(f'{name}: {count}')
# 사과: 2
# 바나나: 3
# 감: 1
# 파인애플: 4
# 망고: None
09.반복문(for, while) 뒤에 else 블록 사용하지 않기
10.대입식(assignment expression)으로 반복 피하기
- 대입식(assignment expression) - 왈러스 연산자(walrus operator) : 3.8에서 도입
- a := b --> a 왈러스 b, := 기호는 바다코끼리의 눈과 엄니
- 대입식의 값은 왈러스 연산자 왼쪽에 있는 식별자에 대입된 값
- 대입문이 쓰일 수 없는 위치에서 변수에 값을 대입할 수 있어서 유용함
fresh_fruit = {
'사과': 10,
'바나나': 8,
'레몬': 5,
}
def out_of_stock(count):
print(f'{count}개')
count = fresh_fruit.get('레몬', 0)
if count:
out_of_stock(count)
else:
print('재고 없음')
# 5개
## 한 번만 쓰이는 변수(중요하지 않은 변수)를 대입식으로 처리 (대입 후 평가)
if count := fresh_fruit.get('사과', 0): ## if문에서만 사용하는 변수 의미
out_of_stock(count)
else:
print('재고 없음')
# 10개
## 주의사항 : 대입식 결과와 비교연산자가 있을 경우 대입식을 괄호로 감싼다
if count := fresh_fruit.get('레몬', 0) >= 5:
out_of_stock(count)
else:
print('재고 없음')
# True개
if (count := fresh_fruit.get('레몬', 0)) >= 5:
out_of_stock(count)
else:
print('재고 없음')
# 재고 없음
블로그 인기글
[국세청] 현금영수증가맹점으로 가입바랍니다. 메시지 해결방법(개인사업자)
▶ 현금영수증 가맹점 가입 메시지를 받고... 온라인 쇼핑몰 사업을 시작하려고 사업자등록증을 발급받고 난 후 얼마 안 있어서 국세청으로부터 어느 시점까지 '현금영수증 가맹점'으로 가입하라는 문자메시지가 받았었다. 그 메시지 기한이 오늘 도래했는데, 인터넷에서 찾아보니 홈택스에서 현금영수증 발급 사업자 신청을 할 수가 있었다. [관련내용] 홈>국세정책/제도>전자(세금)계산서/현금영수증/신용카드>현금영수증∙신용카드>가맹점가입 ▶ 홈택스 사이트에서 신청하는 절차는 다음과 같다. 우선, 홈택스에 로그인을 해야 합니다. 세상이 좋아져서 공인인증서 없이도 손쉽게 간편인증 로그인이 가능하다. 여러 인증방법 중 카카오톡 인증이 가장 편리한 거 같다. 간편인증 로그인 후 상단 '조회/발급' 탭 클릭 후 '현금영수증>현금..
goodthings4me.tistory.com
엑셀 시트 분리 저장 - 엑셀 파일의 시트를 분리하여 저장하기
엑셀을 사용하다 보면 엑셀 시트를 분리해서 저장해야 할 때가 있다. 최근에도 이런 경우가 발생하여 구글링 후 엑셀 시트 분리 업무를 수행하고 내친김에 다른 사람들도 사용할 수 있도록 파이썬 tkinter로 프로그램으로 만들어 보았다. Excel Sheets 분리 저장하는 프로그램(with 파이썬 Tkinter) ※ 프로그램 다운로드(네이버 MYBOX에서 공유) : ExcelSeparateSheets.zip ▶ 프래그램을 실행하면 다음과 같이 초기 화면이 보인다. 찾아보기 : 엑셀 파일이 있는 폴더를 선택한다. (프로그램이 있는 최상위 디렉터리가 열린다) 실행하기 : 프로그램 실행 버튼 상태 변경 순서 : 실행전 → 실행 중 → Sheet "OOO" 분리 저장 중 → 실행 완료 실행 결과 확인 : 엑셀 파..
goodthings4me.tistory.com
[엑셀] 근무연수 및 근무 개월수 계산하는 함수
직장을 다니다 보면 몇 년 몇 개월 또는 전체 며칠을 다니고 있는지 궁금할 때가 있다. 아니면, 총무나 인사 일을 할 때 직원들의 근속연수 또는 근속개월수 등을 계산하고 싶을 때도 있다. 이런 경우 엑셀 함수를 활용하면 어떨까!! 근무연수 및 근무 개월수 계산 함수 알아보기 엑셀에서 근무연수 또는 근무 개월수 계산하는 것은 datedif() 함수를 사용하면 간단하게 해결할 수 있다. 아래 이미지를 보면서 설명하면, 셀 E1에 기준일자를 입력하고, 근무연수를 구할 때는 =datedif(B3,$E$1,"Y")&"년" 을 입력한다. 근무개월수는 =datedif(B3,$E$1,"M")&"개월" 처럼 입력한다. 일수까지 파악할 때문 별로 없지만, 심심풀이로 구해보고 싶을 때 =datedif(B3,$E$1,"D")..
goodthings4me.tistory.com
'코딩 연습 > 코딩배우기' 카테고리의 다른 글
파이썬 실천 기술 #02 - 데이터 구조 (0) | 2021.05.20 |
---|---|
파이썬 실천 기술 #01 - PEP20, 제어흐름(if, for, while, Exception) (0) | 2021.05.18 |
파이썬 코딩의 기술 - 1.Pythonic #1 (0) | 2020.11.15 |
파이썬 웹 크롤링(Web Crawling) 알아보기 #10 (0) | 2020.11.14 |
파이썬 크롤링(Crawling) - 셀레니움(Selenium) 연습 #3 (0) | 2020.11.12 |
댓글