- 내장함수 : 기본적으로 제공하는 함수
- 모듈의 함수 : import 해서 갖다가 쓸 수 있는 함수
- 사용자정의함수 : 직접 함수를 만들어 사용하는 함수
- 인자와 return은 있어도 되고 없어도 됨.
def 함수이름(인자1, ...):
실행할 명령1
실행할 명령2
return 결과
def 함수이름(인자1, ...):
실행할 명령1
실행할 명령2
return 결과1, 결과2, ...
unpacking
def addMulti(num1, num2):
return num1 + num2, num1 * num2
addMulti(1, 2)
my_add, my_mul = addMulti(1,2)
my_add
my_mul
- 리스트나 튜플같이 index가 존재하는 객체를 *를 붙여 인자로써 함수에 입력하면 함수의 정의된 위치에 맞게 입력됨.
number_list = [1,2,3]
def reNum(num1,num2,num3):
return num3,num2, num1
reNum(*number_list)
- 함수에 설정된 파라미터 갯수와 넘겨주는 인자의 갯수가 다르면 오류 발생
list1 = [1,2]
list2 = [1,2,3,4]
def reNum(num1,num2,num3):
return num3,num2, num1
reNum(*list1)
reNum(*list2)
keyword arguments
- 해당 방식으로 파라미터를 전달하면 실제 파라미터 순서가 변경되어도 괜찮음.
- positional arguments 부분은 순서를 지켜줘야 함.
def introduce(arg1, arg2) :
print(f"Hello, My name is {arg1}. I like {arg2} color.")
introduce(arg2="yellow", arg1="John")
introduce("John", arg2="yellow")
introduce(arg2="yellow", "John")
Default value
- 파라미터에 값을 전달하지 않아도 default 값이 있어, default값으로 전달됨.
def introduce(arg1, arg2="yellow") :
print(f"Hello, My name is {arg1}. I like {arg2} color.")
introduce("John")
- default parameter는 non-default parameter보다 앞에 있으면 안 됨.
함수를 실행할 때 첫번째 인자의 위치 먼저 파악하기 때문에 default parameter가 non-default parameter가 먼저 정의될 경우 전달해준 인자가 첫번째 인자의 위치로 들어가고 두번째 인자가 전달되지 않는 것으로 나오기 때문.
def introduce(arg2="yellow", arg1) :
print(f"Hello, My name is {arg1}. I like {arg2} color.")
introduce("John")
- default value는 함수가 실행될 때가 아닌 정의된 함수가 처음 실행될 때임.
import time
print(time.ctime())
print(time.ctime())
def show_time(now=time.ctime()):
print(now)
show_time()
show_time()
keyword variable length of arguments / **kwargs
- parameter가 몇개가 들어갈지 모를 경우 사용
- 해당 파라미터는 dictionary형태로 들어감
def alphabet(**kwargs):
for key in kwargs:
print(f"{key} : {kwargs[key]}")
alphabet(a='apple', b='banana')
Non-keyworded variable length of arguments / *args
def alphabet(*args):
print(args)
for key in args:
print(key)
alphabet('a','b','c')
중첩함수 nested function
- 함수 안에 자식함수를 정의
- 자식함수를 호출하려면 부모함수에서 호출해야함. 부모함수 밖에서 호출 불가.
- 사용이유 1) 가독성 : 함수 안의 코드 중 반복되는 코드가 있다면 중첩함수를 정의하여 가독성을 높임
- 사용이유 2) closure : 외부로부터 접근은 막고 부모함수에서 선언된 변수는 사용가능하게 함
- factory를 구현할 때 사용, 설정값을 노출하지 않고 해당 설정값을 기반으로 연산이 가능하게 할 때.
Decorator
- b함수가 실행되기 전 a함수가 먼저 실행되게끔 하는 것
- 데코레이터는 강제성, 가독성을 위해 사용
- 기본적인 형태
@functionA
def functionB