콘텐츠로 이동

SET 18 — 서술형 모범답안


1. 출력 900.0 800.0 850.0

* 뒤의 rate, vip는 키워드 전용 인자입니다. discount(1000)은 기본값 rate=0.1, vip=False1000*(1-0.1)=900.0. discount(1000, rate=0.2)1000*(1-0.2)=800.0. discount(1000, vip=True)vipTruerate0.1+0.05=0.15로 늘어나 1000*(1-0.15)=850.0이 됩니다.

2. 출력 [1, 3, 6, 10] 10

리스트 컴프리헨션이 acc.add(1), acc.add(2), acc.add(3), acc.add(4)를 순서대로 호출합니다. add는 호출될 때마다 self.total에 누적해서 더한 뒤 그 값을 반환하므로 total1→3→6→10으로 변하고, 각 반환값이 results에 담깁니다. 마지막 acc.total10입니다.

3. 출력 True

random.seed(3)로 난수 생성기를 같은 시드로 두 번 초기화했으므로, 그 직후 호출되는 randint(1, 100)은 항상 동일한 값을 만들어냅니다. 따라서 ab는 같은 값이 되어 a == bTrue입니다.

4. 출력 [3, 4, 5]

집합 연산에서 -(차집합)는 &보다 먼저 계산되고, &|보다 먼저 계산됩니다. 따라서 result = (a & b) | (c - a)로 해석됩니다. a & b = {3, 4}, c - ac={4,5}에서 a에 속한 4를 뺀 {5}입니다. 두 결과를 합치면 {3, 4, 5}이고 정렬하면 [3, 4, 5]입니다.

5.

def is_palindrome(s):
    s = s.lower()
    return s == s[::-1]

6.

def chunk(lst, n):
    return [lst[i:i + n] for i in range(0, len(lst), n)]

7.

def merge_sum(d1, d2):
    result = d1.copy()
    for k, v in d2.items():
        result[k] = result.get(k, 0) + v
    return result

8.

문제: basket=[]는 함수가 정의될 때 단 한 번만 만들어지는 기본값입니다. cart1 = add_item("apple")이 이 기본 리스트에 "apple"을 추가하고, cart2 = add_item("banana")는 같은 리스트(이미 ["apple"])에 "banana"를 추가합니다. 그 결과 cart1cart2는 같은 객체를 가리키며 둘 다 ['apple', 'banana']로 출력되어, 의도와 달리 장바구니가 공유됩니다.

고친 코드:

def add_item(item, basket=None):
    if basket is None:
        basket = []
    basket.append(item)
    return basket

cart1 = add_item("apple")
cart2 = add_item("banana")
print(cart1)
print(cart2)