[Python 기초] 프로그램의 입출력 - 함수 정의(def)

업데이트:

개요

jpg


1. 파이썬의 함수 구조

함수를 사용하는 이유는 반복작업을 자동화하고, 어떤 입력값을 주었을 때 어떤 결과값을 돌려주는 함수를 만들어 프로세스를 간단명료하게 만들 수 있기 때문이다.

def 함수명(입력인수):
수행할 문장1
수행할 문장2

앞의 제어문 if문, while문, for문의 구조와 비슷하다.

def sum(a,b):
    return a + b

가장 기본적인 예시로 def에서 설정한 함수명과 입력인수는 본인이 설정하면 된다.
sum(a,b)라는 함수를 만들어 입력인수 a,b를 입력하면 두 수를 더해주는 함수이다.

sum(1,2)
[Output] 3


2. 입력값과 결과값(return)

앞의 예시에서 return이라는 함수는 결과값을 돌려주는 함수이다. 이러한 형태는 입력값과 결과값의 존재유무에 따라 4가지 유형으로 나눌 수 있다.

2-1. 일반적인 함수

앞의 예제가 바로 일반적인 경우로, 입력값을 받아 결과값을 돌려주는 경우이다.

def sum(a,b):
    result = a + b
    return result
c = sum(3,4)
print(c)
[Output] 7

이 함수는 입력값을 넣고 결과값을 돌려받을 목적이므로, 다음과 같이 사용한다.

결과값을 받을 변수 = 함수명(입력인수 1, 입력인수 2, …)

2-2. 입력값이 없는 함수

입력값이 없다는 것은 감이 잘 안올 수 있다.

def say():
    return 'hello'
say()
[Output] 'hello'

위처럼 함수를 정의한 경우 say()의 괄호에 아무것도 입력하면 안된다. 즉, 입력값이 없다는 것이다.
따라서 다음과 같이 사용한다.

결과값을 받을 변수 = 함수명()

2-3. 결과값이 없는 함수

def sum(a,b):
    print("%s, %s의 합은 %s 입니다." % (a,b,a+b))
sum(1,2)
[Output] 1, 2의 합은 3 입니다.

함수명(입력인수 1, 입력인수 2)

결과로 1, 2의 합은 3 입니다.가 출력되어, 결과값이 존재한다고 생각할 수 있다. 하지만 결과값은 오직 return함수로만 돌려받을 수 있다.
print()함수는 단지 출력해 보여줄 뿐이다.

c = sum(1,2)
print(c)
[Output] None

이처럼 변수에 저장을 시도해보면 None을 돌려주는 것을 볼 수 있다.

2-4. 입력값도 결과값도 없는 함수

def say():
print('hello')
say()
[Output] hello

쉽게말해 입력인수도 없고 return명령도 쓰지 않은 것이다. 별로 쓸일은 없을 것 같다.


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

앞의 예제는 입력인수의 개수를 1개 또는 2개로 설정했었다. 하지만 입력인수가 계속 변할수도 있을 경우에 유용한 기능이 있다.

def 함수명(*입력 변수):
수행할 문장
...

입력변수를 지정해주고 그 변수 안에 여러 값을 대입할 수 있다.

def sum_many(*args):
    sum = 0
    for i in args:
        sum = sum + i
    return sum
sum_many(1,2,3,4,5)
[Output] 15

args라는 변수에 1,2,3,4,5의 값들을 입력하고, sum_many함수에 입력하면 처음부터 끝까지 더해주는 결과를 만들었다. 앞의 for문 포스팅을 참고하자.

이처럼 입력 변수명 앞에 *을 붙이면 입력값들을 모아서 튜플로 만들어 주는 역할을 한다.

3-1. 여러개의 입력값에 입력인수 추가하기

여러개의 입력값을 받을 *입력변수 뿐만 아니라, 수행명령도 여러가지로 넣어줄 수 있다.

def sum_mul(math, *args):
    if math == "sum":
        result = 0
        for i in args:
            result = result + i
    elif math == "mul":
        result = 1
        for i in args:
            result = result*i
    return result

