본문 바로가기

Data analysis story

[Python] 함수 만들기

안녕하세요, 여러분! 파이썬의 저번 포스팅까지 해서 제어문을 다 배워보았습니다!

if, for, while문 모두 복습 잘 하셨나요??

 

이번 시간에는 함수에 대해 이야기해보는 시간을 가질꺼에요!

그런데 우리 파이썬 그 두번째 포스팅에서 함수에 대해 배우지 않았었나요?

그러면 같은 내용을 또 배우는 건가요??

아닙니다! ㅎㅎ

 

두 번째 포스팅에서 제가 이런 말을 했었는데요!

파이썬에서는 내장되어 있는 함수를 쓰기도 하고 또 함수를 불러오기도 하고 심지어는 내가 함수를 만들 수까지 있습니다!

오늘은 파이썬에 내장되어 있는 기초 함수들 몇 개를 알아보는 시간을 가질게요!”

이렇게 말이죠!

 

그래서 두번째 시간에 내장 함수 몇 가지에 대해서 알아보았죠!!

대표적으로 input() 함수 기억나시나요?

 

어쨌든 오늘 이번 시간에는 드디어 내가 함수를 만드는 법!에 대해서 다루어 볼 것입니다!

(함수의 기본적인 정의를 공부하고 싶다면 파이썬 두번째 포스팅을 참고해주세요!)

 

프로그래밍을 하다 보면 반복되는 내용이 많을 때가 있어요! 이때 바로 함수가 필요한 것입니다.

반복적으로 사용되는 가치 있는 부분을 묶어서 입력 값을 주었을 때

결과값을 돌려준다는 형태로 작성하는 것이 함수입니다.

 

우리가 앞서 배운 내장함수들도 다 방금 말한 형태로 되어 있는데요!

 

예를 들어 abs() 함수 (두 번째 포스팅에서 다뤘었죠?)

절댓값을 씌워 출력해주는 함수 잖아요!

이 함수도 사실은 이런 형태로 되어 있을거에요!

 

이렇게 a라는 수를 받았을 때 0이 넘으면 그대로 출력하고 그렇지 않다면 -를 붙여서 출력하라!

라는 명령어들로 구성이 되어 있는 것이죠!

그러면 우리도 이런 명령어들을 구성해서 abs()와 같은 함수를 만들 수 있는거잖아요!

 

물론 위의 내장함수들은 이미 만들어져 있으므로 따로 만들 필요가 전혀 없겠지만,

우리가 프로그램을 짜다가 심하게 계속 반복되는 부분이 있다면

우리 만의 함수를 만들 수 있다는 것이죠!

 

내가 만든 프로그램을 함수화 해 놓으면 프로그램의 흐름을 일목요연하게 볼 수 있어요!

그래서 함수를 잘 사용하고 적절하게 만들 줄 아는 사람이 능력 있는 프로그래머이다.’ 라는 말이 나올 정도입니다!

 

예를 들어 우리가 저번 시간에 배운 for문을 이용해서 여러 코드를 짜고 있는 상황이라고 가정해봅시다!

처음에 제가 이런 코드를 짰다고 가정해볼게요!

(우리 이제 모두 이 코드의 결과 값을 알 수 있죠??)

그런데 코드를 짜다가 또 이런 코드를 짜야 하는 상황이 발생했다고 쳐봅시다!

어떤가요?

 

방금 위에서 짠 코드와 상당한 부분이 반복되죠?

비슷한 코드인데 하나로 합칠 수 없을까요?

 

이럴 때 바로 함수가 필요하다는 것입니다!

 

함수 만드는 방법

그렇다면!! 함수는 어떻게 만들까요?

함수를 만드는 방법에 대해서 배운 다음,

위의 문제 상황을 함수를 만듦으로써 해결해보도록 합시다!

def는 함수를 만들 때 사용하는 예약어입니다.

함수이름은 함수를 만드는 사람이 임의로 만들 수 있고요!

 

함수의 역할과 관련 있는 이름을 만들면 좋겠죠?

특히, 함수의 목적을 설명하는 동사 또는 동사+명사를 사용하는 것을 추천드립니다.

예를 들어 정수를 제곱하는 함수는 square()으로, 평균을 구하는 함수는 compute_average(),

단어의 글자 수를 계산하는 함수는 count_word() 이렇게요!!

 

함수이름 뒤의 매개변수1과 매개변수2는 이 함수에 입력될 값을 문자로 일반화해준 것입니다.

 

이렇게 함수를 정의한 다음에 함수의 몸체에 해당하는 부분에

if, while, for문 등과 마찬가지로 함수에서 수행할 문장들을 입력하면 됩니다.

 

