MIT challenge/6.0001 - 파이썬을 통한 컴퓨터과학 입문

4강 - Decomposition, Abstraction, and Functions

이카냥 2023. 1. 13. 12:03

 

 

Lecture 4: Decomposition, Abstraction, and Functions | Introduction to Computer Science and Programming in Python | Electrical E

MIT OpenCourseWare is a web based publication of virtually all MIT course content. OCW is open and available to the world and is a permanent MIT activity

ocw.mit.edu

 

Review / Preview

 

더보기

저번 시간 내용 : https://ikablog.tistory.com/7

1. 문자열 가지고 놀기, string manipulation
       len(), indexing, sclicing, 문자열 iteration

2. 몇 가지 알고리즘들

       guess and check algorithm

      근사 (approximate solutions)

      이분법 (bisection method)

 

 ---

 

이번 시간 내용 :

 

1. 함수를 통한 Decomposition과 Abstraction.

  Decomposition : 하나의 큰 코드를 부분부분 쪼개는 것

    - 더 큰 프로그램을 꼬이지 않고 깔끔하게 짤 수 있게 도와줌

    - 다른 사람이 짠 코드를 따올 수 있음

    - 내가 짠 코드를 다른 데에서 또 써먹을 수 있음

  Abstraction : 이 코드가 정확하게 어떻게 굴러가는지 몰라도 대충 쓸 수 있음.

 

2. 변수의 Scope

 

 

- Abstraction과 Decomposition에 대한 간단한 설명

더보기

1. Abstraction

휴대폰을 만들 줄 아는 사람은 거의 없다. 하지만 휴대폰을 쓸 줄 아는 사람은 정말 많다.
코드도 마찬가지다. 우리는 print() 함수가 어떤 원리로 입력값을 받고 어떻게 처리해서 화면에 띄우는지 모르지만, 이번 시간 전까지 잘 써왔다.

 

코드가 어떻게 작동하는지 정확하게 몰라도 남이 짠 코드를 쓸 수 있다. 이게 Abstraction의 개념이다.

 

2. Decomposition (분해)

축구장 크기의 무대에 프로젝터로 영상을 띄우려고 한다.

물론 무지막지 큰 프로젝터 하나를 쓸 수도 있지만, 작은 프로젝터 여러 개를 써서 부분 부분을 비추는 편이 훨씬 싸고 효율적으로 먹힐 것이다. 게다가 나중에 다른 공연에도 프로젝터를 재활용할 수 있다.

코드도 마찬가지다. 한 번에 모든 프로그램을 짜는 건 보통 비효율적이다. 나눠서 짜면 그 코드를 다른 데에 또 쓸 수도 있고, 중복되는 구간에 대해서 일도 덜 할 수 있을 것이다.

 

코드를 부분부분 나눠서 Divide and Conquer 하는 것이 Decomposition의 개념이다.

 

 

프로그래밍에서는, 코드를 '모듈'로 쪼갠다.

모듈은 함수(function) + 관련된 데이터들의 뭉탱이로,

- 다른 데에서 재활용이 가능하고,

- 코드를 깔끔하게 만들어주고,

- 코드를 읽기 편하게 만들어준다.

 

그리고 이런 부분부분들이 어떻게 동작하는지 몰라도 끌어다가 쓸 수 있다. (Abstraction의 측면.)

 

 

1. Function

더보기

함수(Function)는 "재사용 가능한 코드 덩어리" 이다.
함수를 프로그램 내에서 호출하여 실행시킬 수 있으며.
함수는 프로그램 내에서 호출되기 전까지는 프로그램에서 실행되지 않는다.

예를 들어 자주 써왔던 print() 함수를 생각해보자.

print() 함수를 호출하면 그제서야 함수가 실행되며, 반대로 우리가 호출하기 전까지는 어디에 있는지도 모르고 지낸다.

 

함수는 5가지로 이루어져 있다.

   1. name : 이 함수를 뭐라고 부를 건지 ( ex> print() )

   2. parameter : 어떤 입력값을 받는지 (ex> print() 함수에서 괄호 안에 넣는 문자열들 )

   3. docstring : 설명서

   4. body : 함수의 내용, 이 함수가 뭘 하는지, 코드 덩어리
   5. return : 반환하는 값. 함수의 호출 선언을 대체하는 값이 된다.

 

함수를 정의할 땐 def : 를 이용한다.

 

