파이썬 기초문법6

김민정·2022년 5월 8일
0

위코드 과제

목록 보기
10/11
  1. 제너레이터란 무엇입니까?
    iterator를 생성해주는 함수로 함수안에 yield 키워드를 사용합니다. iterable한 순서를 지정할 수 있어서 모든 제너레이터는 이터레이터라고 할 수 있습니다.
  2. 제너레이터를 왜 사용합니까?
    제너레이터는 yield를 이용해 한번 호출될때마다 하나의 값만 전달합니다. 자신이 리턴할 모든 값을 메모리에 저장하지 않기 때문에 일반함수처럼 한번에 리스트로는 보이지 않고 호출될때 하나의 값씩 불러옵니다. 메모리를 사용하는 공간이 이터레이터와 마찬가지로 매우 적은 편에 속하기 때문에 메모리 관리 차원에서 사용한다고 합니다
  3. lazy evaluation이란 무엇입니까?
    느긋한 계산법이란 계산의 결과값이 필요할때까지 계산을 늦추는 기법을 의미합니다. 지연계산법과 최소 계산법이 있습니다. 파이썬에서는 값이 실제로 사용되지 않으면 연산 또한 하지 않아 시간과 메모리를 절약할 수 있다고 하는 generator를 사용해서 구현할 수 있습니다.

lazy evaluation 관련한 포스팅을 보다가 해석이 안되는 복잡한? 코드를 발견했습니다. 함께 해석해봅시다.

Class LazyDict(dict):
    def get(self, key, thunk=None):
return (self[key] if key in self else thunk() if callable(thunk) else
thunk)
    def setdefault(self, key, thunk=None):
return (self[key] if key in self else
dict.setdefault(self, key,thunk() if callable(thunk) else
thunk))

알고 있는 지식
1. 여기서 return 뒤에 있는 ()식 전체는 리스트 컴프리헨션이 아니라 제너레이터이다.
2. callable() 전달받은 인자가 호출 가능한지 여부를 판단한다 .

궁금증
1. self[key]는 뭔가? key가 self 안에 있다면 self[key]를 가져오고 아니면 thunk()를 호출하는데 thunk를 호출할때 만약에 thunk가 호출 가능한 인자면? 그렇지 않다면?
-해결한 결론은 self[key]는 self.keys를 dictionary 버전으로 가져오는 것이다. 아니면 thunk 를 쓰는데 이걸 2중 for문 형태로 thunk가 불러 올 수 있는 거면 불러오고 아니면 thunk라고 나온다고 한다.

0개의 댓글