itertools의 combinations가 결과를 어떻게 뽑아내는지 궁금해서 레퍼런스를 찾아보았다.
코드 내용을 읽어보는데 if-else 문이 들여쓰기(indent)가 다른걸 보고 이상함을 느껴 정보를 찾아보게 되었다.
else
부분에서 들여쓰기(indent)가 for문과 같은 걸 볼 수 있다.
https://docs.python.org/es/3/library/itertools.html#itertools.combinations
else
조건문은 if-else
문에서 사용하는 걸로 알고 있지만 for-else
문 처럼 활용할 수 도 있다.
이는 for문이 완전히 작동했으면 else문이 수행되고, 중간에 break되면 다음 코드로 넘어간다
for i in range(10):
if i > 10:
break
print(i)
else:
print('for문이 완전하게 수행되었음')
실행 결과
특정 함수의 반환값을 얻는데 10분이 걸린다고 하자.
함수 내부에서는 내가 활용할 정보를 일부분이라도 가지고 있을 것이다.
그 정보만이라도 미리 처리를 해두면 전체 프로그램의 속도가 빠르지 않을까?
import time
def without_yield():
result = []
for i in range(3):
time.sleep(2)
result.append(i)
return result
def with_yield():
result = []
for i in range(3):
time.sleep(2)
yield i
print('funtion without yield')
start_for = time.time()
for value in without_yield():
print('{} (time taken: {})'.format(value, time.time() - start_for))
print('function with yield')
start_for = time.time()
for value in with_yield():
print('{} (time taken: {})'.format(value, time.time() - start_for))
실행결과
양쪽 다 완전히 실행되는데는 약 6초가량이 소요되었다.
하지만 yield를 사용한 함수는 2초, 4초 대에 각각 필요로 하는 값을 제공했다.
즉 첫번째 값은 4초동안, 두번째 값은 2초동안 활용할 수 있는 시간이 확보되었다는 뜻.
filter(<조건식>, iterator) 레퍼런스
백준 2798번 블랙잭 문제의 풀이를 보다가 알게되어 작성한다.
filter(lambda x: x <= m, map(sum, combinations(cards, 3)))
딜러가 제시하는 값 m
이하, 가장 가까운 수를 만들기 위해 3장의 카드를 선택해야 했다.
combinations는 itertools를 찾아보면 알 수 있고, map() 또한 앞서 다뤄봤다.
여기서 filter의 역할은 map(sum, combinations(cards,3))
를 통해 도출한 여러 값들 중 조건식 x <= m
을 만족하는 값만 도출하기 위함이였다.
나는 모든 sum(comnibations(cards, 3))
을 배열에 모아 한번 더 처리할 생각이였는데 기발하다고 생각했다.