파이썬 함수(Functions) 완벽 가이드: 재사용 가능한 코드 모듈 만들기
이전 페이지 다음 페이지
함수(function)는 단일 연관 동작을 수행하는 조직화된 재사용 가능한 코드 블록입니다. 함수는 애플리케이션의 모듈성을 높이고 높은 수준의 코드 재사용을 제공합니다.
이미 아시다시피 파이썬은 print() 등 많은 내장 함수를 제공하지만, 직접 함수를 만들 수도 있습니다. 이런 함수를 사용자 정의 함수(user-defined functions)라고 합니다.
함수 정의
필요한 기능을 제공하는 함수를 정의할 수 있습니다. 파이썬에서 함수를 정의하는 간단한 규칙은 다음과 같습니다.
함수 블록은 키워드 def로 시작하며 함수 이름과 괄호(( ))가 뒤따릅니다.
입력 매개 변수나 인수는 이 괄호 안에 위치해야 합니다. 괄호 안에 매개 변수를 정의할 수도 있습니다.
함수의 첫 문장은 선택적 문서화 문자열인 docstring일 수 있습니다.
모든 함수 내 코드 블록은 콜론(:)으로 시작하고 들여쓰기됩니다.
문장 return [표현식]은 함수를 종료하며, 선택적으로 표현식을 호출자에게 반환합니다. 인수 없는 return 문은 return None과 동일합니다.
구문
def functionname(parameters):
"function_docstring"
function_suite
return [expression]
기본적으로 매개 변수는 위치적 동작을 가지며, 정의된 순서대로 전달해야 합니다.
예제
다음 함수는 문자열을 입력 매개 변수로 받아 표준 화면에 출력합니다.
def printme(str):
"This prints a passed string into this function"
print str
return
함수 호출
함수 정의는 이름만 주고, 함수에 포함될 매개 변수를 지정하고, 코드 블록을 구조화합니다.
함수 기본 구조가 확정되면 다른 함수에서 호출하거나 파이썬 프롬프트에서 직접 실행하여 수행할 수 있습니다. printme() 함수 호출 예제는 다음과 같습니다.
Live Demo
#!/usr/bin/python
# 함수 정의
def printme(str):
"This prints a passed string into this function"
print str
return
# 이제 printme 함수 호출
printme("I'm first call to user defined function!")
printme("Again second call to the same function")
위 코드를 실행하면 다음 결과가 생성됩니다.
I'm first call to user defined function!
Again second call to the same function
참조 전달 vs 값 전달
파이썬 언어에서 모든 매개 변수(인수)는 참조에 의해 전달됩니다. 즉, 함수 내에서 매개 변수가 참조하는 것을 변경하면 호출 함수에도 변경이 반영됩니다. 예를 들어:
Live Demo
#!/usr/bin/python
# 함수 정의
def changeme(mylist):
"This changes a passed list into this function"
mylist.append([1,2,3,4]);
print "Values inside the function: ", mylist
return
# 이제 changeme 함수 호출
mylist = [10,20,30];
changeme(mylist);
print "Values outside the function: ", mylist
여기서는 전달된 객체의 참조를 유지하고 같은 객체에 값을 추가합니다. 따라서 다음 결과가 생성됩니다.
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]
Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
인수가 참조로 전달되고 호출된 함수 내에서 참조가 덮어쓰여지는 또 다른 예제가 있습니다.
Live Demo
#!/usr/bin/python
# 함수 정의
def changeme(mylist):
"This changes a passed list into this function"
mylist = [1,2,3,4]; # mylist에 새 참조 할당
print "Values inside the function: ", mylist
return
# 이제 changeme 함수 호출
mylist = [10,20,30];
changeme(mylist);
print "Values outside the function: ", mylist
매개 변수 mylist는 changeme 함수에 지역적입니다. 함수 내에서 mylist를 변경해도 mylist에는 영향을 주지 않습니다. 함수는 아무 일도 수행하지 않으며 최종적으로 다음 결과가 생성됩니다.
Values inside the function: [1, 2, 3, 4]
Values outside the function: [10, 20, 30]
함수 인수
다음 유형의 형식 인수를 사용하여 함수를 호출할 수 있습니다.
- 필수 인수(Required arguments)
- 키워드 인수(Keyword arguments)
- 기본 인수(Default arguments)
- 가변 길이 인수(Variable-length arguments)
필수 인수
필수 인수는 올바른 위치 순서로 함수에 전달되는 인수입니다. 여기서 함수 호출의 인수 개수는 함수 정의와 정확히 일치해야 합니다.
printme() 함수를 호출하려면 반드시 인수 하나를 전달해야 하며, 그렇지 않으면 다음과 같은 구문 오류가 발생합니다.
Live Demo
#!/usr/bin/python
# 함수 정의
def printme(str):
"This prints a passed string into this function"
print str
return
# 이제 printme 함수 호출
printme()
위 코드를 실행하면 다음 결과가 생성됩니다.
Traceback (most recent call last):
File "test.py", line 11, in <module>
printme();
TypeError: printme() takes exactly 1 argument (0 given)
키워드 인수
키워드 인수는 함수 호출과 관련이 있습니다. 함수 호출에서 키워드 인수를 사용하면 호출자가 매개 변수 이름으로 인수를 식별합니다.
이를 통해 파이썬 인터프리터가 제공된 키워드를 사용하여 값과 매개 변수를 매칭할 수 있으므로 인수를 건너뛰거나 순서를 바꿀 수 있습니다. printme() 함수를 다음과 같이 키워드 호출할 수 있습니다.
Live Demo
#!/usr/bin/python
# 함수 정의
def printme(str):
"This prints a passed string into this function"
print str
return
# 이제 printme 함수 호출
printme(str="My string")
위 코드를 실행하면 다음 결과가 생성됩니다.
My string
다음 예제가 더 명확한 그림을 줍니다. 매개 변수 순서가 중요하지 않음에 유의하세요.
Live Demo
#!/usr/bin/python
# 함수 정의
def printinfo(name, age):
"This prints a passed info into this function"
print "Name: ", name
print "Age ", age
return
# 이제 printinfo 함수 호출
printinfo(age=50, name="miki")
위 코드를 실행하면 다음 결과가 생성됩니다.
Name: miki
Age 50
기본 인수
기본 인수는 함수 호출에서 해당 인수에 대한 값이 제공되지 않으면 기본값을 가정하는 인수입니다. 다음 예제는 기본 인수에 대한 아이디어를 주며, 전달되지 않으면 기본 나이를 출력합니다.
Live Demo
#!/usr/bin/python
# 함수 정의
def printinfo(name, age=35):
"This prints a passed info into this function"
print "Name: ", name
print "Age ", age
return
# 이제 printinfo 함수 호출
printinfo(age=50, name="miki")
printinfo(name="miki")
위 코드를 실행하면 다음 결과가 생성됩니다.
Name: miki
Age 50
Name: miki
Age 35
가변 길이 인수
함수 정의 시 지정한 것보다 더 많은 인수로 함수를 처리해야 할 수 있습니다. 이러한 인수를 가변 길이(variable-length) 인수라고 하며, 필수 및 기본 인수와 달리 함수 정의에서 이름이 지정되지 않습니다.
키워드 없는 가변 인수를 가진 함수 구문은 다음과 같습니다.
def functionname([formal_args,] *var_args_tuple):
"function_docstring"
function_suite
return [expression]
모든 비키워드 가변 인수의 값을 담을 변수 이름 앞에 별표(*)를 붙입니다. 함수 호출 시 추가 인수가 지정되지 않으면 이 튜플은 비어 있습니다. 간단한 예제는 다음과 같습니다.
Live Demo
#!/usr/bin/python
# 함수 정의
def printinfo(arg1, *vartuple):
"This prints a variable passed arguments"
print "Output is: "
print arg1
for var in vartuple:
print var
return
# 이제 printinfo 함수 호출
printinfo(10)
printinfo(70, 60, 50)
위 코드를 실행하면 다음 결과가 생성됩니다.
Output is: 10
Output is: 70 60 50
익명(Anonymous) 함수
이 함수들은 표준 방식인 def 키워드를 사용하여 선언되지 않기 때문에 익명 함수라고 합니다. lambda 키워드를 사용하여 작은 익명 함수를 생성할 수 있습니다.
람다 형태는 임의의 개수 인수를 받을 수 있지만 표현식 형태의 단일 값만 반환합니다. 명령문이나 다중 표현식을 포함할 수 없습니다.
람다 함수는 표현식을 요구하므로 print를 직접 호출할 수 없습니다.
람다 함수는 자체 로컬 네임스페이스를 가지며 매개 변수 목록과 전역 네임스페이스의 변수 외에는 접근할 수 없습니다.
람다가 함수의 한 줄 버전처럼 보이지만, C/C++의 인라인 문과 동등하지 않습니다. 인라인 문의 목적은 호출 시 함수 스택 할당을 우회하여 성능을 위한 것이기 때문입니다.
구문
lambda 함수의 구문은 다음과 같은 단일 문장만 포함합니다.
lambda [arg1 [,arg2,.....argn]]: expression
lambda 함수 형태가 어떻게 작동하는지 보여주는 예제입니다.
Live Demo
#!/usr/bin/python
# 함수 정의
sum = lambda arg1, arg2: arg1 + arg2
# 이제 sum을 함수처럼 호출
print "Value of total: ", sum(10, 20)
print "Value of total: ", sum(20, 20)
위 코드를 실행하면 다음 결과가 생성됩니다.
Value of total: 30
Value of total: 40
return 문
문장 return [표현식]은 함수를 종료하며, 선택적으로 표현식을 호출자에게 반환합니다. 인수 없는 return 문은 return None과 동일합니다.
위 모든 예제는 값을 반환하지 않습니다. 함수에서 값을 반환하는 방법은 다음과 같습니다.
Live Demo
#!/usr/bin/python
# 함수 정의
def sum(arg1, arg2):
# 두 매개 변수 더하여 반환
total = arg1 + arg2
print "Inside the function: ", total
return total
# 이제 sum 함수 호출
total = sum(10, 20)
print "Outside the function: ", total
위 코드를 실행하면 다음 결과가 생성됩니다.
Inside the function: 30
Outside the function: 30
변수 범위
프로그램의 모든 변수가 프로그램의 모든 위치에서 접근 가능한 것은 아닙니다. 이는 변수를 어디에 선언했는지에 따라 달라집니다.
변수의 범위(scope)는 프로그램에서 특정 식별자에 접근할 수 있는 부분을 결정합니다. 파이썬에는 두 가지 기본 변수 범위가 있습니다.
- 전역 변수(Global variables)
- 지역 변수(Local variables)
전역 vs 지역 변수
함수 본문 내부에서 정의된 변수는 지역 범위를 가지며, 외부에서 정의된 변수는 전역 범위를 가집니다.
이는 지역 변수는 선언된 함수 내부에서만 접근 가능하고, 전역 변수는 프로그램 본문 전체에서 모든 함수로부터 접근 가능함을 의미합니다. 함수를 호출하면 그 안에 선언된 변수들이 범위 내로 들어옵니다. 간단한 예제는 다음과 같습니다.
Live Demo
#!/usr/bin/python
total = 0 # 이는 전역 변수
# 함수 정의
def sum(arg1, arg2):
# 두 매개 변수 더하여 반환
total = arg1 + arg2 # 여기서는 total이 지역 변수
print "Inside the function local total: ", total
return total
# 이제 sum 함수 호출
sum(10, 20)
print "Outside the function global total: ", total
위 코드를 실행하면 다음 결과가 생성됩니다.
Inside the function local total: 30
Outside the function global total: 0