아주 간단한 예를 볼게요!

함수를 정의해주기 위해 def라는 예약어를 사용하였구요!

sum이라는 함수이름을 지어주었습니다.

 

그리고 이 함수에 들어갈 입력 값들을 문자로 일반화하여 a b로 정의해주었구요

여기서 return은 함수의 결과값을 돌려주는 명령어입니다.

, 위의 예에서는 결과 값은 2개의 입력 값을 더한 값이라는 것이죠!

 

그러면 이제 앞에서 만든 sum함수를 사용해보도록 할게요.

변수 a5, b6을 대입한 후 앞서 만든 sum함수에 a b를 입력 값으로 넣어줍니다.

그리고 변수 csum함수의 결과값을 대입하면 print(c)c의 값을 확인할 수 있겠죠?

 

그럼 처음에 소개했던 예의 문제를 해결해볼까요?

이렇게 함수를 정의했습니다!

for문 끝에 end에다가 1을 더한 이유는

get_sum함수에 넣은 숫자를 다 더하고 싶었기 때문이에요!

(range는 뒤의 숫자를 빼니까요!!)

 

결과를 보면

이렇게 처음 입력한 수부터 두번째 입력한 수까지 다 더해주는 함수가 탄생했습니다!

 

처음에는 어렵겠지만 천천히 보다 보면 이해가 가실꺼에요!!

 

함수의 여러 가지 형태

이렇게 함수를 만들 때도 여러 형태가 존재하는데요

입력값과 결과값에 따라서 여러 함수의 형태를 만들 수가 있어요!

1. 일반적인 함수는 입력 값이 있고 결과값이 있는 함수입니다.

위에서 예를 든 sum함수와 get_sum함수가 그 예가 될 수 있겠네요!

 

def 함수이름(입력 인수):

수행할 문장

return 결과값

 

이렇게 함수를 생성한다면 입력 값과 결과 값이 모두 있는 함수를 생성하는 것입니다!

 

앞서 만든 sum함수가 그 예이므로 다시 한 번 가져와볼게요!

그런데 이렇게 함수를 만들었으면 이 함수를 써야겠죠?

함수를 사용하려면 함수를 호출(call)해야 합니다.

함수의 유형에 따라 함수를 호출하는 방법도 다 다른데요.

일단 일반적인 이 함수를 호출하는 방법을 알아보죠!

 

이 함수를 사용하는 방법은 입력 값으로 56을 주고 결과 값을 돌려받는 것입니다.

결과 값을 받은 변수 = 함수명(입력 인수 1, 입력 인수2, , ,) 이렇게 사용하면 됩니다.

(+ 입력 인수는 호출 프로그램에 의하여 함수에 실제로 전달되는 값입니다. 비교해서 매개 변수는 이 값을 전달받는 변수이구요.)

다른 d라는 변수를 사용해서 또 함수를 호출하는 것도 당연히 가능하겠죠!!

 

혹은 변수로 호출할 수도 있지만

그냥 print(sum(5,6))

이렇게도 호출이 가능합니다!

 

2. 그러면 이제 입력 값이 없는 함수를 볼까요?

입력 값이 없는 함수가 있긴 할까요? ! 있습니다! 아주 드문 경우 지만요! 예시를 보시죠!

바로 이렇게 정의한 함수인데요!

 

매개 변수가 존재하지 않네요!

하지만 결과값은 존재하네요!

 

따라서 이 함수를 사용할 때는

이렇게 사용하면 되는 것이죠!
입력 값이 없더라도 괄호를 빼면 안됩니다!

함수를 호출할 때는 항상 괄호를 써주셔야 해요!

aHello라는 문자열이 할당되는 것입니다.

 

결과값을 받은 변수=함수명() 이것이 이런 입력 값이 없는 함수를 사용하는 방법입니다.

 

3. 입력 값이 없는 함수가 존재한다면 혹시 결과 값이 없는 함수도 존재할까요?

, 그렇습니다! 예시를 같이 보죠!

 

결과 값에 해당하는 return이라는 예약어가 없죠?

print가 결과 값이 아닌가요?라고 생각하시는 분들이 있겠지만

print는 결과 값이 아니라 함수의 몸체에 들어있는 수행할 문장일 뿐입니다.

따라서 함수를 호출하여 사용할 때는

함수명(입력 인수1, 입력 인수2, , ,) 이렇게 해서 함수를 사용합니다.

이렇게요!
결과 값이 진짜 없는 것인지 확인해볼게요!

여기서 '23의 합은 5입니다.' 라는 문장이 결과 값 아니냐구요?

