33.5 클로저 연습문제 질문입니다
, 으헤 헹헹님이 작성def counter():
i = 0
def count():
nonlocal i
i += 1
return i
return count
c = counter()
for i in range(10):
print(c(), end=' ')
여기서 마지막
print(c()) 이부분이 궁금한데 for로 수를 123 이렇게 받을때 c()이렇게 하면 일아서 이쪽으로 들어가는건가요? 저는 c(i)인줄알았는데 c()더라구요 왜그런건가요? ㅠ
그리고 반복은 for i in range(10) 이부분이 이해가 잘안가는데 일단 이부분이 없다면 c()가 1만 나오는건 알겠습니다. 근데 반복문으로 i를 반복한다하면 counter 에 이미 0이라고 지역변수가 선언됐는데 반복문으로 나온 i의값 123456789의 숫자는 어느함수로 가서 입력이 되는건가요?
Re: 33.5 클로저 연습문제 질문입니다
, 도장_ 관리자님이 작성이전 질문과 답변을 참조하면 이해에 도움이 될 겁니다.
https://dojang.io/mod/forum/discuss.php?d=1284&parent=2915
포럼 상단 오른쪽에 UNIT 번호로 검색하면 좋습니다.
Re: 33.5 클로저 연습문제 질문입니다
, 으헤 헹헹님이 작성음 c가 왜그런지는 이해가 갔는데 for문 부분은 이해가 안갑니다 ㅠㅠ
for랑 위에 함수랑 독립된 개체로 인식되는데 왜 같은부분인가요?? ㅠ
Re: 33.5 클로저 연습문제 질문입니다
, 도장_ 관리자님이 작성c = counter()
이 부분은 클로저의 기본 문법입니다.
UNIT 33.3에서 클로저 기본 문법을 다시 복습하세요.
c에 저장된 함수가 클로저입니다. UNIT 33.3 본문 설명에도 다음과 같이 쓰여 있습니다.
c에 저장된 함수가 클로저입니다.
클로저를 저장했으면 이제 함수로 호출하면 됩니다.
c()로 호출하는 것이죠.
인수가 없는 건 클로저를 이용하기 때문입니다.
클로저의 개념을 이해하지 못한 것으로 보입니다. UNIT 33 전체를 이해해야 합니다.
UNIT 33.1을 보시면 함수에서의 지역 변수를 설명합니다. 지역 변수는 함수 호출이 끝나면 변수가 사라집니다. 함수의 범위를 벗어나면 함수 범위에 있는 변수는 사라집니다. 클로저는 함수 호출이 종료되어도 함수 안의 변수가 사라지지 않습니다.
그림 33-1의 일반적인 함수와
그림 33-2의 지역 범위와
그림 33-3의 함수의 지역 변수에 접근할 수 있는 범위와
그림 33-4의 클로저의 개념을
구분해서 이해할 수 있어야 합니다.
nonlocal i로 선언했으니까 함수 범위가 아닌 바깥에 있는 범위에서 변수 i를 찾아서 사용하라가 됩니다. 함수 호출이 사라져도 변수 i가 사라지지 않고, i의 값도 유지가 됩니다. 값이 유지되는 것을 보여주기 위해 1을 더한 결과를 출력하는 것입니다.
어려운 고급 개념이고, 실무 사용빈도가 높지는 않으니 이해가 어려우면 패스하세요.
UNIT 33을 10번 반복해보기, nonlocal, 클로저 예제를 책 보지 않고, 10번, 20번 반복해서 코딩하면서 기본 구조를 암기하기. 기본 구조를 암기하면 이해는 쓰다 보면 자연히 따라 옵니다. 기본 구조 암기했으면 예제를 이것저것 바꾸면서 실험해보기. nonlocal i에서 nonlocal을 지우고, i = 10으로 바꾸면 어떻게 되는가... 등등...
개발자들이 for, while을 책도 안 보고 코딩하는 건 1만 번 이상 작성해봤기 때문입니다.
알고리즘 코딩 테스트 준비하는 분들은 5분 컷으로 퀵정렬, 삽입정렬 코드를 작성하는 연습을 하고요. 철저한 암기죠. 클로저의 기본 문법 구조를 암기하는 게 가장 빠른 방법입니다.