Contents
1. 함수ì�˜ ì •ì�˜ì™€ 호출 ¶
~cpp
def 함수명(�수들..):
문들(statements)
return <ê°’>
~cpp
def add(a,b):
return a+b
returnì�€ 계산ë�œ ê°’ì�„ 함수를 호출한 곳으로 ë�Œë ¤ì¤€ë‹¤. def는 함수 ê°�체를 ìƒ�ì„±í•˜ê³ ê·¸ ê°�체를
add란 ì�´ë¦„ì—� í• ë‹¹í•œë‹¤. 즉, ì�´ë¦„ add는 함수 ê°�ì²´ì�˜ reference를 ê°–ê³ ìžˆë‹¤.
add란 ì�´ë¦„ì—� í• ë‹¹í•œë‹¤. 즉, ì�´ë¦„ add는 함수 ê°�ì²´ì�˜ reference를 ê°–ê³ ìžˆë‹¤.
add는 함수 ê°�체를 참조하는 ì�´ë¦„ì—� 불과하므로 다른 ì�´ë¦„ì�„ ì�´ìš©í•´ 함수를 í˜¸ì¶œí• ìˆ˜ë�„ 있다.
~cpp >>> f = add >>> f(4,5) 9
pass는 아무 ì�¼ë�„ 하지 않는 통과문(statement)ì�´ë‹¤. 함수는 최소한 한 ê°œ ì�´ìƒ�ì�˜ 문ì�„ ê°€ì ¸ì•¼ 하기 때문ì—� 사용한다.
~cpp
def add(a,b):
pass
2. ì�¸ìˆ˜ ì „ë‹¬ 방법 ¶
~cpp >>> def f(t): t = 10 >>> a = 20 # a는 ê°�ì²´ 20ì�„ 참조한다. >>> f(a) # a를 t를 통해 넘겼으므로 t는 a와 ë�™ì�¼í•œ 참조를 갖는다. ê·¸ë¦¬ê³ t = 10ì—�서 tê°€ ê°�ì²´ 10ì�„ 참조한다. ì�´ë•Œ aì�˜ 참조는 변함없다. >>> print a 20
3. return문 ¶
~cpp >>> def f(): return >>> f() >>> a = f() >>> print a None
ì�¸ìˆ˜ ì—†ì�´ return문 ë§Œì�„ 사용하면 함수 호출측ì—� 아무 ê°’ë�„ ì „ë‹¬í•˜ì§€ 않는다.
ì�¸ìˆ˜ ì—†ì�´ returnì�„ 하지만, ì‹¤ì œë¡œëŠ” None ê°�ì²´ê°€ ì „ë‹¬ë�œë‹¤.
None �체란 파�� 내장 �체로서, 아무 값� 없�� 나타내기 위한 �체�다.
ì�¸ìˆ˜ ì—†ì�´ returnì�„ 하지만, ì‹¤ì œë¡œëŠ” None ê°�ì²´ê°€ ì „ë‹¬ë�œë‹¤.
None �체란 파�� 내장 �체로서, 아무 값� 없�� 나타내기 위한 �체�다.
ê°’ì�´ ì „ë‹¬ë�˜ì§€ 않았다면 ì�´ë¦„ aê°€ ìƒ�성ë� 수 없었ì�„ 것ì�´ë‹¤.
return문� 사용하지 않아� None��는 리턴 값� 존재한다.
즉, 리턴 ê°’ì�´ 존재하지 않ì�„ 때 ì–¸ì œë‚˜ None ê°�체를 넘긴다.
즉, 리턴 ê°’ì�´ 존재하지 않ì�„ 때 ì–¸ì œë‚˜ None ê°�체를 넘긴다.
4. Scoping Rule ¶
* �름 공간
LGB는 Local, Global, Built-in ì�˜ 약ìž�로 ì§€ì—, ì „ì—, 내장 순으로 ì�´ë¦„ 공간ì�´ ì �ìš©ë�œë‹¤.
- ì§€ì— ì˜�ì—(local scope) - 함수
- ì „ì— ì˜�ì—(global scope) - 모듈(파ì�¼)
- 내장 ì˜�ì—(built-in scope) - 파ì�´ì�¬ 언어 ìž�ì²´ì—�서 ì •ì�˜í•œ ë‚´ìš©
LGB는 Local, Global, Built-in ì�˜ 약ìž�로 ì§€ì—, ì „ì—, 내장 순으로 ì�´ë¦„ 공간ì�´ ì �ìš©ë�œë‹¤.
~cpp
# g, h는 ì „ì—
g = 10
h = 5
def f(a): # a는 ì§€ì—
h = a + 10 # h는 ì§€ì—(새로 ì •ì�˜í–ˆìœ¼ë¯€ë¡œ)
b = a + g # bë�„ ì§€ì—, g는 ì „ì—
return b
g, h는 함수 외부ì—�서 ì •ì�˜ë�˜ì—ˆìœ¼ë¯€ë¡œ ì „ì—, a,b는 함수 ë‚´ë¶€ì—�서만 사용ë�˜ëŠ” ì§€ì— ë³€ìˆ˜ì�´ë‹¤.
h는 ì „ì—ì—� 있지만 함수 ë‚´ë¶€ì—�서 ìƒ�성하므로 함수 ë‚´ë¶€ì—�서는 ì§€ì— ë³€ìˆ˜ h를,
함수 외부ì—�서는 ì „ì— ë³€ìˆ˜ h를 참조한다.
함수 fì�˜ ì§€ì— ì�´ë¦„들ì�€ 함수 fê°€ 종료ë�˜ë©´ì„œ 사ë�¼ì§„다(ì�´ë¦„ 공간 ìž�ì²´ê°€ 사ë�¼ì§„다).
h는 ì „ì—ì—� 있지만 함수 ë‚´ë¶€ì—�서 ìƒ�성하므로 함수 ë‚´ë¶€ì—�서는 ì§€ì— ë³€ìˆ˜ h를,
함수 외부ì—�서는 ì „ì— ë³€ìˆ˜ h를 참조한다.
함수 fì�˜ ì§€ì— ì�´ë¦„들ì�€ 함수 fê°€ 종료ë�˜ë©´ì„œ 사ë�¼ì§„다(ì�´ë¦„ 공간 ìž�ì²´ê°€ 사ë�¼ì§„다).
함수 fë‚´ë¶€ì�˜ h를 ì „ì—변수로 ì‚¬ìš©í•˜ë ¤ë©´(즉, ì „ì—변수hì�˜ ê°’ì�„ ë°”ê¾¸ê³ ìž�한다면)
global문ì�„ 사용하여 hê°€ ì „ì— ë³€ìˆ˜ìž„ì�„ ì„ ì–¸í•´ì•¼ 한다.
global문ì�„ 사용하여 hê°€ ì „ì— ë³€ìˆ˜ìž„ì�„ ì„ ì–¸í•´ì•¼ 한다.
~cpp
def f(a): # a는 ì§€ì—
global h
h = a + 10 # h는 ì „ì—
~cpp
g = 10
def f():
a = g
g = 20
return a
f()
- 중첩 ì˜�ì—(Nested scopes) ì§€ì›�(2.1ì�´ìƒ�)
~cpp
x = 2 # global
def F():
x = 1 # 함수 G 안�서 여기는 local� global� 아니다
def G():
print x
G()
F()
함수 Gì—�서 참조하는 x는 ì§€ì—(함수 G안), ì „ì—(모듈), 내장 ì˜�ì—ë§Œ 찾게 ë�˜ë¯€ë¡œ 함수 Fì—� ì •ì�˜ë�œ xê°€ 참조ë�˜ì§€ 않는다.(x = 2)그러나 2.1ì�´ìƒ�ì—�서는 함수 F 안ì�˜ x를 참조하므로 올바른 결과가 나온다.
5.1. 기본 ì�¸ìˆ˜ ¶
~cpp >>> def incr(a, step=1): return a + step >>> b = 1 >>> b = incr(b) # 1 �가 >>> b 2 >>> b = incr(b, 10) # 10 �가 >>> b 12
5.2. 키워드 ì�¸ìˆ˜ ¶
~cpp >>> def area(height, width): print height, width # 순서가 아닌 ì�´ë¦„으로 ê°’ì�´ ì „ë‹¬ë�œë‹¤ >>> a = area(width=20, height=10) 10 20
5.3. 가변 ì�¸ìˆ˜ 리스트 ¶
ê³ ì •ë�˜ì§€ 않ì�€ 수ì�˜ ì�¸ìˆ˜ë¥¼ 함수ì—� ì „ë‹¬ - 나머지는 모ë‘� 튜플 형ì‹�으로 받는다
~cpp >>> def varg(a, *arg): print a, arg >>> varg(1) 1 () >>> varg(2,3) 2 (3,) >>> varg(2,3,4,5,6) 2 (3, 4, 5, 6)
5.4. ì •ì�˜ë�˜ì§€ 않ì�€ 키워드 ì�¸ìˆ˜ 처리하기 ¶
미리 ì •ì�˜ë�˜ì–´ 있지 않ì�€ 키워드 ì�¸ìˆ˜ë¥¼ ë°›ìœ¼ë ¤ë©´ 함수 ì •ì�˜í• 때 마지막ì—� **kw형ì‹�으로 ê¸°ìˆ í•œë‹¤.
ì „ë‹¬ 받는 형ì‹�ì�€ ì‚¬ì „ì�´ë‹¤. 키는 키워드(변수명), ê°’ì�€ 키워드 ì�¸ìˆ˜ë¡œ ì „ë‹¬ë�œ ê°’ì�´ ë�œë‹¤.
ì „ë‹¬ 받는 형ì‹�ì�€ ì‚¬ì „ì�´ë‹¤. 키는 키워드(변수명), ê°’ì�€ 키워드 ì�¸ìˆ˜ë¡œ ì „ë‹¬ë�œ ê°’ì�´ ë�œë‹¤.
~cpp
>>> def f(width, height, **kw):
print width, height
print kw
>>> f(width = 10, height=5, depth=10, dimension=3)
10 5
{'depth': 10, 'dimension': 3}
5.5. 튜플 ì�¸ìˆ˜ì™€ ì‚¬ì „ ì�¸ìˆ˜ë¡œ 함수 호출하기(2.0 ì�´ìƒ�) ¶
~cpp >>> def h(a,b,c): print a,b,c >>> args = (1,2,3) >>> h(*args) 1 2 3
~cpp
>>> dargs = {'a':1, 'b':2, 'c':3}
>>> h(**dargs)
1 2 3
~cpp
>>> args = (1,2)
>>> dargs ={'c':3}
>>> h(*args, **dargs)
1 2 3
6. 람다 함수 ¶
람다 함수는 �름� 없는 한 줄 짜리 함수�다.
~cpp lambda 콤마로 구분� �수들: �
~cpp >>> f = lambda:1 >>> f() 1
~cpp >>> g = lambda x, y: x+y >>> g(1,2) 3
~cpp >>> incr = lambda x, inc=1: x+inc >>> incr(10) 11 >>> incr(10,5) 15
~cpp >>> vargs = lambda x, *args: args >>> vargs(1,2,3,4,5) (2, 3, 4, 5)
~cpp
>>> kwords = lambda x, *args, **kw: kw
>>> kwords(1,2,3, a=4, b=6)
{'a': 4, 'b': 6}
| 구분 | def로 ì •ì�˜ë�˜ëŠ” 함수 | lambda 함수 |
| 문/� | 문(statement) | �(expression) |
| 함수ì�˜ ì�´ë¦„ | def 다ì�Œì—� ì§€ì •ë�œ ì�´ë¦„으로 ìƒ�성한 함수 ê°�체를 치환한다 | 함수 ê°�ì²´ë§Œì�„ ìƒ�성한다 |
| 몸체 | 한 개 ��� 문� �함 | 하나� � |
| 리턴 | return문ì—� ì�˜í•´ 명시ì �으로 리턴 ê°’ì�´ ì§€ì •ë�œë‹¤ | ì‹�ì�˜ 결과가 리턴ë�œë‹¤ |
| ë‚´ë¶€ 변수 ì„ ì–¸ | ì§€ì— ì˜�ì—ì—� 변수를 ìƒ�ì„±í•˜ê³ ì‚¬ìš©í•˜ëŠ” 것ì�´ 가능 | ì§€ì— ì˜�ì—ì—� 변수를 ìƒ�성하는 것ì�´ 불가능 |










