파이썬 4일차

Programing/Python 2012. 5. 11. 16:32 |

- 함수

 

>>> def 함수명 ( 인자 )

 

파이썬은 함수선언 할 때 꼭 def을 붙혀 주면된다.

 

 

- 인자 여러가지 받을 방법

def 함수이름(*입력변수):
   
<수행할 문장>
   
...

 

입력변수 앞에 *을 붙혀주면 만사 오키~~

 

def jaeho(*test):
    u = 0
    for i in test:
        print (i + u)
        u = i + u

 

jaeho(5,3,4,5)

5
8
12
17

 

 

>>> 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

 

리턴값을 여러개 받는 방법

 

>>> def ab( i,o):
...     return i + o, o * i, i * i, o *o
...
>>> ab(2,5)
(7, 10, 4, 25)
>>> a,b,c,d = ab(3,6)
>>> a
9
>>> b
18
>>> c
9
>>> d
36
>>>

 

 

 

 

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

 

함수안에서 사용할 변수의 이름을 함수 밖에서 사용한 이름과 동일하게 사용한다면 어떻게 될까? 이런 궁금증이 떠올랐던 독자라면 이곳에서 확실하게 알 수 있을 것이다.


아래의 예를 보자.

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

vartest(a) 
print a

먼저 a라는 변수를 생성하고 1을 대입한다. 그리고 입력으로 들어온 값을 1만큼 더해주고 리턴값은 돌려주지 않는 vartest 함수에 입력 값으로 a를 주었다. 그 다음에 a의 값을 출력하게 하였다. 당연히 vartest에서 a를 1만큼 더했으니까 2가 출력되어야 할 것 같지만 프로그램 소스를 작성해서 실행시켜 보면 결과 값이 1이 나온다.

 

그 이유는 함수안에서 새로 만들어진 변수는 함수안에서만 쓰여지는 변수이기 때문이다. 즉 def vartest(a)처럼 하면 이때 입력 인수를 뜻하는 변수 a는 함수안에서만 쓰이는 변수이지 함수 밖의 변수 a가 아니라는 말이다.


위에서 변수이름을 a 로한 vartest함수는 다음처럼 변수이름을 b로한 vartest와 완전히 동일한 것이다.

def vartest(b): 
    b = b + 1

즉 함수에서 쓰이는 변수는 함수 밖의 변수이름들과는 전혀 상관 없다는 말이다. 따라서 위에서 보았던 vartest의 a는 1이란 값을 입력으로 받아서 1만큼 더해주어 a가 2가 되지만 그것은 함수 내의 a를 뜻하는 것이지 함수 밖의 변수 a와는 전혀 다르다는 말이다.


다음의 예를 보면 더욱 정확하게 이해할 수 있을 것이다.

def vartest(a): 
    a = a + 1 

vartest(3) 
print a

위의 프로그램 소스를 에디터로 작성해서 실행시키면 어떻게 될까? 에러가 날 것이라 생각한 독자는 모든 것을 이해한 독자이다. vartest(3)을 수행하면 vartest라는 함수내에서 a는 4가 되지만 함수를 끝내고 난뒤에 print a라는 문장은 에러가 나게 된다. 그 이유는 a라는 변수는 어디에도 찾아 볼 수가 없기 때문이다. 다시 말하지만 함수 내에서 쓰이는 변수는 함수내에서 쓰일 뿐이지 함수 밖에서 사용될 수 있는 것이 아니다. 이것에 대해서 이해하는 것은 매우 중요하다.


그렇다면 vartest라는 함수를 이용해서 함수 외부의 a를 1만큼 증가시킬 수 있는 방법은 없을까? 라는 의문이 떠오르게 된다. 두 가지 해결 방법이 있을 수 있다.


첫 번째 방법

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

a = vartest(a) 
print a

첫 번째 방법은 return을 이용하는 방법이다. vartest함수는 입력으로 들어온 값을 1만큼 더한 값을 돌려준다. 따라서 a = vartest(a)처럼 하면 a가 vartest함수의 리턴값으로 바뀌게 되는 것이다. 여기서도 물론 vartest함수 안의 a변수는 함수 밖의 a와는 다른 것이다.


두 번째 방법

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

vartest() 
print a

두 번째 방법은 global이라는 명령어를 이용하는 방법이다. 위의 예에서 보듯이 vartest안의 global a라는 문장은 함수 안에서 함수 밖의 a변수를 직접 사용하겠다는 말이다. 보통 프로그래밍을 할 때 global이라는 것은 쓰지 않는 것이 좋다. 왜냐하면 함수는 독립적으로 존재하는 것이 좋기 때문이다. 외부 변수에 종속적인 함수는 그다지 좋은 함수가 아니다. 독자는 가급적 이 global을 쓰는 방식을 피해야 할 것이다. 따라서 당연히 두 번째 방법보다는 첫 번째 방법이 좋다.

 

 

'Programing > Python' 카테고리의 다른 글

파이썬 5일차 - 2  (0) 2012.05.14
파이썬 5일차 - 1  (0) 2012.05.14
파이썬 3일차  (0) 2012.05.09
파이썬 2일차 - 1  (0) 2012.05.09
파이썬 2일차 - 2  (0) 2012.05.08
Posted by 부우산사나이
: