개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
1월 27일(목)
function parameters
keyword arguments
- 일반적으로 함수 parameter는 순서에 맞게 함수에 전달되지만, 순서 대신에 parameter 이름으로 맞춰서 값을 전달해줄 수 있으며 이를 keyword arguments 라고 한다.
- keyword arguments 방식으로 parameter 값을 전해주면 실제 parameter 순서가 바뀌어도 상관없다.
- 또한, keyword arguments 방식을 사용하면 코드의 가독성이 높아진다.
mixing positional arguments and keyword arguments
- 이는 순서를 맞춰서 parameter 값을 전해주는 positional arguments와 keyword arguments를 섞어서 함수로 parameter를 전달하는 방식이다.
- 다만, 여기서 중요한 것은 keyword arguments는 순서가 바뀌어도 상관 없지만, positional arguments 부분은 순서를 지켜줘야 한다는 것이다.
parameter default value
- 함수의 parameter에 default 값을 정의해 줄 수도 있다.
- default 값이 정의된 parameter는 함수가 호출될 때 parameter 값이 넘겨지지 않아도 자동으로 default 값이 넘겨지게 된다.
- 다만, 주의할 점은 default 값이 정의된 parameter가 default 값이 정의되지 않은 parameter 보다 먼저 위치해 있으면 안된다는 것이다.
- 만일, default value parameter를 non-default value parameter 앞에 선언하면 systax error가 발생한다.
function parameter errors
error case(1)
def love_you(my_name = "정우성", your_name):
print(f"{my_name} loves {your_name}")
'''
출력 :
> Traceback (most recent call last):
File "python", line 1
SyntaxError: non-default argument follows default argument
'''
함수를 정의할 때, default value parameter는 반드시 non-default value parameter 보다 뒤에 위치해야 한다.
이는 파이썬이 function parameter에서 arguments를 처리하는 순서와 연관이 있다.
즉, parameter를 무작위로 생성할 경우 함수는 어떤 parameter에 어떤 argument를 넘겨줘야할지 정할 수 없기 때문에 에러가 발생하는 것이다.
단, 파이썬3 이상부터는 ' * '를 사용하면 해당 문제를 해결할 수 있다. [아래 예시 참고]
(참고)
파이썬이 function parameters에서 arguments를 처리하는 순서는 다음과 같다.
- positional(non-default) arguments
- default arguments
- variable length positional arguments(*args)
- keyword-only arguments -> non-default keyword-only arguments -> default keyword-only arguments
- variable length keyword arguments(**kwargs)
(코드 수정-1)
def love_you(your_name, my_name = "정우성",):
print(f"{my_name} loves {your_name}")
love_you('kim')
# 출력 : 정우성 loves kim
(코드 수정-2 : 파이썬 3이상부터 적용가능)
def love_you(my_name = "정우성", *, your_name):
print(f"{my_name} loves {your_name}")
love_you(your_name='kim')
# 출력 : 정우성 loves kim
error case(2)
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'
parameter ' *args '가 "정우성"을 제외한 모든 arguments를 넘겨받았기 때문에, parameter ' age '는 어떠한 argument도 받지 못해서 에러가 발생한 것이다.
(코드 수정-1 : 함수 재정의)
def func_param_with_var_args(name, age, *args):
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
'''
(코드 수정-2 : argument 성질 재정의)
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", age=20)
'''
출력 :
name=정우성
args=('01012341234', 'seoul')
age=20
'''
error case(3)
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")
# 출력 : SyntaxError: invalid syntax
parameter ' **kwargs '가 parameter ' address ' 보다 먼저나왔기 때문에, 해당 에러가 발생하는 것이다.
(위의 "파이썬 function parameters의 arguments 처리 순서" 참고할 것)
(코드 수정)
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
'''
함수호출 단계에서 argument ' mobile '이 argument ' address ' 보다 먼저 나왔지만, argument ' address '에 키워드를 정해줬기 때문에 순서에 상관없이 제자리를 찾아갔다.
error case(4)
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")
# 출력 : SyntaxError: invalid syntax
함수를 정의할 때, parameter가 default - variable length - positional - variable length keyword - keyword-only 순으로 배열되었기 때문에 에러가 발생한 것이다.
(코드 수정)
def mixed_params(age, name="아이유", *args, 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(20, "정우성", "01012341234", "male" ,mobile="01012341234", address="seoul")
'''
출력 :
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
'''
따라서, parameter를 positional - default - variable length - keyword-only - variable length keyword 순으로 재배열하면 더 이상 에러를 발생시키지 않는다.
'기타' 카테고리의 다른 글
TIL - 22.01.29 (0) | 2022.01.29 |
---|---|
TIL - 22.01.28 (0) | 2022.01.29 |
TIL - 22.01.26 (0) | 2022.01.26 |
TIL - 22.01.25 (0) | 2022.01.25 |
TIL - 22.01.24 (0) | 2022.01.24 |
댓글