-
10. 파이썬 함수파이썬(Python) 강의 2019. 2. 14. 14:36
이 포스트를 통해 오늘은 파이썬 함수에 대해 이야기 해 보도록 하겠다. 함수는 파이썬 뿐만 아니라 대부분의 프로그래밍언어가 제공하는 것이므로 이전에 다른 언어를 공부했다면 오늘 포스트를 이해하기 쉬울 것이고, 지금 처음 접한다면 다음에 배울 프로그래밍 언어에서 더 쉽게 이해 할 수 있을 것이다.
들어가기전에
이 포스트는 여러분이 파이썬을 설치했고 각자 원하는 IDE를 이용해 파이썬을 개발한다고 가정한다. 대화형(Interactive) 터미널을 사용해도 상관 없다. 혹시 파이썬을 설치하지 않았다면 1.파이썬 설치 및 개발환경 설정 이 포스트에서 파이썬과 파이썬 개발환경을 먼저 셋업하길 바란다. 앞서 말했듯이 반드시 실습 해 보길 바란다.
목표
- 함수 (Function) ?
- 함수 정의
- 함수 사용
- 함수 예제
함수 (Function) ?
함수란 어떤 기능을 의미한다. 아래의 예를 보자.
위의 함수는 여러 인풋을 받아서 토끼인형을 만든다. 함수란 어떠 인자(인풋)을 받아서 인풋을 조작해서 어떤 결과(아웃풋)을 만들어 낸다. 아래를 다시 보자.
토끼의 귀나 눈 대신 이번엔 x, y, z를 인풋으로 받는 함수를 보자. 이 함수를 거치고 나면 x*y + z라는 결과 값을 받을 수 있다.
2, 3, 7이라는 인풋을 주었더니, 13이라는 아웃풋을 받을 수 있다. 이제 파이썬에서 함수를 어떻게 쓰는지 보자.
위의 노란색 박스에 함수라고 쓰여 있는 그림 대신 파이썬에서는 그냥 함수 이름을 쓴다. 여기서는 함수 이름을 function으로 예를 들었다. (함수 이름은 어떤 것이든 될 수 있다.) 함수 이름뒤에는 괄호를 친 후 들어갈 인풋을 순서대로 적어준다. 예를 듯면 두번 째 줄에 function(2, 3, 7)은 위의 노란색 함수 박스처럼 x=2, y=3, z=7을 받아 x*y + z를 계산한다고 하자. 따라서 아웃풋은 13일 것이다. 그렇다면 앞의 "y ="는 무엇인가? 이것은 바로 function(2, 3, 7)의 결과 값인 13을 y에 할당(저장)하라는 뜻이다. 따라서 y는 13을 가지고 있다.
함수 정의
그렇다면 함수를 만들려면 어떻게 해야 할까? 함수를 만들기 위해서는 다음과 같은 사항들을 생각 해 보아야 한다.
함수 키워드: 함수 키워드란 파이썬에서 함수를 정의할 때, "여기서 부터는 함수 정의부분이다"라고 알려주는 키워드를 의미한다. 함수 키워드가 없으면 어디가 함수의 정의 부분이고 함수를 사용하는 부분인지 알 수 없게된다.
함수의 이름: 함수의 이름은 당연하다. 여러분은 이 함수를 사용하기 위해 이름을 붙여야 한다.
함수의 매개변수: 매개변수란 그냥 변수이다. 변수인데, 지금 정해지는게 아니고 이 함수를 사용하는 애가 지정해 주는 것이다.
함수가 하는 일(body): 함수가 하는 일, 함수의 바디(body)가 있다. 이 부분에는 실제 수식이 들어간다. x*y+z와 같은 수식 말이다. 아래의 예를 보자.
함수의 리턴 값: 함수의 바디 끝에서 어떤 값을 리턴 할 수 있다. 예를들어서 수학에서는 함수의 결과 값이 존재한다. 파이썬의 함수에서도 이런 결과 값을 리턴 할 수 있는데, 수학과 다른 점은 이 값이 숫자가 아닐 수도 있다는 것이다. 파이썬이 제공하는 자료형이라면 무엇이든 리턴 값이 될 수 있다.
def operate(x, y, z): #함수키워드 함수이름(매개변수1, 매개변수2, 매개변수3)
result = x * y + z #함수 바디
return result #마찬가지로 함수 바디, 함수 바디의 마지막인 리턴부분이것이 바로 파이썬에서 함수를 정의하는 방법이다. def라는 키워드는 바로 앞으로는 함수가 나올 것임을 알려주는 키워드이다. 따라서 def다음에 바로 함수의 이름을 적고, 괄호 안에 매개변수를 적는다. 그리고 반복문과 조건문에서 했던 것과 마찬가지로 함수의 바디(Body)부분의 코드 블락임을 알려주기 위해 들여쓰기를 한다.
함수 사용
그렇다면 이렇게 정의된 함수를 어떻게 사용할까?
def operate(x, y, z):
result = x * y + z
return result
r1 = operate(1, 2, 3)
r2 = operate(3, 4, 5)
print(r1)
print(r2) 517
위에 정의된 함수의 이름에 매개변수를 넣어주면 바로 사용 할 수 있다. 그리고 마지막에 리턴되는 result라는 값이 r1과 r2로 각각 들어간다. 좀 더 자세히 보자.
파이썬 프로그램을 실행하면 위에서 아래로 코드가 한 줄씩 실행된다. 따라서 파이썬 인터프리터가 함수의 정의부분을 끝나고 내려오면 r1 = operatiote(..)부분을 먼저 실행 할 것이다. 파이썬 인터프리터는 operate이라는 이름을 보고 operate이라는 이름의 함수가 있었는지 찾는다. 있다 바로 위에! 그러면 안의 매개변수인 1, 2, 3을 순서에 맞게 그 함수로 전달한다. 전달된 매개변수들로 함수의 바디부분이 실행되고 마지막에 결과를 리턴한다. 그렇게 해서 왼쪽에서 함수 실행이 끝나면 5를 리턴하는 것이다. 그 다음으로 다음줄인 r2 = operate(..)줄을 실행한다. 이번에도 마찬가지고 이름을 이용해 함수를 찾는다, 그리고 매개변수인 4, 5, 6을 전달한다. 그러면 4, 5, 6을 이용해 함수의 내부가 실행된고 결과 값이 리턴된다. 이 줄이 지나고나면 r1과 r2에는 각각 값이 들어 있을 것이고 따라서 print함수를 이용해 출력 할 수 있다.
함수를 이용할 때 매개변수를 순서대로 넣어주면 파이썬이 알아서 순서대로 짝을 맞춰준다. 하지만 여러분이 직접 짝을 맞춰 줄 수도 있다.
def operate(x, y, z):
result = x * y + z
return result
r1 = operate(y=1, x=2, z=3) #매개변수의 이름으로 짝 맞추기
r2 = operate(3, 4, 5)
print(r1)
print(r2) 5 17매개변수에 값을 바로 할당 해 줬다면 이제 순서에 의존 할 필요가 없어진다. 그렇다면 매개변수를 주지 않는다면 어떨까?
def operate(x, y, z):
return x*y+z
r1 = operate() TypeError: operate() missing 3 required positional arguments: 'x', 'y', and 'z'매개변수(arguments)를 넘겨주지 않았다며 에러가 난다.
함수가 정의된 곳이 어딘지 상관 있을까? 여러분 아래와 같은 코드를 실행 해 보자.
r1 = operate(1, 2, z=3)
print(r1)
def operate(x, y, z):
result = x * y + z
return result r1 = operate(1, 2, z=3) NameError: name 'operate' is not defined실행이 되는가? 아마도 실행이 안될것이다. 왜 실행이 안될까? 위에서 말했듯이 파이썬은 프로그램 실행시 코드의 위에서 아래로 한 줄씩 실행한다. 첫번째 준일 r1 = operate(..)을 실행 할때, 파이썬은 아직 def operate의 존재를 알 지 못한다. 따라서 operate을 실행하지 못하는 것이다. 함수를 작성 할 때 이런 점을 꼭 유의하자.
함수 예제
def prefixer(prefix, word):
return prefix + "_" + word
print(prefixer("Hello", "World")) Hello_World문자열 두개를 입력 받아 이어붙인 문자열을 리턴.
def list_to_file(filename, items):
file = open(filename, "w")
for item in items:
file.write(item + "\n")
file.close()
list_to_file("sample.txt", ["korea", "china", "japan", "russia"])문자열인 파일 이름과, 리스트를 입력받아 파일 이름으로 생성된 파일에 저장한다. 리턴 값은 없다. 실행후 생성된 파일을 확인 해 보자.
korea
china
japan
russia끝
이번 포스트를 통해 함수가 무엇이고 함수를 어떻게 사용하는지 알아보았다. 다음 포스트에서는 (아마도) 파이썬 클래스를 소개 해 보겠다.
연습문제
- 위의 예제에서 보았던 list_to_file이라는 함수를 보았는가? 비슷하게 list_from_file이라는 함수를 만들어보자. 이 함수는 파일 이름을 매개변수로 받고 파일을 읽어와 한 줄씩 리스트에 추가한다. \n\r 또는 \n을 없애는 것을 잊지 말자. 그리고 마지막에 그 리스트를 리턴한다. 파이썬 파일에서 했던 로직과 같은 로직이다. 이미 만들어 놓은 로직이 있다면 그것을 그냥 함수의 형태로 바꾸기만 하면 된다.
- 파이썬 오브젝트 파일에서 했던 연습문제가 기억나는가? 이제 이 연습문제를 리팩토링(refactoring) 해 보자. 리팩토링이란 지저분한 코드를 정리하는 것을 의미한다. 각 if, elif, else에 있는 로직을 함수로 만들어보자. 어떻게 함수로 만드느냐는 자유지만 최대한 간결하고 읽기 쉽게 고쳐보도록 노력해라. 혹시 어렵다면 이 코드를 참고하길 바란다. 깃허브 함수 코드
'파이썬(Python) 강의' 카테고리의 다른 글
12. 파이썬 패키지와 모듈 (5) 2019.02.19 11. 파이썬 클래스 (8) 2019.02.17 9. 파이썬 오브젝트 파일 (4) 2019.02.13 8. 파이썬 자료형 튜플 (2) 2019.02.12 7. 파이썬 문법 조건문 (if-else) (6) 2019.02.11 댓글