블로그 이미지

It's iHWAN

나의 생각과 가치, 생활 그리고 IT이야기... by iHWAN


함수

함수의 정의와 호출

def 함수이름 (인수1, 인수2, ...):
문(statements)
return <값>

예제
>>> def add(a,b):
return a+b;
return 은 계산된 값을 함수를 호출한 곳으로 돌려줌.
def 는 함수 객체를 생성하고 그 객체를 add란 이름에 할당한다. add는 함수 객체의 reference를 가지고 있다.

아래와 같이 해당 이름으로 함수에 대해 객체 정보를 볼 수 있다.
>>> add


add는 함수 객체를 참조하는 이름일 뿐이므로 다른 이름을 통해서도 호출이 가능하다
>>> f = add
>>> f(1,2)
3

add와 동일한 레퍼런스를 가지고 있다.
>>> f


파이썬의 함수는 인수 지정이 필요 없고, 리턴 값의 개수나 자료형도 필요가 없다.

아래와 같이 통과문 pass를 사용하면 아무값도 넘겨 주지 않는다.
>>> def simple():
pass

예제-멤버 추가
>>> def addmember(memberlist, newmember):
if newmember not in memberlist:
memberlist.append(newmember)


>>> members = ['clock', 'speaker', 'monitor', 'computer']
>>> addmember(members,'mic')
>>> members
['clock', 'speaker', 'monitor', 'computer', 'mic']


인수전달방법

파이썬은 함수 호출시 레퍼런스를 넘겨준다.
그러나, 이것은 call-by-reference 와는 다르다.

>>> def f(t):
t = 10


>>> a = 20
>>> f(a)
>>> print a
20

위와 같이 호출 하면 결과가 20이 나오는 이유는 무엇일까?
레퍼런스를 넘겨주면 a는 10으로 바뀌어야 하는 것 아닌가?

해답은 함수 내의 t에 달려 있다.
f(a)를 해서 a의 레퍼런스를 넘기계 되면 t에는 a의 레퍼런스가 저장이 된다. 그러나 함수내의 t=10은 10 객체가 레퍼런스로 저장이 되기 때문에 t는 a가 아닌 10의 레퍼런스로 바뀌게 된다.

그러므로 a의 값은 변화가 없고, 단지 10이라는 수치 객체가 생성되고, 레퍼런스가 이름 t에 치환 될 뿐이다.


그렇다면, 변경불가능(immutable)형의 자료형의 경우는 어떨까?

>>> def h(t):
t = (1,2,3)


>>> a = (5,6,7)
>>> h(a)
>>> a
(5, 6, 7)
마찬가지 결과 이다. 결국 자료에는 변화가 없다.

그러나, 변경가능한 객체는 내부값을 직접 변경할 수 있다.
>>> def g(t):
t[1] = 10


>>> a = [1,2,3]
>>> g(a)
>>> print a
[1, 10, 3]
자료의 내부구조가 바뀌였다.
이것은 t로 인수를 받았지만, t[1]=10일때는 자료를 수정하는 것이기때문에 새로운 객체를 생성하지 않아 자료가 변경된다.

그러나, 아래와 같은 구조는 자료가 유지된다.
>>> def gg(t):
t = [1,2,3]


>>> a = [5,6,7]
>>> gg(a)
>>> a
[5, 6, 7]

정리하자면, 함수내에서 인수가 다른 객체로 바뀌면 자료는 바뀌지 않고, 변경가능형일때는 내부 객체를 수정할때만 반영이 된다.


Return statememt

인수 없는 리턴 예제, 내부적으로는 None 객체가 사용됨을 알 수 있다.
>>> def nothing():
return

>>> nothing()
>>> a = nothing()
>>> print a
None

리턴문을 쓰지 않아도, 내부적으로 None객체가 쓰인다.
>>> def nothing():
print 'Hello'


>>> a = nothing()
Hello
>>> print a
None

한개의 값은 일반 자료형으로 리턴되고, 두개 이상의 값은 튜플로 리턴된다.
>>> def add(a,b):
return a+b

>>> add(1,2)
3
>>> def calc(a,b):
return a+b, a-b, a*b, a/b

>>> calc(5,2)
(7, 3, 10, 2)


파이썬은 동적인 자료형을 지원하기 때문에 add(int, int); add(int,double)같이 여러가지 함수를 만들지 않아도 된다.

Scoping Rule (영역에 대한 규칙)
LGB 규칙 : 변수를 찾을때 Local, Global, Built-in 영역 순으로 탐색해 나간다.

함수인수
기본인수 지정
>>> def incr(a, step=1):
return a + step

>>> incr(4)
5
그러나, 기본정의 인수 다음인수는 꼭 기본인수를 정의 해야 한다.




한줄짜리 함수 : 람다 함수
>>> g = lambda x, y : x+y
>>> g
at 0x00CAD730>
>>> g(1,2)
3
Comment 0 Trackback 0

Trackback : http://www.ihwan.com/trackback/484 관련글 쓰기

Top

prev 1 ... 252 253 254 255 256 257 258 259 260 ... 287 next