PYTHON. 04장 프로그램의 입력과 출력. 04-1 함수


파이썬 함수의 구조

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


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


>>> a = 3 >>> b = 4 >>> c = sum(a, b) >>> print(c) 7


* 입력값과 결과값에 따른 함수의 형태

입력값 ---> 함수 ----> 리턴값


- 일반적인 함수

def 함수이름(입력인수): <수행할 문장> ... return 결과값

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

>>> a = sum(3, 4) >>> print(a) 7


- 입력값이 없는 함수

>>> def say(): ... return 'Hi' ... >>>

- 결과값이 없는 함수

>>> def sum(a, b): ... print("%d, %d의 합은 %d입니다." % (a, b, a+b)) ... >>>

>>> sum(3, 4) 3, 4의 합은 7입니다.

>>> a = sum(3, 4) >>> print(a) None

// print문은 함수의 구성 요소 중 하나인 <수행할 문장>에 해당하는 부분일 뿐이다. 
// 결과값은 당연히 없다. 결과값은 오직 return 명령어로만 돌려받을 수 있다.

- 입력값도 결과값도 없는 함수

>>> def say(): ... print('Hi') ... >>>

>>> say() Hi

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

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

def 함수이름(*입력변수): // 입력 변수명 앞에 *을 붙이면 입력값들을 전부 모아서 튜플로 만들어 준다. (입력값이 몇 개이든 상관없음) <수행할 문장> ...

>>> def sum_many(*args): ... sum = 0 ... for i in args: ... sum = sum + i ... return sum ... >>>

>>> result = sum_many(1,2,3) >>> print(result) 6 >>> result = sum_many(1,2,3,4,5,6,7,8,9,10) >>> print(result) 55

>>> def sum_mul(choice, *args): // 문자열도 같이 입력값으로 줄 수도 있다. ... if choice == "sum": ... result = 0 ... for i in args: ... result = result + i ... elif choice == "mul": ... result = 1 ... for i in args: ... result = result * i ... return result ... >>>

>>> result = sum_mul('sum', 1,2,3,4,5) >>> print(result) 15 >>> result = sum_mul('mul', 1,2,3,4,5) >>> print(result) 120

함수의 결과값은 언제나 하나이다

예제1)
>>> def sum_and_mul(a,b): ... return a+b, a*b


>>> result = sum_and_mul(3,4)

result = (7, 12) // 오류 발생 X (함수의 결과값은 2개가 아니라 언제나 1개이다. 튜플값 하나인 (a+b, a*b)로 돌려준다)

>>> sum, mul = sum_and_mul(3, 4) // sum, mul = (7,12)가 되어 sum은 7이되고, mul은 12가 된다.


예제2)

>>> def sum_and_mul(a,b): ... return a+b // 이것만 실행되고 ... return a*b // 이것은 실행되지 않는다 ... >>>


>>> result = sum_and_mul(2, 3) >>> print(result) 5


>>> def sum_and_mul(a,b): // 이것과 동일하다 ... return a+b ... >>>


[return의 또 다른 쓰임새]

어떤 특별한 상황이 되면 함수를 빠져나가고자 할 때는 return을 단독으로 써서 함수를 즉시 빠져나갈 수 있다.

>>> def say_nick(nick): 
...     if nick == "바보": 
...         return 
...     print("나의 별명은 %s 입니다." % nick)
... 
>>>

위의 함수는 입력값으로 nick이라는 변수를 받아서 문자열을 출력한다. 이 함수 역시 리턴값은 없다(문자열을 출력한다는 것과 리턴값이 있다는 것은 전혀 다른 말이다. 혼동하지 말자. 함수의 리턴값은 오로지 return문에 의해서만 생성된다).

만약에 입력값으로 '바보'라는 값이 들어오면 문자열을 출력하지 않고 함수를 즉시 빠져나간다.

>>> say_nick('야호')
나의 별명은 야호입니다.
>>> say_nick('바보')
>>>


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

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

(※ say_myself 함수는 3개의 입력 인수를 받아서 마지막 인수인 man이 True이면 "남자입니다.", False이면 "여자입니다."를 출력한다.)


say_myself("박응용", 27) say_myself("박응용", 27, True)

// 둘다 동일한 결과를 출력한다

나의 이름은 박응용입니다. 나이는 27살입니다. 남자입니다.


say_myself("박응선", 27, False)

나의 이름은 박응선입니다. 나이는 27살입니다. 여자입니다.

* 함수 입력 인수에 초깃값을 설정할 때 주의할 사항

def say_myself(name, man=True, old): // 이전 함수와 초깃값을 설정한 인수의 위치만 다르다 print("나의 이름은 %s 입니다." % name) print("나이는 %d살입니다." % old) if man: print("남자입니다.") else: print("여자입니다.")

say_myself("박응용", 27) // 오류 발생 (SyntaxError: non-default argument follows default argument)

// 초기화시키고 싶은 입력 변수들을 항상 뒤쪽에 위치시키기

함수 안에서 선언된 변수의 효력 범위

# vartest.py a = 1 def vartest(a): a = a +1 vartest(a) print(a)

// 실행시켜보면 결과값은 2가 출력되는게 아니라 1이 나온다.
// 그 이유는 함수 안에서 새로 만들어진 변수는 함수 안에서만 사용되는 "함수만의 변수"이기 때문이다
// 즉, def vartest(a)에서 입력 인수를 뜻하는 변수 a는 함수 안에서만 사용되는 변수이지 함수 밖의 변수 a가 아니라는 뜻이다.

# vartest_error.py def vartest(a): a = a + 1 vartest(3) print(a)

// vartest(3)을 수행하면 vartest라는 함수 내에서 a는 4가 되지만,
// 함수를 호출하고 난 뒤에 print(a)라는 문장은 에러가 발생하게 된다. 
// 그 이유는 print(a)에서 입력받아야 하는 a라는 변수를 어디에서도 찾을 수가 없기 때문이다.

그렇다면 vartest라는 함수를 이용해서 함수 밖의 변수 a를 1만큼 증가시킬 수 있는 방법은 없을까? 이 질문에는 2가지 해결 방법이 있다.

함수 안에서 함수 밖의 변수를 변경하는 방법

1. return 이용하기

# vartest_return.py a = 1 def vartest(a): a = a +1 return a a = vartest(a) print(a) // 2


2. global 명령어 이용하기

# vartest_global.py a = 1 def vartest():// 함수 안에서 함수 밖의 a 변수를 직접 사용하겠다는 뜻이다. global a a = a+1 vartest() print(a)


프로그래밍을 할 때 global 명령어는 사용하지 않는 것이 좋다.

왜냐하면 함수는 독립적으로 존재하는 것이 좋기 때문이다. 

외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니다. 

그러므로 가급적 global 명령어를 사용하는 이 방법은 피하고 첫 번째 방법(return)을 사용하기를 권한다.






Posted by 너래쟁이
: