함수 Parameter와 Argument

이번에는 Python의 함수 Parameter와 Argument에 대해 작성 해 보고자 한다
Parameter와 Argument는 뭘까?
Parameter는 함수가 받는 변수 - 매개변수
Argument는 함수에 실제로 들어가는 값 - 인자
def add(a, b): # 함수가 받는 변수 a, b가 Parameter
return a + b
add(1, 2) # a, b자리에 들어간 숫자 1, 2가 Argument
함수 Parameter에서의 arguments 처리 순서
함수가 argument를 받을 때의 처리 순서를 아래에서 확인해 보자
- Regular Positional Arguments
순서대로 넣으면 되지만 순서를 다르게 넣는다면 잘못된 출력이 될 수 있음
- Default Arguments
함수를 호출할 때 인자의 값을 설정하지 않아도 기본값이 할당되도록 할 수 있음
- Variable Length Positional Arguments (
*args)변수의 개수를 동적으로 받아 올 수 있으며 입력된 값을
tuple로 받아온다 - Keyword-Only Arguments
Non-Default Keyword-Only Arguments (Default값이 없고 Keyword와 함께 호출되어야 함)와Keyword-Only Arguments With Defaults (Default값이 있어서 Keyword가 호출되지 않아도 Error가 발생하지 않음)가 있다
위치 기반으로는 전달될 수 없고 키워드로만 전달 가능하다! - Variable Length Keyword Arguments (
**kwargs)*args와 기능은 비슷하지만 값을dictionary로 받아온다

아래 몇 가지 의문점, 예제를 통해 좀 더 확실하게 이해해 보자!
예시 몇 가지
1. Default 값이 있는 parameter를 Default값이 없는 parameter앞에 정의하면 안되는 이유가 뭘까? 단순히 순서를 그렇게 해야하기 때문일까?
아래의 예시를 확인해보자!
def time(hour = 3, minite, second):
print(hour, minite, second)
time(5, 21)
# SyntaxError: non-default argument follows default argument
Default값이 있는parameter가 있다면arguments를parameter보다 적게 적어서 호출하게 되는데 위의 경우를 보면5가hour에 들어가야할지minite에 들어가야 할 지 선택할 수 있지 않기 때문에 에러가 발생한다!def time(hour = 3, minite = 21, second): print(hour, minite, second) time(59)이런 경우에도 마찬가지로
59가 어느parameter에 들어가야 할 지interpreter가 선택할 수 없어SyntaxError가 발생한다!
올바른 순서로 수정 된 아래 예시를 보자!
def time(hour, minite , second = 59):
print(hour, minite, second)
time(5, 21)
위 코드처럼 해줘야
arguments들이 순서대로parameter에 들어가고 그 뒤의Default값이 있는parameter는 따로argument를 주지 않아도 자동으로 출력된다!
argument개수를 최소한Default값이 없는parameter개수 이상으로 줘야 함수를 호출해도 모든parameter에 값이 할당되어 있기 때문에 에러가 없다!
2. Positional Arguments와 Variable Length 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)
# func_param_with_var_args() missing 1 required keyword-only argument: 'age'
age를Regular Positional Argument로 간주하고parameter의age위치를*args앞으로, 호출 부분에서의20을"01012341234"의 앞으로 옮긴다면 해결이 가능하다!
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
에러가 발생한 예시 -
func_param_with_var_args() missing 1 required keyword-only argument: 'age'- 대로 해결하려면age를keyword-only argument로 간주하여parameter순서를 변경하지 않고age = 20와 같이 값을 줘서 호출해도 정상적으로 출력 가능하다!
3. Variable Length Keyword Arguments의 위치
아래 예시를 보자!
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
**kwargs는Variable Length Keyword Arguments기 때문에 함수를 정의할 때 제일 마지막parameter에 있지 않아서 오류가 난다.
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", address="seoul", mobile="01012341234")
# name=정우성
# age=20
# kwargs={'mobile': '01012341234'}
# address=seoul
parameter순서를 바꿔주니 정상적으로 출력된다!
4. Positional Arguments 와 variable length keyword arguments의 위치
아래 마지막 예시를 확인해보자!
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
상단의 처리 순서를 확인하고 이 코드를 확인해보면 무언가 잘못 된 부분들을 확인할 수 있다!
일단 첫 번째로 보이는 것은
name='아이유'부분인데 함수 호출부분에20이 가장 앞에 있고Default Arguments가 가장 앞에 올 수 없으므로age를 맨 앞으로 이동해 봤다!
def mixed_params(age, name="아이유", *args, **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
수정을 진행했는데도 에러가 발생하는 이유는 3번 예시에서 해결 해 봤듯이
**kwargs가 가장 뒤 쪽에 있어야 하는데 현재Keyword-Only Argument보다 앞 쪽에 있기 때문에 동일한 에러가 발생한 것이다!
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
최종적으로 수정을 해 줬더니 출력이 정상적으로 되는 것을 확인 할 수 있었다!
ref.
https://naon.me/posts/til18
https://getkt.com/blog/python-keyword-only-arguments/
https://livetodaykono.tistory.com/18
https://www.python.org/dev/peps/pep-3102/
https://elvanov.com/304
Author And Source
이 문제에 관하여(함수 Parameter와 Argument), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ambitiouskyle/함수-Parameter와-Argument저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)