함수의 입력값이 몇 개가 될지 모를 때 어떻게 해야 할까?
입력값이 여러 개일 때 그 입력값들을 모두 더해 주는 함수를 생각해 보자.
그런데 몇 개가 입력될지 모를 때는 난감할 것이다.
해결방법은 *입력 변수 이다.
기본 형태
def 함수명(*입력 변수)
수행할 문장
...
여러 개의 입력값을 받는 함수 만들기
여러 개의 입력값을 모두 더하는 함수를 직접 만들어 보려고 할 때,
예를 들어 gibeom_plus(1, 2)이면 3을, gibeom_plus(1,2,3)이면 6을,
gibeom_plus(1,2,3,4,5,6,7,8,9,10)이면 55를 돌려주는 함수를 만들어보자.
>>>def gibeom_plus(*args):
. . . sum = 0
. . . for i in args:
. . . sum += i
. . . return sum
. . .
>>>
★gibeom_plus 라는 함수는 입력값이 몇 개이든 상관X
변수명 앞에 *을 붙이면 입력값들을 전부 모아서 튜플로 만들기 때문.
★*args는 임의로 정한것이고 아무거나 해도 됨
args는 입력 인수를 뜻하는 영어 단어인 arguments의 약자이며 관례적으로 사용
위에 만든 함수를 직접 입력해보면
>>>result = gibeom_plus(1,2,3) ←gibeom 함수의 결과값을 result 변수에 대입
>>>print(result)
6
>>>result = gibeom_plus(1,2,3,4,5,6,7,8,9,10)
>>>print(result)
55
함수의 인수로 *args(*입력 변수)만 사용할 수 있는 것은 아니다.
한개를 더 추가해보면
>>>def gibeom_plus(haha, *args):
. . . if haha == "gibeom": ← 입력인수 haha에 'gibeom'을 입력받았을 때
. . . result = 0
. . . for i in args:
. . . result = result + i ← *args에 입력받은 모든 값을 더한다
. . . elif haha == "plus": ← 입력인수 haha에 'plus'를 입력받았을 때
. . . result = 1
. . . for i in args:
. . . result = result*i ← *args에 입력받은 모든 값을 곱한다.
. . . return result
. . .
>>>
테스트 해보면
>>>a = gibeom_plus('gibeom', 1,2,3,4,5)
>>>print(a)
15
>>>b = gibeom_plus('plus', 1,2,3,4,5)
>>>print(b)
120
입력 인수에 'gibeom'이 입력된 경우 *args에 입력되는 모든 값을 더해 15를 돌려주고
'plus'가 입력된 경우 *args에 입력되는 모든 값을 곱해서 120을 돌려줌.
함수의 결과값은 언제나 하나이다
>>>def python(a,b):
. . . return a+b, a*b
이 함수를
>>>result = python(3,4) 로 호출 하면 어떻게 될까?
결과값은 2개인데 결과값을 받아들이는 변수는 result 하나만 쓰여서 오류가 날까?
ㄴㄴ
함수의 결과값은 2개가 아니라 언제나 1개이다.
python 함수의 결과값 a+b 와 a*b는 튜플값 하나인 (a+b, a*b)로 돌려줌
>>>print(result)
(7, 12)
이 하나의 튜플값을 2개의 결과값처럼 받고 싶다면?
>>>a, b = python(3,4)
이렇게 호출하면 a는 7이되고 b는 12가 됨.
★ 함수는 return문을 만나는 순간 결과값을 돌려준 다음 함수를 빠져나감.
>>>def python(a,b):
. . . return a+b
. . . return a*b
. . .
>>>result = python(2, 3)
>>>print(result)
5
return문을 2번 사용해도 두번째 return 문인 a*b는 실행되지 않는다.
※return 의 또 다른 쓰임새
>>>def say_gibeom(gibeom):
. . . if gibeom == "바보":
. . . return
. . . print("나의 별명은 %s 입니다." %gibeom)
. . .
>>>
위 함수는 입력값으로 gibeom 이라는 변수를 받아서 문자열을 출력함.
이 함수는 일단 리턴값은 없고 입력값으로 '바보'라는 값이 들어오면
문자열을 출력하지 않고 함수를 즉시 빠져나감.
>>>say_gibeom('원빈')
나의 별명은 원빈입니다.
>>>say_gibeom('바보')
>>>
입력 인수에 초깃값 미리 설정하기
def say_myself(name, old, man=True):
print("나의 이름은 %s 입니다." % name)
print("나이는 %d살 입니다." % old)
if man:
print("남자입니다.")
else:
print("여자입니다.")
입력 인수가 name, old, man=True 로 3개다 man=True는 입력 인수에 미리
값을 넣어 준 것이다. 이것이 함수의 인수 초깃값을 설정하는 방법.
함수의 입력 인수에 들어갈 값이 항상 변하는 것이 아닐 경우에는 이렇게
함수의 초깃값을 미리 설정해두면 유용하다.
say_myself("박기범", 28)
say_myself("박기범", 28, True)
나의 이름은 박기범 입니다.
나이는 28살 입니다.
남자입니다.
위에는 man 이라는 변수에는 입력값을 주지 않았지만
초깃값인 True 값을 갖게되서 두개의 출력 결과는 같다.
초깃값을 살짝바꿔보면
say_myself("박기순", 28, False)
나의 이름은 박기순 입니다.
나이는 28살 입니다.
여자입니다.
함수 입력 인수에 초깃값을 설정할 때 주의할 사항
위의 함수를 살짝 바꿔서
def say_myself(name, man=True, old): 로 바꾸면 어떻게 될까?
얼핏 생각하기에 위의 함수를 호출하려고
say_myself("박기범", 28) 을 한다면 오류메시지가 뜬다.
파이썬 인터프리터는 28을 man 변수와 old 변수 중 어디에 넣어야할지 알수가 없기 때문.
초깃값을 설정해 놓은 입력 인수 뒤에 초깃값을 설정해 놓지 않은 입력 인수는 사용할 수 없다.
★함수 안에서 선언된 변수의 효력 범위
함수 안에서 사용되는 변수는 함수 밖의 변수 이름들과는 전혀 상관 X
★함수 안에서 함수 밖의 변수를 변경하기
1. return 이용하기
a = 1
def vartest(a):
a=a+1
return a
a = vartest(a) ← vartest(a)의 결과값을 함수 밖의 변수 a에 대입
print(a)
vartest 함수는 입력으로 들어온 값에 1을 더한값을 돌려줌.
a = vartest(a)라고 대입하면 a가 vartest 함수의 결과값으로 바뀐다.
물론 vartest 함수안의 a변수는 함수밖의 a와는 다른것.
2. global 명령어 이용하기
a = 1
def vartest():
global a
a= a+1
vartest()
print(a)
global a 라는 문장은 함수 안에서
함수 밖의 a 변수를 직접 사용하겠다는 뜻.
함수는 독립적으로 존재하는 것이 좋고 외부 변수에 종속된 함수는 좋은 함수가 아니기 때문에
global 명령어를 사용하는 방법은 피하자
'파이썬 복습' 카테고리의 다른 글
4/2 파일 읽고 쓰기 (0) | 2018.04.02 |
---|---|
3/31 사용자 입력과 출력 (0) | 2018.03.31 |
3/30 함수 (1/2) (0) | 2018.03.30 |
3/29 연습문제 (0) | 2018.03.29 |
3/27 for문 (0) | 2018.03.27 |