본문 바로가기

Data analysis story

[Python] 함수만들기-2 (*args, return의 쓰임새, 디폴트 인수, 키워드 인수, 지역변수, 전역변수)

안녕하세요 여러분!

저번 시간에는 내가 직접 함수를 만드는 방법과 함수의 4가지 형태(입력 값과 결과 값의 유무에 따라)에 대해서 살펴보았습니다!

 

오늘은 함수 그 두 번째 시간으로 함수에 관해 못다한 이야기들을 해보려고 합니다!

저번 파이썬 포스팅([Python]함수 만들기)을 완벽히 숙지한 후 이 포스팅을 봐주세요!

 

여러 개의 입력 값을 받는 함수 만들기

 

저번 시간 포스팅을 통해 여러분들도 여러분들만의 함수를 많이 만들어보셨을 거라 생각하는데요

많은 사용자 지정 함수 중에서도 여러 개의 입력 값들을 받아 모두 함수'!

어떻게 만들 수 있을지 상상이 되시나요?

 

,, 예를 들어서!

양수의 모든 값을 입력했을 때 그것을 모두 더해주는 그런 함수를 만들 수는 있을 것 같아요!

음수를 센티널로 두고

이렇게 만들어 출력해보면!!

내가 원하는 양수 숫자들을 입력하고 그러다가 음수를 입력해버리면

그 위의 모든 양수들을 더해서 알려주는 함수 말이죠!

 

그런데! 이렇게 몇 개가 입력될지 모르는 상황에서 함수를 만들 때 좋은 방법이 없을까요?

파이썬은 이런 문제를 해결하기 위해서 한 가지 방법을 제공합니다!

 

def 함수명(*입력 변수):

수행할 문장

 

바로 이렇게 말이죠!

이게 어떻게 쓰이는지 예제를 통해 확인하러 갑시다!

 

여러 개의 입력 값을 모두 더하는 함수를 직접 만들어봅시다!

예를 들어 함수 이름을 sum_many라고 짓고 들어오는 입력 값이 몇 개일지 몰라도 다 더해주는 함수를 만드는 것이죠!

 

sum_many(1,2)이면 3을 리턴하고

sum_many(3,5,6)이면 14를 리턴하는 함수를 어떻게 쉽게 만들 수가 있을까요?

이렇게 args라고 정한 입력 변수 앞에 *를 붙여주면

입력 값이 몇 개이든지 상관없이 입력한 모든 값들을 더해주는데요!


이런 *기호를 붙이면 입력 값들을 모두 모아서 튜플로 만들어 주기 때문이라고 하네요!

(튜플은 다음 시간에 배우도록 하겠습니다!^^)

 

그러면 -3,-1,1,3을 더해주기 위해서 sum_many함수를 실행해보겠습니다!

올바른 결과가 나오네요!

 

덧붙여,

이렇게 *입력변수를 사용할 때 함수의 인수로 꼭 *입력변수만 넣어야 하는 것은 아닙니다!

*를 사용하지 않는 일반적인 인수와 같이 사용할 수도 있거든요!

 

예를 들어서 sum이라는 단어를 입력한 경우에는 입력하는 모든 값들을 더해주고

mul이라는 단어를 입력한 경우에는 입력하는 값을 모두 곱해주는 함수를 만든다고 가정해봅시다!

이때는 이렇게 일반적인 인수 choice와 여러 입력 인수를 받게 해주는 *를 사용한 인수가 함께 쓰였는데요!
choice
라는 일반적인 인수를 통해서 더할 것인지 곱할 것인지를 결정하고

(choice인수에 ‘sum’ 또는 ‘mul’이라는 문자열을 입력 값으로 줍니다!)

 

*args에 입력한 인수들을 모두 더하거나, 곱해주는 것이죠!

함수를 사용해보겠습니다!

이렇게 *입력인수를 응용해볼 수도 있겠군요!!

 

함수의 결과값과 return

우리는 저번 시간에 4가지의 함수 종류를 살펴보았습니다. 기억나시나요??

입력 인수와 결과 값이 있거나, 없거나의 경우의 수가 4개가 나왔었죠! (저번 포스팅 참조)

 

