함수란 입력변수를 받아서 어떤 결과값을 받는 일련의 과정을 정의한 것이다.
이 때 입력값이 어떤 변수에 해당하는지를 지정하기 위해 Function Parameter를 활용하게 된다. 아래에서 num1, num2가 이에 해당한다.
def f1(num1, num2): return f"첫 번째 숫자는 {num1}, 두 번째 숫자는 {num2}입니다."
print(f1(5,3))
출력값: "첫 번째 숫자는 5, 두 번째 숫자는 3입니다."
print(f1(num2=5,num1=3))
출력값: "첫 번째 숫자는 3, 두 번째 숫자는 5입니다."
print(f1(4,num2=1))
출력값: "첫 번째 숫자는 4, 두 번째 숫자는 1입니다."
print(f1(num2=1,4))
SyntaxError: positional argument follows keyword argument
num2=1이 num1이 정의됐던 위치에 있어서 num1을 positional argument로 값을 부여할 수 없기 때문이다.
def f2(num1, num2=55): return f"첫 번째 숫자는 {num1}, 두 번째 숫자는 {num2}입니다." print(f2(1,3)) print(f2(22))
출력값:
"첫 번째 숫자는 1, 두 번째 숫자는 3입니다."
"첫 번째 숫자는 22, 두 번째 숫자는 55입니다."
def f3(num1=55, num2): return f"첫 번째 숫자는 {num1}, 두 번째 숫자는 {num2}입니다." print(f3(1))
SyntaxError: non-default argument follows default argument
이와 같이 1이 num1에 해당하는 값인지, num2에 해당하는 값인지 명확하지 않기 때문에 default value argument는 항상 non-default value보다 뒤에 나와야한다.
첫째로, positional argument인 age가 keyword argument인 name 뒤에 오는 에러 (위에서 설명) 이 있다.
def h1(num1, *args, num2): print(f"num1={num1}, arguments={args}, num2={num2}") h1(5, "안녕", "하세요", 10)
TypeError: h1() missing 1 required keyword-only argument: 'num2'
이 경우 *args가 "안녕", "하세요", 10까지 전부 받아버려서 num2에 입력된 값이 없는 것처럼 인식한다.
수정해보면
def h1(num1, *args, num2): print(f"num1={num1}, arguments={args}, num2={num2}") h1(5, "안녕", "하세요",10)
출력값: num1=5, arguments=('안녕', '하세요'), num2=10
**kwargs
는 가장 뒤에 위치해야한다. (그렇지 않으면 그 뒤에 parameter로 값을 지정한 것이 **kwargs
에 지정한 것과 혼돈이 될 수 있기 때문)def h1(num1, **kwargs, num2): print(f"num1={num1}, kw-arguments={kwargs}, num2={num2}") h1(5, x="안녕", y="하세요", 10)
Error: invalid syntax
def h1(num1, num2 ,**kwargs): print(f"num1={num1}, kw-arguments={kwargs}, num2={num2}") h1(5, num2=10, x="안녕", y="하세요")'
출력문:
num1=5, kw-arguments={'x': '안녕', 'y': '하세요'}, num2=10
다음 Python Code에서 발생하는 에러를 설명하고 에러가 발생하지 않도록 수정해보자.
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(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