함수 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.)