[Python 기초] 프로그램의 입출력 - 함수 정의(def)
업데이트:
개요
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
도서 [점프 투 파이썬] 를 공부하며 작성하였습니다.
댓글남기기