MIT - Introduction to Computer Science and Programming in Python
나중에 코드를 십만줄, 백만줄의 형태로 짜야하는가?
아니다.
다음 두 가지가 중요하다!
분해와 추상적 개념
분해
- 코드에 구조를 두는 방법
- 코드를 모듈로 나누는 방법
- 다시 모듈은 프로세스의 성분을 분리한다
추상화
- 자세한 내용을 숨기도록 한다
- 무엇의 특정한 내용을 숨기기도 하면서
- 작은 블랙박스 처럼 행동한다.
함수
함수의 핵심은 위의 2개를 다 제공한다.
- 코드를 모듈들로 나누는 것
- 자세한 것은 숨기는 것
- computation의 일반적인 패턴을 캡쳐하여 일반화 만드는 것.
e.g.1)
>>> def sqrt(x):
... ans = 0
... if x>=0:
... while ans*ans < x : ans = ans+1
... if ans*ans != x:
... print(x, 'is not a prefect square!')
... return None
... else: return ans
... else:
... print(x, 'is a negative number')
... return None
인자의 값을 넘겨줌으로써 함수를 적용한다.
sqrt(16)
4
- def(definition)
def 바로 옆에 함수의 이름 을 적는다.
이름 바로 옆에 괄호 를 적는다.
이 함수의 형식적인 인자 들을 적용한다.
이 때, 인자가 있을 수도 있고 없을 수도 있다.
- return
어떤 값을 가졌을 떄 computation을 멈추고 return이라는 문자 그대로 이 함수로부터 제어를 돌려준다. 그리고 다음 명령문의 값을 가지고와서 전체 컴퓨테이션의 값을 반환해주는 것이 리턴의 역할이다.
- None
None은 특별한 값으로, 사실 값 이지만 실제 리턴되는 값이 없다.
교수님의 메세지
- 함수에 각 branch에 return을 사용해서 어떠한 값을 반환하는 코드를 짜는 것을 추천한다.
로컬 바인딩
** 로컬 바인딩은 어떤 다른 로컬 바인딩에 영향을 주지않는다.** 예를 들어, 함수에서 적은 x와 함수 밖의 x는 서로 영향을 주지 않는다. e.g.1)
>>> def f(x):
... x = x+1
... return x
...
>>> x =3
>>> x
3
>>> z = f(3)
>>> z
4
>>> x
3
e.g.2)
>>> test = sqrt(16)
>>> test
4
>>> test = sqrt(34)
34 is not a prefect square!
>>> test
>>> test == None
True
순환(Recursion)
순환은 어떤 문제를 가지고 같은 프로그램의 더 간단한 버전으로 바꿔서 내가 실행할 수 있는 단계로 나누기!
문제를 기본 경우 와 귀납적인 단계 또는 순환적인 단계 로 나누어 접근할 수 있다.
- 기본 경우 : 기본적으로 문제를 푸는 가능한 간단한 문제
- 귀납적인 단계 or 순환적인 단계 : 문제같은 프로그램을 더 간단한 버전과 다른 단계들로 나누기
이 문제가 기본 경우인지, 그렇지 않다면 아니라면 더 작은 컴퓨테이션으로 줄이고 그 작은 걸 또 작은 컴퓨터이션으로 만들어서 결과적으로 기본경우로 수렴하도록 판단해야한다.
** 기본 경우로 수렴한다는 것은, 코드의 수렴이다. **
e.g.1)
>>> def isPalindrome(s):
... if len(s) <=1:
... return True
... else:
... return s[0] == s[-1] and isPalindrome(s[1:-1])
>>> isPalindrome('abcdedcba')
True
e.g.2) 피보나치함수
>>> def fib(x):
... if x==0 or x ==1:
... return True
... else:
... return fib(x-1) + fib(x-2)
...
>>> fib(12)
233
>>> fib(24)
75025
교수님의 메세지
- 반복해서 다루어지는 문제와 순환적으로 다루어지는 문제들이 있다.
순환적인 관점에서 문제를 해결을 하는 게 쉽고, 반복적으로 생각하면 어려울 때가 있다.
어떤 것을 사용하는 것이 좋은 지 결정하는 습관을 가져라