Chapter6 함수와 함수형 프로그래밍 - ppitch/chapter GitHub Wiki

함수

함수 설정시 변수 선언 후 함수 정의시 변수를 함수 매개변수값에 선언을 한 후 호출을 하게 되면 최초 선언한 변수값으로 계속 리턴한다. 단, 함수의 매개변수값을 넣을경우 새로 넣은 인자값으로 지정된다.

a = 10
def foo(x=a):
    return x
a = 5
print foo()  #---> 10으로 출력됨
print foo(5) #--->  5로 출력됨

--------------- 함수를 통한 배열 할당 ---------------
def foos(x, items=[]):
    items.append(x)
    return items

foos(1)
foos(2)
foos(3)

for i in foos(4):
    print i #--> 1,2,3,4 가 출력됨

매개변수

함수의 매개변수를 지정할때 별표(*)를 지정하면 여러개의 매개변수를 저장할 수 있다. 별표(*)가 한개이면 이전까지 개별로 설정한 매개변수 갯수 이후의 위치에서 키워드를 설정하지 않은 매개변수까지 저장한다. 별표(*)가 두개이면 키워드를 설정한 매개변수 값만 저장한다. 중요한 점은 **은 맨 마지막에 지정해야 한다는 점이다.

def Test(a, *args, **params):
    print "a=",a            #----> 1 출력
    print "args=",args      #----> (2,a,2,3,4) 출력
    print "params",params   #----> {x:1, y:2, z=3} 출력

Test(1, 2, "a", 2, 3, 4, x=1, y=2, z=3)

매개변수 전달

입력으로 넘어오는 값을 변경할 경우 문제를 발생시킬 위험이 있으므로 아래와 같은 코딩은 피하는것이 좋다.

a = [1,2,3,4,5]
def square(items):
    for i, x in enumerate(items):
        items[i] = x * x

square(a)
print a #---> [1, 4, 9, 16, 25]로 출력 및 a 변수값 변경이 됨

유효 범위

함수내에서 지역변수가 아닌 전역변수를 선언하여 사용할 경우 global을 선언해서 사용한다.

a = 1
b = 100
def foo():
    global a #---> 전역변수 선언
    a = 10
    b = 999

foo()
print a #---> 10으로 변경되어 출력
print b #---> 100으로 출력

파이썬에서는 함수내 함수를 선언할 수 있는 중첩 함수를 허용한다.

def countdown(start):
    n = [] #---> 파이썬 2에서는 중첩함수내에 동일한 변수명이 있을 경우 동작 X 대신 리스트 또는 사전에 넣고 실행 가능.
    n.append(start)
    def display():
        print('T-minus %d' % n[0])
    def decrement():
        #nonlocal n ---> 파이썬 3에서는 nonlocal을 사용하여 상위 함수의 변수를 동일하게 사용하도록 선언 가능하다.
        n[0] -= 1
    while n[0] > 0: #---> while문으로 내부 함수인 display, decrement 함수 반복 호출
        display()
        decrement()

countdown(12)