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)