U E D R , A S I H C RSS

2학기파이선스터디/함수

1. 함수의 정의와 호출

~cpp 
def 함수명(인수들..):
    문들(statements)
    return <값>


~cpp 
def add(a,b):
    return a+b

return은 계산된 값을 함수를 호출한 곳으로 돌려준다. def는 함수 객체를 생성하고 그 객체를
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 객체란 파이썬 내장 객체로서, 아무 값도 없음을 나타내기 위한 객체이다.

값이 전달되지 않았다면 이름 a가 생성될 수 없었을 것이다.

return문을 사용하지 않아도 None이라는 리턴 값은 존재한다.
즉, 리턴 값이 존재하지 않을 때 언제나 None 객체를 넘긴다.

4. Scoping Rule

* 이름 공간
  • 지역 영역(local scope) - 함수
  • 전역 영역(global scope) - 모듈(파일)
  • 내장 영역(built-in scope) - 파이썬 언어 자체에서 정의한 내용

동일한 이름이 여러 이름 공간에 걸쳐 있을 경우 LGB에 따른다.
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가 종료되면서 사라진다(이름 공간 자체가 사라진다).


함수 f내부의 h를 전역변수로 사용하려면(즉, 전역변수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. 함수 인수

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문에 의해 명시적으로 리턴 값이 지정된다 식의 결과가 리턴된다
내부 변수 선언 지역 영역에 변수를 생성하고 사용하는 것이 가능 지역 영역에 변수를 생성하는 것이 불가능

7. 재귀적 프로그래밍

~cpp 
>>> def sum(N):
	if N==1: return 1
	return N + sum(N-1)

>>> sum(10)
55
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:13
Processing time 0.0205 sec