SW사관학교 정글7기 개발일지 (08/12)

c4fiber·2023년 8월 12일
0

SW사관학교 정글7기

목록 보기
6/49

Python 공부

1. for - else

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문이 완전하게 수행되었음')

실행 결과


2. yield

원본 내용 블로그: daleseo

특정 함수의 반환값을 얻는데 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초동안 활용할 수 있는 시간이 확보되었다는 뜻.


3. filter()

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))을 배열에 모아 한번 더 처리할 생각이였는데 기발하다고 생각했다.

profile
amazing idiot

0개의 댓글