함수의 정의에서 함수가
전달 받는 값을 지칭하는 변수
def add(a,b):
return a+b
함수가 호출 될 때, 직접적으로 받는 값
print(add(1,2)) #3
parameter와 argument를 엄밀히 구분 할 수 있지만, parameter와 argument의 의미를 나누지 않고, 혼용해서쓰는 경우도 있으므로 문맥에 따라 해석 하도록 하자
함수 정의에서, parameter가 나열된 순서대로
함수 호출에 argument를 나열하면 그 순서대로 argument가 parameter 자리에 들어간다.
def sub(a,b):
return a-b
print(sub(1,2)) # -1
함수를 호출할 때, parameter의 순서대로 argument를 나열해서 호출하는 방법도 있지만, parameter 별로 argument를 지정해서 함수를 호출 할 수 있다.
def sub(a,b):
return a-b
print(sub(b=1, a=2)) #1
positional Argument와 keyword Argument를 같이 사용할 수 있다.
🩸!!주의!!🩸
keyword argument는 항상 positional argument 뒤에 있어야 한다
def add(a, b, c):
return a+b+c
print(add(1, c=1, 2))
# SyntaxError: positional argument follows keyword argument
함수 호출 시 argument를 받을 때, positional argument 만으로 argument를 받도록 강제 할 수 있다.
/ 앞에 나열된 parameter가 argument를 받을 때는, 무조건 positional argument로 전달 받아야 한다.
/뒤에 parameter는 positional/ keyword 자유롭게 선택해서 argument를 전달 받을 수 있다
def add(a,b,/,c,d):
return a+b+c+d
print(add(1,2,c=3,d=4)) #10
print(add(1,b=2,c=3,d=4))
#TypeError: add() got some positional-only arguments passed as keyword arguments: 'b'
def add1(a,b,c,d,/):
return a+b+c+d
print(add1(1,2,3,4)) #10
print(add1(1,2,3,d=4))
#TypeError: add1() got some positional-only arguments passed as keyword arguments: 'd'
함수 호출 시 argument를 받을 때, keyword
argument 만으로 argument를 받도록 강제 할 수 있다.
* 뒤에 나열된 parameter가 argument를 받을 때는, 무조건 keyword argument로 전달 받아야 한다.
* 앞에 parameter는 positional/ keyword 자유롭게 선택해서 argument를 전달 받을 수 있다
def add(a, b,*,c,d):
return a+b+c
print(add(1, c=1, 2))
# SyntaxError: positional argument follows keyword argument
정의에서 미리 parameter의 기본값을 설정해 줄 수 있다. 만약 기본값을 설정해준 parameter에 argument가 전달 되지 않는다면, 그 argument에 설정해 둔 기본값이 전달 된 것으로 간주한다.
def add(a,b=1):
return a+b
add(3) #4
add(3,2) #5
parameter에 미리 기본값을 설정해주지 않은 parameter들은 다 non-default value parameter이다.
🩸!!주의!!🩸
default value parameter는 항상 non-default value parameter 뒤에 있어야 한다
def add(a=1,b):
return a+b
#SyntaxError: non-default argument follows default argument
add(2)
default value parameter가 non-default value parameter 보다 먼저 나열되었다. 그렇게 되면
함수가 호출 되었을 때, 받은 argument가 어떤 parameter에 전달된 argument인지 알 수 없게 되는 문제가 발생 한다.
예시에서 add함수에 argument 2가 전달되었는데, 그것이 a에 전달된 argument인지,b에 전달된 argument인지 알 수 없다.
variable length positional arguments는 함수가 받을 인자의 수가 일정치 않을 때, 유용하다.
함수를 정의 할때, parameter 이름에 *를 추가하면 Variable length keyword argument(vlka)가 된다.
def add(a,b,*arg):
result=a+b
for element in arg:
result+=element
print(a,b)
print(arg)
print(result)
return result
add(1, 2, 3, 4, 5)
# 1,2
# (3, 4, 5)
# 15
주어진 arguments에서 a,b에 전달될 1,2를 제외한 나머지 arguments는 모두 *arg에 tuple로 넘겨 진다.
variable length keyword arguments는 함수가 받을 인자의 수가 일정치 않고, parameter에 나열하지 않은 keyword를 전달 받는데 유용하다.
함수를 정의 할때, parameter 이름에 **를 추가하면 Variable length keyword argument(vlka)가 된다.
def introduce(name, age, **kwarg):
print("Hi! My name is "+name)
print("I'm "+str(age))
for key, value in kwarg.items():
print(key+":"+value)
print('\n')
print(kwarg)
introduce('jake', 20, job='traveler',
Phone='01012345678',
hobby='singing',
favoriteFood='pizza')
'''
Hi! My name is jake
I'm 20
job:traveler
Phone:01012345678
hobby:singing
favoriteFood:pizza
{'job': 'traveler',
'Phone': '01012345678',
'hobby': 'singing',
'favoriteFood': 'pizza'}
'''
주어진 arguments에서 name,age에 전달될 jake, 20를 제외한
나머지 arguments는 모두 *arg에 dictionary로 넘겨 진다.
- Positional Argument (non-default)
- Default Argument
- Variable Length Positional Arguments
- Non-default Keyword-Only Arguments
- Keyword-Only Arguments With Defaults
- Variable Length Keyword Arguments
앞서 보았듯이
기본적으로
Positional Arguments가 Keyword Arguments를 앞서고, Positional / Keyword Arguments 각각에서
non-default Parameter가 default를 앞선 순서로 나열 된다.
마지막으로
variable length positional / keyword arguments들은 positional / keyword arguments 중에 마지막으로 나열된다.
def func_param_with_var_args(name, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", "01012341234", "seoul", 20)
#TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
variable length position arguments인 arg는
position arguments에 가장 마지막에 배치됌으로
age는 keyword-only argument로 호출되어야 한다. 혹은 positional argument로 호출 하기 위해 자리를 args 앞쪽으로 배치해야 한다.
func_param_with_var_args("정우성", "01012341234", "seoul", age=20)
'''
name=정우성
args=('01012341234', 'seoul')
age=20
'''
def func_param_with_var_args(name,age, *args, age):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
func_param_with_var_args("정우성", 20, "01012341234", "seoul")
'''
name=정우성
args=('01012341234', 'seoul')
age=20
'''
def func_param_with_kwargs(name, age, **kwargs, address=0):
print("name=",end=""), print(name)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
'''
def func_param_with_kwargs(name, age, **kwargs, address=0):
^
#SyntaxError: invalid syntax
'''
def func_param_with_kwargs(name, age, address=0, **kwargs):
print("name=", end=""), print(name)
print("age=", end=""), print(age)
print("kwargs=", end=""), print(kwargs)
print("address=", end=""), print(address)
func_param_with_kwargs("정우성", "20", mobile="01012341234", address="seoul")
'''
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
'''
def mixed_params(name="아이유", *args, age, **kwargs, address):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
mixed_params(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
'''
def mixed_params(name="아이유", *args, age, **kwargs, address):
^
SyntaxError: invalid syntax
'''
앞선 예시처럼 함수를 정의할 때, **kwargs가 가장 마지막에 위치해야 하고, keyword only argument인 age가 positional argument 뒤에 배치되어 keword argument로 호출 되어야 한다.
def mixed_params(name="아이유", *args, age, address, **kwargs):
print("name=",end=""), print(name)
print("args=",end=""), print(args)
print("age=",end=""), print(age)
print("kwargs=",end=""), print(kwargs)
print("address=",end=""), print(address)
mixed_params("정우성", "01012341234", "male" ,age=20, mobile="01012341234", address="seoul")
'''
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
'''