def is_even (i) :		#def name (parameter)

	'''
    Input : i, 양의 정수
    i가 짝수라면 True를 반환, 그 외에는 False를 반환
    '''			#'''docstring''' 또는 """docstring"""
    
    print ("inside is_even")	#body
    return i%2 == 0			#body
    

x = is_even (3)	

#is_even 함수를 호출해서, 입력값으로 i=3을 넣어주고 함수를 실행.
#"inside is_even"을 출력하고 False를 반환한다.
#반환값은 함수의 호출 자체가 된다. 즉, x = False가 된다.

print (x)

 

한편, return 값이 없을 경우 모든 함수는 None 값을 반환한다.

 

def a(i) :
    k = i ** 2
    x = k%2==1
    
print (a(999))	#None이 나옴. 함수 내에서 온갖 계산은 다 했지만 return값은 없기 때문

 

 

 

2. Scope

 

더보기

함수를 만들 때, 함수 안에서 지정한 변수는 그 함수 안에서만 적용이 된다.

def call_a () :
	a = 10

call_a()

print(a) #오류가 남

call_a 함수를 통해 a=10을 실행한 것처럼 보이지만, 여기서의 a는 함수 안에서만 쓰이고 버려지는 변수 a일 뿐이다. 
즉, 함수 밖에선 a라는 변수가 지정된 적이 없고, print(a)를 했을 땐 "a가 뭐임?" 하고 오류를 내는 것이다.

call_a() 에서의 a=10의 a는 함수 안에서만 쓸 수 있는, 즉 지역변수(Local variable) a 이다.

반면 print(a) 에서의 a는 함수 밖에서 정의하는, 즉 전역변수 (Global variable) a 이다.

이렇게 한 변수가 적용되는 범위가 다르다는 것을 Scope라고 부른다.

 

 수업중에 나온 예시를 보자.

x=3이라는 전역변수를 지정했고, z=f(x)를 통해 함수를 호출했다.

함수는 지역변수 x=3을 받고, 함수를 쭉 실행한다. 이 과정에서 'in f(x) :  x = 4' 라는 문자열이 출력되고, 4가 반환된다.

 f(x)는 반환값인 4로 대체되고, 최종적으로 z=4가 되며 코드가 끝난다.

 

 

 

함수 내에서 변수를 호출했을 때, 파이썬은

1. 우선 그 변수가 지역변수중에 있는가? 를 찾아보고,

2. 없다면, 전역변수중에 있는가? 를 찾아본다.

def call_a () :
	x = a+10 
	return(x)

a=5
print(call_a())    #15

함수 실행중 x = a+10이라는 구문을 마주쳤을 때, 우선 지역변수 a가 있는지 살펴본다.
없으므로 전역변수 a를 가져오게 되고, x는 15가 된다.

 

def change_a() :
	a = 10

a=5
change_a()

print(a)  #5

언뜻 보면 전역변수 a를 10으로 바꿀 것 같은 함수이지만, 실제로는
함수 내에서 지역변수 a를 지정했고, 그 지역변수를 10으로 바꿨을 뿐 전역변수에는 아무런 영향도 미치지 않기 때문에 
기존 a값 그대로 5가 출력된다.

def change_a () :
	a += 1

a = 1
change_a	#오류남
print(a)

한편, 함수 내에서는 전역변수를 읽을 수만 있고 고칠 수는 없기 때문에 이와 같은 구문은 "a를 정의한 적이 없는데 왜 a에 1을 더하려고 하는 거임?" 하는 오류가 난다.
이런 오류가 나는 이유도 결국 scope 문제다.
(물론 global 변수를 이용하면 어떻게든 꾸역꾸역 고쳐쓸수는 있지만, 나중에 사고를 낼 가능성이 큼.)

 

 

이런 Scope 개념을 좀 더 시각적으로 잡게 해주는 좋은 사이트: www.pythontutor.com 

 

Python Tutor: Learn Python, JavaScript, C, C++, and Java programming by visualizing code

Learn Python, JavaScript, C, C++, and Java This tool helps you learn Python, JavaScript, C, C++, and Java programming by visualizing code execution. You can use it to debug your homework assignments and as a supplement to online coding tutorials. Over 15 m

pythontutor.com

 

특히 함수 안의 함수, 이런 식으로 꼬여가면 머리도 꼬이는 경우가 많기 때문에 위 사이트에서 개념을 확실히 잡고 가자 - 교수님