아닙니다! 앞서 말했듯이 저 문장은 함수를 수행하는 문장일 뿐이에요!

 

이를 증명해주기 위해 a에 이 함수를 할당한 후

a를 출력해보면 아무런 값도 나오지가 않네요!

좀 헷갈릴 수 있는 부분이니 천천히 생각해보세요!!

4. 그러면 이제 마지막 함수 유형!! 입력 값도 결과 값도 없는 함수가 있을까요??

입력 인수를 받는 곳도 없고 return문도 없으니 결과값도 없네요!
이 함수는 그러면 어떻게 사용하나요?

그냥 이렇게 사용합니다!

함수명() 이렇게요!

이렇게 여러 형태의 함수를 만들어봤는데요!

 

함수 사용의 장점을 한 번 정리해보죠!

첫째! 프로그램 안에서 중복된 코드를 제거합니다!

둘째! 복잡한 프로그래밍의 작업을 더 간단한 작업들로 분해할 수 있습니다!

셋째! 함수는 한 번 만들어지면 다른 프로그램에서도 재사용될 수 있습니다.

넷째! 함수를 사용하면 가독성이 증대되고 유지 관리도 쉬워집니다.

 

이렇게 함수를 만드는 방법과, 함수의 유형, 함수를 사용하는 것의 장점!

들에 대해서 이론 공부를 해보았는데요!

 

실습

이제 실습을 해봅시다!

이제 여러분이 파이썬을 켜서 직접 해볼 시간이에요!

 

먼저, 정수를 입력 받아서 제곱한 값을 변환하는 함수를 만들어봅시다!

 

입력 값이 필요한지, 출력 값이 필요 한지, 함수의 기능을 어떠한지, 함수이름을 무엇으로 할지 먼저 잘 생각해보시고 코드를 짜기를 바랍니다!

저도 한 번 짜볼 테니 여러분도 직접 보지 않고 짜보신다음에 비교해봐요!!

그러면 이제 이 함수를 호출하여 사용해보겠습니다!

이렇게요!! 저는 따로 변수를 설정하지 않고

print함수를 이용하여 square 함수를 호출해봤습니다.

 

두번째로는 두 개의 정수가 주어지면 더 큰 수를 찾아서 이것을 반환하는 함수를 만들어 봅시다!

두 개의 정수가 주어지면 더 큰 수를 찾는 프로그램은

제가 if 조건문을 포스팅하면서 다뤘었는데요!

혹시 감이 안 잡힌다면 이 포스팅을 참고해주세요!

 

어쨌든 이번에도 입력 값이 필요한지, 출력 값이 필요 한지, 함수의 기능을 어떠한지, 함수이름을 무엇으로 할지 먼저 잘 생각해보시고 코드를 짜기를 바랍니다!

저는 이렇게 get_max함수를 만들어보았구요!

입력 값과 출력 값 모두 존재하므로

함수를 호출할 때

저는 이렇게 했습니다!!

여러분도 한 번 해보세요!!

 

정수의 거듭제곱 값을 계산하여 반환하는 함수를 작성하여 보자. (비록 파이썬에는 **라는 거듭 제곱을 계산하는

연산자가 존재하지만 실습 삼아 만들어봅시다!)

y번만큼 x x를 곱하는 것입니다.

함수를 사용해보면

그러면 이제 생일 축하 메시지를 출력하는 함수 happyBirthday()를 만들어봅시다!

 

"생일축하합니다!

생일축하합니다!

사랑하는 친구의 생일축하합니다!"

 

이런 문장을 출력하는 함수를 만들어보는 것입니다!

생각을 좀만 해보면 이 함수는 입력값과 출력 값이 필요 없을 수도 있겠다!라는 결론이 나올텐데요!

제가 만든 happyBirthday라는 함수에

입력값과 출력 값이 있나요?? 없죠!

이렇게 입력 값과 출력 값이 없는 함수를 호출할 때는

함수이름=() 이렇게만 쓰면 된다고 했었죠??

한번 호출해볼게요!

 

소수 찾기 함수

소수는 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수입니다.

이런 소수를 찾는 함수를 만들어봅시다!

이 코드를 실행시키면

이렇게 정수를 입력하게 시키고

정수를 입력하면

소수인지 소수가 아닌지 판단해줍니다!

조금 어렵죠?? 천천히 생각해보세요!!

 

이렇게 해서 함수를 만드는 법, 함수의 4가지 종류까지

함수에 대해 파헤쳐보았습니다!

여러 실습문제는 꼭 이론을 마스터 한 후에 답을 보지 않고 여러분이 직접 해보세요!!