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
그러나, 기본정의 인수 다음인수는 꼭 기본인수를 정의 해야 한다.
인수 없는 리턴 예제, 내부적으로는 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
>>> g(1,2)
3






Recent Comment