블로그 이미지
김고노

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Notice

2018. 3. 30. 16:14 파이썬 복습

함수의 입력값이 몇 개가 될지 모를 때 어떻게 해야 할까?



입력값이 여러 개일 때 그 입력값들을 모두 더해 주는 함수를 생각해 보자.


그런데 몇 개가 입력될지 모를 때는 난감할 것이다.


해결방법은 *입력 변수 이다.


기본 형태


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
posted by 김고노