이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.

 

함수(Function)

수학마스터 김씨가 사용하는 코드, 홀/짝 판별기를 다시 한번 보자.

for number in numbers:
    if type(number) is not int:
        continue
    if number%2 == 0:
        print('짝수!')
    else:
        print('홀수!')

김씨가 홀/짝 판별을 한다는 소식을 들은 친구들은, 왠지는 모르겠지만, 너도나도 김씨에게 홀/짝 판별 문제를 마구마구 쏟아내기 시작했다.

황씨도 문제를 내고
정씨도 문제를 내고
박씨도 문제를 내고
최씨도 문제를 내고…

수많은 사람들이 문제를 내기 시작했다.

그러다보니 코드가 이렇게 되어 버렸다.

numbers_hwang = [1,2,3,4]

for number in numbers_hwang:
    if type(number) is not int:
        continue
    if number%2 == 0:
        print('짝수!')
    else:
        print('홀수!')

numbers_choi = [v for v in range(1,100)]
for number in numbers_choi:
    if type(number) is not int:
        continue
    if number%2 == 0:
        print('짝수!')
    else:
        print('홀수!')

...

계속해서 똑같은 코드를 복사/붙여넣기 하다 보니 전체 코드가 굉장히 난잡해지기 시작했다. 만약에 정수 뿐만이 아니라 실수에 대해서도 홀/짝을 판별해야 할 날이 온다면, 위에 복사했던 코드들을 하나하나 뜯어고쳐야 한다는 소리이기도 하다. 그러다가 까먹고 놓치는 코드가 하나라도 생긴다면? 수학마스터 김씨의 (있지도 않은) 명성은 나락으로 떨어지게 될 것이다.

 

그런 김씨에게 도움이 될 수 있는 Python 기능이 있다. 바로 함수(Function)이다. 사실 함수는 김씨의 코드에도 들어있다. print()가 바로 함수이기 때문이다.

함수가 뭔지 간단하게 이야기 해 보자면, 이름을 가지고 있는 코드(들)이라고 할 수 있겠다. 한 번 김씨의 코드를 함수의 형태로 만들어서 함수에 대해 하나하나 뜯어보도록 하자.

def checkOddEven(numbers):
    for number in numbers:
        if type(number) is not int:
            continue
        if number % 2 == 0:
            print('짝수!')
        else:
            print('홀수!')

def는 함수를 정의한다는 뜻이다.

그 다음에 나오는 checkOddEven은 함수의 이름이다.
이 이름은 함수를 작성하는 사람이 지을 수 있다.
규칙은 변수의 작명 규칙과 동일하다.

되도록이면 이 함수가 어떤 동작을 하는지 알 수 있는 이름으로 지어주자. 함수를 사용하는 사람을 위해서기도 하고, 나중에 이 함수를 다시 돌아보게 될 자신을 위해서기도 하다.

괄호는 매개변수(parameter)를 의미한다.
매개변수는 함수의 코드를 실행할 때 사용할 변수들을 의미한다. 괄호 안에 아무것도 없어도 되지만, 괄호는 반드시 있어야 한다. 그리고 괄호 뒤에 :도 잊지 말자.

밑의 줄 부터는 함수의 코드들이 쭉 나온다. 여기서 들여쓰기가 되어 있다는 점에 주목하라. 조건문이나 반복문처럼 함수에 포함되는 코드라면, 공백문자 4개로 들여쓰기가 되어 있어야 한다. 그리고 함수의 코드가 끝나면, 다시 들여쓰기를 중지하면 된다.

함수를 일반화해서 표현하자면 다음과 같이 표현할 수 있다.

def function_name(parameters):
    code

 

함수의 호출

김씨의 홀/짝 판별코드는 checkOddEven이란 이름이 되었다. 그러면 이렇게 만들어둔 함수는 어떻게 사용해야 할까?

함수의 이름을 적고, 괄호를 열고, 함수에서 요구하는 매개변수를 집어 넣고, 괄호를 닫는다. 이게 끝이다.

먼저 황씨가 전달한 리스트를 이용해서 김씨의 코드를 호출해보자.

def checkOddEven(numbers):
    for number in numbers:
        if type(number) is not int:
            continue
        if number % 2 == 0:
            print('짝수!')
        else:
            print('홀수!')


numbers_hwang = [1,2,3,4]
checkOddEven(numbers_hwang)

그러면 황씨가 전달한 숫자에 대해 홀/짝 판별하는 동작을 확인할 수 있을 것이다. (홀수! 짝수! 홀수! 짝수! 가 출력될 것이다)

나머지 사람들이 만든 리스트도 전달한다면 이렇게 표현할 수 있을 것이다.

def checkOddEven(numbers):
    for number in numbers:
        if type(number) is not int:
            continue
        if number % 2 == 0:
            print('짝수!')
        else:
            print('홀수!')


numbers_hwang = [1,2,3,4]
checkOddEven(numbers_hwang)
numbers_choi = [v for v in range(1,100)]
checkOddEven(numbers_choi)
numbers_jung = [v for v in range(2,33) if v%2 == 1]
checkOddEven(numbers_jung)

 

한 가지만 주의하면 된다. 괄호 안에는 더도 말고 덜도 말고 함수가 필요로 하는 만큼만 전달하라. 김씨의 코드에 리스트를 전달할 때, 아무것도 주지 않아도 안되고, 2개 이상을 전달해도 안된다.

 

위의 코드도 약간 난잡하다 싶으면, 사람들이 전달한 리스트를 또 하나의 리스트로 모아서, 반복문으로 묶어주는 것도 좋다.
함수 코드 이미 많이 봤으므로 생략한다.

numbers_given = [[1,2,3,4], [v for v in range(1,100)], [v for v in range(2,33) if v%2 == 1]]

for numbers in numbers_given:
    checkOddEven(numbers)

 

Categories:

Updated:

Comments