파이썬에서 변수가 여럿인 함수를 만들 때 사용할 수 있는 방법으로 asterisk(별표)을 사용하는 것이 있다. 변수명 앞에 asterisk를 하나 붙이면, 입력받은 변수들의 튜플을 의미한다.
매개변수 표현은 관례상 *args을 많이 사용한다(arguments)
def function(*args):
print(args)
function(1, 2, 3, 4) # (1, 2, 3, 4)를 출력한다.
Asterisk를 2개 붙인 것은 키워드 변수를 의미한다. 이때, (키 - 값)의 딕셔너리 형태가 된다. 이때, 키는 문자열(str)이 된다.
매개변수 표현은 관례상 **kwargs을 많이 사용한다(keyword arguments)
def function(**kwargs):
print(kwargs)
function(a = 1, b = 2) # {'a': 1, 'b': 2}를 출력한다.
일반 변수, 키워드 변수, asterisk를 붙인 변수, double asterisk를 붙인 변수가 모두 있다면, 키워드 > 일반 > ** 변수 > * 변수 순서로 인식된다.
def function(a, b = 0, *args, **kwargs):
print("a =", a)
print("b =", b)
print("args = ", args)
print("kwargs =", kwargs)
function(1, 2, 3, b = 4, i = 5)
a = 1
b = 4
args = (2, 3)
kwargs = {'i': 5}
함수 매개변수의 올바른 순서
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(a,b) are positional parameter
(c=none) is optional parameter
(r="w") is keyword paramete
(d=[]) is list parameter
(*ae) is keyword-only
(*ab) is var-keyword parameter
Assignment
Q:함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 이유에 대해 생각해보시고 블로깅 해주세요.
A: 디폴트 매개변수를 일반 매개변수 앞쪽에 넣으면 파이썬 인터프리터가 일반 매개변수와 디폴트 매개변수를 구분할 수 없기 때문이며 디폴트를 앞에 넣으면 구문오류가 발생한다
SyntaxError: non-default argument follows default argument
Q: 위치 인수(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)
위의 코드 실행시 오류발생
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
A: 매개변수 순서가 잘못되어 오류가 난것이고
def func_param_with_var_args(name, age, *args):
다음과 같은 순서로 매개변수를 넣으면 정상적으로 실행된다
Q:가변 키워드 인수 (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 발생
A: address=0 는 디폴트 매개변수 이기 때문에 **kwargs 앞으로 옮겨야한다
함수 수정
def func_param_with_kwargs(name, age, address=0, **kwargs):
이렇게 수정하면 다음 내용 출력됨
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul
Q: 위치 인수와 키워드 가변 키워드 인수 (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 발생
A: 매개변수 순서와 인자의 순서가 잘못돼었다
매개변수 순서 수정
def mixed_params(name="아이유", *args, age, address, **kwargs):
함수호출 인자 수정
mixed_params("정우성", "01012341234", "male", age=20,
mobile="01012341234", address="seoul")
이렇게 수정하고 호출하면 다음 내용 출력됨
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul
함수 정의만 수정할 경우
def mixed_params(age, name="아이유", *args, address, **kwargs):
매개변수 위치에 문제가 있는 경우 vs code에서 pylance를 설치하면 문제있는 부분이 빨간줄로 표시된다
참고 자료
https://getkt.com/blog/python-keyword-only-arguments/
https://velog.io/@jiffydev/TIL-3.replit3.-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%98-%ED%95%A8%EC%88%98%EC%99%80-parameter
https://codechacha.com/ko/python-default-parameters/