결과 값이 있는 경우!

return이라는 예약어가 있는 경우에는

항상 return을 쓰고 어떤 한 가지 변수만을 써주었는데요!
바로 앞의 예에서도

이렇게 return 옆에는 하나의 변수 밖에 없네요!

 

그렇다면 두 개의 return 값을 가진 함수는 만들지 못하는 것인가요?

예를 들어

이런 함수를 실행시켰을 때 결과 값이 어떻게 나올까요?

파이썬 말고 R같은 프로그래밍 언어에서는

이렇게 여러 개의 값을 return해 달라고 요구하면 에러가 나는데요!

 

파이썬은

이렇게 돌려줍니다!

 

함수의 결과 값은 언제나 하나여야 하기 때문에

이렇게 튜플 값 하나인 (a+b,a*b)로 돌려줍니다!

 

만약 변수를 지정해서 받고 싶다면

이렇게 result라는 변수에 할당하면 되고 (10,21)이라는 하나의 튜플 값이기 때문에

에러가 나지 않고 result 변수에 잘 들어갑니다.

 

이 값을 나누어서 받고 싶다면

이렇게 변수를 따로 설정해주면 되겠죠??

 

그리고 또 return의 다른 쓰임에 대해서 말해보려고 해요!

 

return은 값을 반환해주기도 하지만!

어떤 상황에서 그 함수를 빠져나가고 싶을 때!

return을 쓰면 빠져나갈 수 있습니다!

 

예를 들어서요!!

만약 hello라는 인수에

‘bye’라는 문자열이 들어오면 그냥 이 함수를 나가고 싶다는 뜻입니다!

 

그래서

이런 결과가 나오는 것이죠!

이런 또 다른 return의 쓰임새에 대해서도 꼭 알아두세요!!

 

여러 가지 인수

이제 인수의 종류에 대해 좀 알아보겠습니다!

앞서 인수는 호출 프로그램에 의하여 함수에 실제로 전달되는 값이라고 했었는데요!

디폴트 인수라는 것이 존재합니다!

 

디폴트 인수란 무엇일까요?

파이썬에서는 함수의 매개변수가 기본값을 가질 수 있는데요!

즉, 입력 인수에 초기값을 미리 설정할 수 있다는 것입니다!

 

이것을 디폴트 인수(default argument)라고 합니다.

예를 들어볼게요!

greet함수에는 인수가 name msg가 있는데요

msg에는별일없죠?”라는 문자열을 이미 처음부터 할당해주었네요!

이런 것이 바로 디폴트 인수입니다.

 

이 함수는 지금 출력 값이 없으므로

greet(“영희”) name의 입력 값을 입력한 후

함수를 호출해서 결과를 볼게요!

이렇게 디폴트 인수가 잘 나오게 됩니다!

 

함수의 입력 인수에 들어가는 값이 항상 변하지 않을 경우에는

이렇게 함수의 초기값을 미리 설정해두면 유용하답니다!

 

혹은 이런 예를 볼까요?

이름, 나이, 성별을 알려주는 자기소개 함수를 만들려고 하는데

성별 인수는 그리고 남자입니다.’라는 문자열이 출력되는 것을 초기값으로 두는 것입니다.

따라서

이러한 다양한 결과들이 나올 수가 있겠네요!

 

따로 True, False를 설정해주지 않으면 초기값이 출력됩니다!

 

주의해야 할 점은 초기화시키고 싶은 입력 변수들을

항상 인수들 중 맨 뒤에 위치시켜야 한다는 것입니다!

 

그리고 키워드 인수라는 것이 있습니다.

인수들이 위치가 아니고 키워드에 의하여 함수로 전달되는 방식인데요!

이것 또한 예를 통해 확인해봅시다!

이 함수는 곱셈 연산과 뺄셈 연산이 함께 있기 때문에

입력 인수의 위치가 달라지면

결과가 달라질 수 있습니다!

 

이럴 때 x=, y= 이렇게 키워드 인수를 사용하면

위치를 다르게 해도 x에 할당되는 값과 y,z에 할당되는 값이 명확하겠죠!

 

이 키워드 인수는 아주 특수한 경우이고 실제 프로그램에서는 많이 쓰이지 않지만

한 번 넣어봤습니다!

 

주의해야 할 점은 하나라도 키워드 인수를 사용해서 지정했다면

모든 인자에 키워드를 지정해주어야 한다는 것입니다!

 

지역 변수와 전역 변수

이번에는 함수 안에서 선언된 변수의 효력 범위에 대해 알아보겠습니다!

이 파트는 처음 보는 사람들에겐 굉장히 헷갈릴 수 있는데요!

차근차근 진행해보도록 하겠습니다!

 

우리는 함수를 만들 때 굉장히 많은 변수들을 함수 안에서 지정하곤 했는데요!

 

특정 함수 안에 지정된 함수는 지역 변수

특정 함수 안에서 지정된 함수가 아닌

프로그램 내에 있는 변수는 전역 변수입니다!

 

예를 들어서 설명해볼게요!

 

sub()라는 함수를 만들었고

sub()라는 함수 안에 s라는 지역변수를 설정한 후

바나나가 좋음이라는 문자열을 할당했습니다.

 

sub()라는 이 함수는 s를 출력하는 함수이군요!

 

따라서 sub()를 호출했을 때

이런 값이 출력됩니다! 아직까지는 우리가 많이 연습한 거라 별로 헷갈리지 않으시죠?

 

그럼 곧바로 전역 변수가 무엇인지 예를 통해 확인해보죠!

이번에도 sub함수가 s를 출력하는 기능을 수행하지만

지정한 sub함수 안에 지역 변수가 보이지를 않는군요!

대신에 sub()함수 밖에 s라는 전역 변수가 있고

그 전역 변수에는 사과가 좋음!’이라는 문자열이 할당되어 있습니다.

 

이 때 sub()함수를 부르면

전역 변수 사과가 좋음!’ s로 들어가 그 s를 출력하는 sub()함수가 됩니다!

 

그러면 전역 변수와 지역 변수 모두 있을 때는 어떻게 될까요?

sub() 함수는 역시 s를 출력하는 기능을 하고요

sub() 함수 안에는 바나나가 좋음이라는 문자열이 할당되어 있는 s라는 지역 변수와

sub() 함수 밖에는 사과가 좋음!’이라는 문자열이 할당되어 있는 s라는 전역 변수가 있습니다.

저는 sub()함수를 호출하였고요

덧붙여 s변수에는 어떤 문자열이 할당되어 있는지 print함수를 사용해서 알아보겠습니다.

이런 결과가 출력되네요!

 

sub()를 호출하였을 때는 함수 안에 지역 변수가 있기 때문에

그 지역변수를 출력하는 함수의 기능을 다 한 것이고요

 

s라는 변수를 출력하니 sub()라는 함수와는 관계없이

전역 변수인 s가 출력된 것입니다.

 

즉, 특정 함수 안의 변수는 그 함수 안에서만 효력이 있습니다!!!

그런데 지역 변수를 전역 변수로 만들고 싶을 때는 어떻게 해야할까요?

 

바로 global이라는 명령어를 사용하면 됩니다!

이렇게 말이죠!

함수 밑에 바로 global이라는 예약어를 쓴 후 전역 변수로 만들어줄 변수를 써줍니다.

 

위의 코드에서는 sub()함수에서 s를 전역 변수로 만들기로 했기 때문에

print(s)를 출력해도

지역 변수에서 전역 변수가 되어버린 바나나가 좋음이 출력되겠지요!

결과는 이렇게 나오겠네요!

하지만 프로그래밍을 할 때 global 명령어를 사용하는 것을 추천하지는 않아요!
왜냐하면 함수는 독립적으로 존재하는 것이 좋기 때문이죠!!

 

처음 보면 굉장히 헷갈리니 따라 치면서 꼭 연습해보세요!!

 

오늘은 이렇게 해서 크게 4가지 주제를 배워보았는데요!

다음 시간에는 자료형에 대해서 배워볼 테니 함수에 대해 꼭 철저히 복습하도록 합시다^^