이 함수는 *arge입력변수와 math라는 인수를 추가로 입력해주었다.
sum이 입력될 경우 요소들의 합을, mul을 입력하면 곱을 한다. 역시 for 구문을 활용했다.

sum_mul('sum', 1,2,3,4,5,6,7,8,9,10)
[Output] 55

입력인수로 sum을 사용한 경우이다.

sum_mul('mul', 1,2,3)
[Output] 6

입력인수로 mul을 사용한 경우이다.


4. 함수의 두개의 출력값

def sum_mul(a,b):
    return a+b,a*b

위와 같이 return함수 뒤에 결과값을 두개로 두면 어떨까?

sum_mul(1,2)
[Output] (3, 2)

순서대로 두개의 결과값이 튜플로 묶여 하나로 출력된다.

sum, mul = sum_mul(1,2)
print(sum)
print(mul)
[Output] 
3
2

개별 값들을 변수에 저장하고 싶다면 위와 같은 방법을 이용할 수 있다.


5. 입력인수에 초깃값 미리 설정하기

파이썬의 내장함수나 외장함수들을 사용하다보면 함수의 옵션 중 default로 설정되어 있는 입력인수들이 있는 것을 종종 볼 수 있다.

def say_myself(name, old, man = True):
    print("나의 이름은 %s입니다." % name)
    print("나이는 %s살입니다." % old)
    if man:
        print("남자입니다.")
    else:
        print("여자입니다.")

이와 같이 man이라는 입력인수는 false라는 지정이 없으면 언제나 True를 가지고 있게 되고, 함수의 설계에 따라 print("남자입니다.")명령을 수행하게 된다.

say_myself("SYG",26)
[Output]
나의 이름은 SYG입니다.
나이는 26살입니다.
남자입니다.
say_myself("SYG",26,False)
[Output]
나의 이름은 SYG입니다.
나이는 26살입니다.
여자입니다.

하지만 주의해야할 점이 있다.

입력인수의 초기값 설정시 항상 마지막에 위치해야한다.

def say_myself(name, man = True, old):
    print("나의 이름은 %s입니다." % name)
    print("나이는 %s살입니다." % old)
    if man:
        print("남자입니다.")
    else:
        print("여자입니다.")
  File "<ipython-input-30-a69896f4d7c9>", line 1
    def say_myself(name, man = True, old):
                  ^
SyntaxError: non-default argument follows default argument

입력인수의 초기값은 항상 마지막에 와야한다.


6. 함수 내 변수와 함수 외 변수

예를 들어 아래와 같이 함수를 정의할때 사용한 변수 a가 과연 함수를 사용하지 않을때도 값이 저장된 값일지 주의할 필요가 있다.

a = 1
def vartest(a):
    a = a + 1
vartest(a)
print(a)
[Output] 1

같은 변수명 a를 이용했고 정의한 함수 vartest(a)를 거쳐 a는 2의 값을 가지게 될 것 같지만 여전히 1이다. 그 이유는 함수 밖에서 만들어진 a변수는 함수 내에서의 수식 a = a + 1에 적용되지 않는 ‘함수만의 변수’이기 때문이다.

당연히 애초에 a = 1이라는 변수를 애초에 만들지 않고 vartest(a)함수를 실행하고 확인하면 오류가 발생한다.

vartest(3)
---------------------------------------------------------------------------

NameError                                 Traceback (most recent call last)

<ipython-input-48-bca0e2660b9f> in <module>()
----> 1 print(a)


NameError: name 'a' is not defined

따라서 이와 같은 문제를 보완하기 위해서는 return함수 이용, 다시 대입해주는 작업이 필요하다.

def vartest(a):
    a = a + 1
    return a

return함수를 이용해 결과값을 돌려받도록 설계해준다.

a = vartest(3)
print(a)
[Output] 4

이 결과값을 a라는 변수에 다시 대입해준다.
물론 여기서도 a는 함수 내의 a와 다른 것이다.


Reference

도서 [점프 투 파이썬] 를 공부하며 작성하였습니다.

댓글남기기