Python/파이선과 친해지기

[Python] - Python과 친해지기-함수

함수(Method, Function)

으악! 함수다! 수학 시간에 열심히 보았던 그 f(x) 맞다. 단 혹시 그 f(x)의 구조와 함께 이런 그림이 기억나는가?

<출처 : 위키백과 https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98>

함수가 동작하는 방식은 다음과 같다.

① 0개이상의 입력을 받는다.

② 무언가를 하고

③ 1개이상의 출력을 한다.

 

Python에도 함수(메서드)라는 개념이 있다. 위에 함수의 개념과 대응을 하면

① 0개이상의 파라미터를 받는다.

② 무언가를 하고

③ 0개이상의 값을 리턴한다.

 

파라미터라는 것은 입력, 리턴이라는 건 출력 같기도 한데??? 아닌가?? 헷갈려도 괜찮다. 다음 함수의 문법을 보자

이렇게 간단하다니! 함수의 사용은 함수이름과 소괄호() 안에 파라미터를 전달해주면 된다. 가령 우리가 줄기차게 사용해온 print("Hello World")라는 건 print라는 함수에 "Hello World"라는 문자열 파라미터를 전달한 것이다.(파라미터라고 어렵게 생각하지 말자, 단순하게 python에서 파라미터는 메서드에 전달되는 값으로, 무엇이든 파라미터가 될 수 있다.)

 

사용자 정의 함수

함수는 프로그래머가 직접 만들 수 있다. 아래의 성적처리 프로그램을 보자

def calculate(score) :
    if(score > 90) :
        return "A"
    elif(score > 80) :
        return "B"
    elif(score > 70) :
        return "C"
    else :
        return "Shit"

def [함수명](파라미터...)로 원하는 함수를 만들 수 있다. if ~ elif ~ else는 저번시간에 배웠던 제어문인데, 중간에 return "A" 같은 것은 어떤 의미일까? 파라미터로 전달한 score는 임의로 정한 이름이다. 전달되는 score에 대해서 함수 내부적으로 '이러한 일을 하세요'라는 의미이기에 실제로 사용할 때는 score라는 이름보다는 프로그램에서 사용되는 변수나 상수가 전달될 것이다. 위 calculate함수를 만든 다음(컴파일하고) 아래 예시를 따라 해 보자

>> print(calculate(75))
"C"

>> print(calculate(50))
"shit"

>> print(calaculate(score))
## 에러! 함수를 정의할때 사용한 score는 함수사용시에는 존재하는 값으로 치환되어야한다!
## score는 지금 없는 값이다!

 

독특한 것은 calculate(75)가 그대로 print() 함수의 파라미터로 넘어갔다는 점이다. 여기서 우리는 return에 의미에 대해서 알 수 있다.  return이란 함수의 결과이며, 함수가 종료되는 순간 바뀌는 값이다.(즉! 여기서 print(calculate(75))에서 calculate(75)는 score>70에서 return "C" 되기에 결과적으로 "C"가 되어 print(calculate(75))는 print("C")와 같은 코드가 된다.)

 

이러한 반환 값은 지정이 될 수도 안될 수도 있다. 아래의 예시를 보자

def non_return(val) :
    print(val)
    
def yes_return(val) :
    print(val) 
    return val

>> non_return(3)
3

>> a=yes_return(3)
3
>> print(a)
3

 

한 가지 재미있는 점은 자료형이 아닌 고정된 값들은 함수내부에서 변경이 되지 않는다는 점이다. 아래의 예시를 보자

def cal_val(val) :
    val = 5
    
def cal_ref(val) :
    val[0] = 100

>> a = 3
>> cal_val(a)
>> print(a)
3
## 비록 cal_val에서 val=5가 실행되도 a는 3으로 남아있다.

>> my_list = [0,1,2,3]
>> cal_ref(my_list)
>> print(my_list)
[100,1,2,3]
## 자료구조로 전달된 my_list의 0번째 원소는 cal_ref함수의 val[0]=100에 의해 100으로수정되었다.

??? 아니 어떻게 a는 바뀌지 않고 my_list는 바뀔 수 있는 것일까? 이에 구분은 파라미터가 전달될 때 값에 의한 전달(call by value)인지 참조에 의한 전달(call by reference)인지에 따라 구분된다. 자세한 내용은 c언어를 포스팅할 때 이야기하도록 하겠으며(구글링도 도움된다. 컴퓨터에 대한 지식을 높일 수 있는 좋은 기회이다), 지금은 단순하게 자료구조는 함수 내부에서도 변경이 가능하다는 것을 알아두면 좋을 거 같다.

 


이번 시간에는 프로그래밍의 꽃인 함수에 대해서 알아보았다. 함수란 기능을 의미하며, 사용자 정의 함수를 작성하는 방법도 알았으니, 다음 시간에는 지금까지 배운 내용을 통해서 간단한 프로그램을 만들어 보도록 하자