파이썬 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 부우산사나이
:

거리에 따라서 오브젝트 업데이트 처리

 

나랑 거리 20미터 이상 30프레임으로 업데이트

 

나랑 거리가 30미터 이상 20프레임으로 업데이트

 

40미터 이상은 10프레임으로 업데이트

 

이렇게 하니 프레임은 많이 올라갔음.

 

카메라 고정일땐 괜찮은데 카메라 움직이는 순간 부터 튀어 보이는 현상 발생

 

이유가 먼지 곰곰히 생각 해보니

 

나와 50미터 거리가 떨어져서 0.1초에 한번 업데이트 그러면 0.1초 동안

오브젝트는 이동 및 애니메이션을 안함.

그 동안 카메라는 이동 이 때 애니메이션 업데이트 안하는 건 괜찮은데

오브젝트 이동을 안하는게 문제가 됨,

 

무슨 뜻이냐면 카메라가 이동하면 가만히 있는 오브젝트는 뒤로 밀리게 된다.

그러다가 0.1초 뒤에 업데이트 되면서 앞으로 확 이동하게 된다.

쉽게 설명해서 시야 밖에 있는 녀석이 0.1초에 한번씩 눈에 띈다고 생각하면 된다.

눈에 아주 거슬리게 된다.

 

그래서 결국은 이동업데이트는 풀로 돌리고 나머지 업데이트는 거리에 맞게 업데이트를

조절했다.

 

이렇게 하면 튀어보이는 현상 없이 아름답게 최적화가 된다.

'게임개발이야기' 카테고리의 다른 글

루파루파 온라인 공모전 입상  (0) 2012.05.14
Posted by 부우산사나이
:

심심해서 다음, 네이버, 구글에서

 

'재호와 함께하는' 라는 글로 검색해봤다.

 

최근에 블로그질 열심이라서 검색 되는가가 궁금해서 해본 짓이지만

 

구글만 첫페이지 맨위에 링크되서 튀어나왔다. 구글이 젤 정확한거 같다.

 

 

'나의 일상 > 혼자이야기' 카테고리의 다른 글

디아블로 3  (3) 2012.05.17
클럽가고 싶어지는 하우스~  (0) 2012.05.15
난 정상이야 아직 늦지 않았어  (0) 2012.05.08
다시 시작하는 마음으로  (0) 2012.05.07
우리 컨텐츠팀 코딩 스타일!!  (0) 2010.04.16
Posted by 부우산사나이
: