파이썬의 함수는 def
키워드를 활용하여 시작하고, parameter(인수)를 통해 input을 받고 output을 리턴한다. 물론 인수와 리턴 값은 필수가 아니지만 반복적인 코드를 재사용해 효율적인 개발이 가능하도록 만든다.
함수에 인수를 순서대로 넣는 방식을 positional argument(위치 인수)라 한다. 여러 인수를 사용되는 경우에는 순서를 반드시 지켜주어야 한다.
# 위치인수 name과 job를 활용한 함수 position
def position (name, job):
return f"Hi, I'm {name}. I'm working as {job}."
position('John', 'teacher')
# Hi, I'm John, I'm working as teacher.
position('Mike', 'nurse')
# Hi, I'm Mike, I'm working as nurse.
keyword argument(키워드 인수)는 위치 인수와 달리 함수를 호출하는 방식에서 argument의 이름과 값을 동시에 작성하는 방식으로 전달된다.
def keyword (name, job):
return f"Hi, I'm {name}. I'm working as {job}."
# 인수를 순서가 동일
keyword(name='John', job='teacher')
# Hi, I'm John, I'm working as teacher.
# 인수의 순서가 바뀜
keyword(job='nurse', name='John')
# Hi, I'm Mike, I'm working as nurse.
결과값으로 봤을 때는 keyword 함수와 position 함수가 같다. 그렇다면 왜 키워드 인수를 사용하는 것인가. 예시로 든 함수들은 매우 간단하지만 실제 개발에서는 인수가 많아져서 함수 호출에 있어 복잡해 질 수 밖에 없다. 그러나 인수 이름과 값을 동시에 지정해 주면 순서를 지킬 필요도 없을 뿐 아니라 해당 호출이 무엇을 의미하는지 좀 더 쉽게 확인할 수 있는 장점이 있다.
키워드 인수는 순서를 지켜줘야 할 필요가 없지만 위치 인수는 반드시 순서를 지켜 사용해야 한다. 그렇기에 위치 인수와 키워드 인수를 모두 사용하기 위해서는 함수 호출에 있어 키워드 인수가 위치 인수보다 뒤에 나오고 본 순서를 지켜야 사용할 수 있다. 그렇기 때문에 인수가 여러 개인 경우, 중간에 키워드 인수를 사용한다면 뒤에도 키워드 인수를 반드시 사용해야 한다.
def keyword (name, job):
return f"Hi, I'm {name}. I'm working as {job}."
# 키워드 인수가 앞에 위치
keyword(job='teacher', 'John')
# error
# 키워드 인수가 뒤에 위치
keyword('Mike', job='teacher')
# Hi, I'm Mike, I'm working as teacher.
def keyword (name, job, city):
return f"Hi, I'm {name}. I'm working as {job} in {city}."
# 순서는 지켰으나 키워드 인수가 중간에 오는 경우
keyword('John', job='teacher', 'London')
# error
# 순서를 지키고, 키워드 인수들이 위치 인수들보다 뒤에 위치한 경우
keyword('John', job='teacher', city='London')
# Hi, I'm John, I'm working as teacher in London.
default value란 인수의 기본값을 함수를 만들 때부터 설정해 놓는 것을 의미한다. 기본값이 설정되어 있는 경우, 함수 호출 시 인수값을 입력하지 않아도 기본값을 받아 리턴값이 도출된다.
def default (name, age, city='Seoul'):
return f'name: {name}, age: {age}, city: {city}'
# 기본값 인수를 바꾸지 않은 경우
default('Taeyoung', 24)
# name: Taeyoung, age: 24, city: Seoul
# 기본값 인수를 바꾼 경우
default('Sangjin', 29, 'Busan')
# name: Sangjin, age: 29, city: Busan
def varArg (*args):
return args
# 변수 a, b, c
a = varArg(10, 7, 'j')
b= varArg('a','b')
c = varArg(1, 2, 3, 4, 5)
print(a) # (10, 7, 'j')
print(b) # ('a','b')
print(c) # (1, 2, 3, 4, 5)
type(a) # <class 'tuple'>
type(b) # <class 'tuple'>
type(c) # <class 'tuple'>
args
는 여러 인수를 튜플에 저장해 전달하는 방식으로 얼만큼의 인수를 전달할지 정하지 않고도 함수의 인수를 전달할 수 있다. 튜플로 할당된 변수 값을 다른 변수에 저장하여 여러 개의 인수를 각각 전달, 활용하는 것도 가능하다.
def ord1 (name, age, *args):
print('name: '), print(name)
print('age: '), print(age)
print('args: '), print(agrs)
def ord2 (name, *args, age):
print('name: '), print(name)
print('age: '), print(age)
print('args: '), print(agrs)
# 정상 작동
print(ord1('John', 25, 'a', 'b'))
# name: John
# age: 25
# args: ('a', 'b')
# 작동이 안됨
print(ord2('John', 25, 'a', 'b'))
*args
반드시 위치 변수보다는 뒤에 위치해야 한다. 위치 변수가 가변 인수보다 뒤에 존재 한다면 가변 인수의 특징 중에 하나인 여러 개의 인수를 포함 시켰을 때 몇 개의 인수가 포함 되었는지 알 수 없고, 위치 인수를 정확히 찾을 수 없기 때문이다.
가변 키워드 인수란 가변 인수와 키워드 인수의 특징을 합쳐 놓은 것이라 볼 수 있다. 키워드 인수와 같이 함수 호출에서 키워드와 그 값을 설정할 수 있는 동시에 가변 인수와 같이 인수의 개수를 유동적으로 변동시킬 수 있는 인수이다. 가변 인수의 경우 인수의 값이 튜플로 전달 되는 반면 가변 키워드 인수는 딕셔너리 타입으로 Key와 Value를 쌍으로 전달한다.
def varKrg (**krgs):
return krgs
# 변수 a, b, c
a = varKrg(name='John', age=27)
b= varKrg(name='Mike', age=20, city='London')
print(a) # {name: 'John', age: 27}
print(b) # {name: 'Mike', age: 20, city: 'London'}
type(a) # <class 'dict'>
type(b) # <class 'dict'>
함수 인수의 우선 순위는 위치 인수, 키워드 인수, 가변 인수, 가변 키워드 인수의 순서이며 다양한 인수 타입을 사용할 경우 순서에 유의해야 한다.
def 함수이름 (위치 인수, 키워드 인수, 가변 인수, 가변 키워드 인수):