Quiz-1 (2024.09.05) // 범위: 파이썬기본문법

Author

최규빈

Published

September 5, 2024

항목 허용 여부 비고
강의노트 참고 허용 수업 중 제공된 강의노트나 본인이 정리한 자료를 참고 가능
구글 검색 허용 인터넷을 통한 자료 검색 및 정보 확인 가능
생성 모형 사용 허용 안함 인공지능 기반 도구(GPT 등) 사용 불가
Caution
  • 모든 문항은 부분점수 없음.
  • 일부문항은 부분문제를 모두 맞출경우만 정답으로 인정함.
  • .ipynb 파일 형태로 LMS에 제출된 답안지만 채점하며 그 외의 형식 (.hwp등)은 채점하지 않음. 즉 0점 처리함. 제출방법 모르면 물어볼것!

공지사항: (1) 부정행위 적발시 F학점 처리. 부정행위는 판단하는 기준은 교수주관임. (2) 지연제출은 별다른 감점이 없을 예정. 지속적인 지연제출은 감점 대상이 댈 수 있음. (3) 지각역시 별다른 패널티가 없을 예정이나 반복적인 지각은 지양할 것. (4) 모든 퀴즈를 응시하더라도 성적미달시 F가 나올 수 있음.

1. 10점

아래의 코드를 관찰하고 올바르게 해석한 학생을 모두 골라라.

올바르게 해석한 학생을 모두 정확하게 맞출경우만 20점으로 인정하고 그 외의는 0점 처리함

def double_result(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result * 2
    return wrapper

def add(a, b):
    return a + b

@double_result
def add2(a, b):
    return a + b

민수: 데코레이터는 함수 결과를 두 배로 만들어 반환하므로 add2(4, 4)의 결과는 8 * 2 = 16이다. 출력 결과는 16이다.

선철: add(-2, 2) 와 add2(-2, 2)의 출력결과는 같다.

예지: 데코레이터는 매개변수(=함수의 입력값)를 두 배로 해서 함수에 전달한다. 그래서 add2(4, 4)는 (4 * 2) + (4 * 2)가 되어 출력 결과는 16이다.

준현: 데코레이터는 add2 함수의 입력값을 곱해서 리턴하도록 동작한다. 따라서 add2(4, 4)의 결과는 (4 * 4) = 16 이 출력된다.

(풀이)

답: 민수, 선철

2. 10점

아래의 코드를 관찰하고 올바르게 해석한 학생을 모두 골라라.

올바르게 해석한 학생을 모두 정확하게 맞출경우만 20점으로 인정하고 그 외의는 0점 처리함

def infinite_sequence():
    num = 0
    while True:
        yield num
        num += 1

gen = infinite_sequence()

for _ in range(5):
    print(next(gen))
0
1
2
3
4
set(dir(gen)) & {'__next__'}
{'__next__'}

토르: infinite_sequence()는 무한 루프를 돌며 num 값을 하나씩 yield로 반환하고, next()로 값을 호출할 때마다 그 값을 증가시킨다. 따라서 이 코드는 (0, 1, 2, 3, 4)를 순서대로 출력한다.

캡틴: infinite_sequence()는 5개의 값을 반환한 후 더 이상 값을 생성하지 않고 종료된다. 즉, 그 이후에 next(gen)을 호출하면 더 이상 값이 반환되지 않고 StopIteration 예외가 발생한다.

위도우: gen은 호출가능한 객체 (callable object) 이다.

헐크: 이 코드에서 추가로 아래의 코드를 실행하면

for _ in range(10):
    print(next(gen))

다음 10개의 값(5, 6, 7, 8, 9, 10, 11, 12, 13, 14)이 순서대로 출력된다.

(풀이)

답: 토르, 헐크

3. 20점

아래의 코드를 관찰하고 올바르게 해석한 학생을 모두 골라라.

올바르게 해석한 학생을 모두 정확하게 맞출경우만 20점으로 인정하고 그 외의는 0점 처리함

class Dummy:
    def __init__(self, a):
        self.a = a

class Dummy2(Dummy):
    def __init__(self, a):
        super().__init__(a)
        self.a = self.a + 1

class Dummy3(Dummy):
    def __init__(self, a):
        super().__init__(a)
        self.a = self.a + 2

class Dummy4(Dummy3, Dummy2):
    def __init__(self, a):
        super(Dummy2, self).__init__(a)
        self.a = self.a + 3

민지: Dummy4 인스턴스를 생성할 때 super(Dummy2, self).__init__(a)가 호출되어, MRO에 따라 먼저 Dummy3의 __init__ 메소드가 실행된다. 그 후 Dummy4의 __init__ 에서 self.a = self.a + 3 이 실행된다.

시혁: Dummy4 인스턴스를 생성할 때 super(Dummy2, self).__init__(a)가 호출되면 Dummy2의 __init__이 실행된다. 그 후 Dummy4의 __init__ 에서 self.a = self.a + 3 이 실행된다.

희진: Dummy4는 다중 상속을 받았으므로 Dummy2, 3의 __init__이 모두 실행된다. 그 후 Dummy4의 __init__ 에서 self.a = self.a + 3 이 실행된다.

팜하니: Dummy4는 다중 상속을 사용하므로 Dummy, Dummy2, Dummy3 의 __init__ 순서대로 모두 호출한다. 그리고 마지막으로 Dummy4의 __init__ 에서 self.a = self.a + 3 이 실행된다.

(풀이)

답: 모두 틀렸음

4. 20점

!pip install datasets # 우선 이걸 실행해서 패키지 설치하세요, 못하겠으면 손들고 저를 부르세요

아래의 코드를 관찰하고 올바르게 해석한 학생을 모두 골라라.

올바르게 해석한 학생을 모두 정확하게 맞출경우만 20점으로 인정하고 그 외의는 0점 처리함

from datasets import load_dataset
imdb = load_dataset("imdb")
/home/cgb3/anaconda3/envs/hf/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm

동용: load_datasetfunction 클래스에서 생성된 인스턴스이다.

태한: imdb__len__ 메소드를 가지고 있다. 따라서 len(imdb) 는 실행가능한 코드임을 알 수 있다.

대영: imdb['train'], imdb['test'] 역시 모두 __len__ 메소드를 가지고 있다. 그리고 len(imdb['train']) + len(imdb['test']) 의 값은 len(imbd)의 값과 같다.

현수: imdb['train']__iter__ 메소드를 가지고 있다. 따라서 아래의 코드가 실행가능하다.

iterator = iter(imdb['train'])
print(next(iterator))
print(next(iterator))

(풀이)

답: 동용, 태한, 현수

채점시 동용과 대영은 틀려도 봐줬습니다. 동용은 개념이 약하면 헷갈릴 수 있다고 생각했고, 대영은 본의아니게 낚시처럼 문제가 되어서요, 실수할수 있다고 생각했습니다.

5. 40점

주어진 load_dataset() 함수의 도움말에 대한 설명을 보고, 설명이 맞으면 O, 틀리면 X를 선택하라.

모두 맞출 경우만 정답으로 인정

load_dataset?
Signature:
load_dataset(
    path: str,
    name: Optional[str] = None,
    data_dir: Optional[str] = None,
    data_files: Union[str, Sequence[str], Mapping[str, Union[str, Sequence[str]]], NoneType] = None,
    split: Union[str, datasets.splits.Split, NoneType] = None,
    cache_dir: Optional[str] = None,
    features: Optional[datasets.features.features.Features] = None,
    download_config: Optional[datasets.download.download_config.DownloadConfig] = None,
    download_mode: Union[datasets.download.download_manager.DownloadMode, str, NoneType] = None,
    verification_mode: Union[datasets.utils.info_utils.VerificationMode, str, NoneType] = None,
    ignore_verifications='deprecated',
    keep_in_memory: Optional[bool] = None,
    save_infos: bool = False,
    revision: Union[str, datasets.utils.version.Version, NoneType] = None,
    token: Union[bool, str, NoneType] = None,
    use_auth_token='deprecated',
    task='deprecated',
    streaming: bool = False,
    num_proc: Optional[int] = None,
    storage_options: Optional[Dict] = None,
    trust_remote_code: bool = None,
    **config_kwargs,
) -> Union[datasets.dataset_dict.DatasetDict, datasets.arrow_dataset.Dataset, datasets.dataset_dict.IterableDatasetDict, datasets.iterable_dataset.IterableDataset]
Docstring:
여기서 부터는 너무 기니까 생략~

1 path는 위치 인자로 전달될 수 있다.

2. name 인자는 함수 호출 시 키워드 인자로 전달될 수 있으며, 기본값은 None이다.

3. load_dataset() 함수는 가변 위치 인자를 허용하지 않는다.

4. config_kwargs는 가변 키워드 인자이며, 추가적인 키워드 인자를 받기 위한 것이다.

5. path의 타입 힌트는 str이다. 하지만 이것이path 인자의 값을 문자열 값만 전달될 수 있다는 의미는 아니다. Python에서 타입 힌트는 강제적인 제약이 아니라 개발자에게 코드의 의도를 알리기 위한 도구일 뿐이다. 따라서 Python에서는 타입 힌트를 무시하고 다른 타입의 값을 전달할 수 있다.

6. split 인자의 타입 힌트는 Union[str, datasets.splits.Split, NoneType]이므로, 문자열(str), datasets.Split 객체, 또는 None의 형태를 입력으로 권장한다.

7. download_config 인자는 가변 키워드 인자로 전달된다.

8. data_dir은 위치 인자로도 전달될 수 있다.

9. cache_dir 인자의 타입 힌트는 Optional[str]이므로, 문자열(str) 또는 None의 형태를 입력으로 권장한다.

10. **config_kwargs는 함수 호출 시 몇 개의 키워드 인자를 받을 수 있는지 미리 알 필요가 없다.

(풀이)

7만 틀렸음.

8번은 헷갈릴만 해서 틀려도 봐줬습니다. 8번이외에 한개정도 더 실수한 건 만점드렸습니다.