매개변수와 인수의 차이점은 무엇일까요?
더하기 함수를 만든다고 하면, 아주 간단하게 다음과 같이 만들수 있을 것입니다.
def add(num1,num2):
result=num1+num2
return result
ex=add(10,20)
print(ex)
#실행결과 30이 출력됩니다.
여기서 함수명은 add이고 매개변수와 인수는 다음과 같습니다.
인수는 함수를 호출할 때 함수에 전달하는 입력값.
매개변수는 함수에 입력으로 전달된 값을 받는 변수.
함수를 정의하고 input값으로 받을 매개변수가 4개 라고 해봅시다.
def foo(num1, num2, num3, num4):
result= (num1+num2)+(num3*num4)
return result
ex=test_func(1,2,3,4)
print(ex)
인수가 1,2,3,4가 있으면 함수의 매개변수에 input값으로 들어갈때는 순서대로 들어갑니다.
1 -> num1
2 -> num2
3 -> num3
4 -> num4
그래서 함수안에서 연산은 (1+2)+(34)이 되고 리턴값으로는 15가 나옵니다.
만약에 인수의 순서가 3,4,1,2 라고 하면,
3 -> num1
4 -> num2
1 -> num3
2 -> num4
순서대로 함수의 매개변수에 들어가고 함수안에서 연산은 (3+4)+(12)가 되어 리턴값은 9가 됩니다.
이렇게 위치에 맞게 인수값이 매개변수 값으로 들어가게 됩니다.
위의 예에서 인수를 4개 였지만 인수의 개수가 몇개 일지 모를경우에는, 즉 인수가 가변 인수일 경우에는 함수의 매개변수를 가변매개 변수로 씁니다.
가변 매개 변수는def 함수이름(*매개변수이름)
으로 사용합니다.
가변 매개변수를 사용할때는 변수명은 관습상 *args 로 사용합니다
def foo(*args):
result=0
for i in args:
result+=i
return result
ex=foo(1,2,3,4,5,6,7,8,9,10)
print(ex)
#실행결과 55 나옵니다.
인수의 개수가 총 10개 였지만 가변 매개변수를 사용하면 100개를 넣어도 상관없습니다.
다음과 같이 사용하면 결과값이 튜플입니다.
def foo(*args):
return args
ex=foo('김규영', '서한선', 'BestFriend')
print(ex)
#실행결과 ('김규영', '서한선', 'BestFriend')
가변 인수는 순서가 중요합니다. 일반 매개변수, *arg 순서대로 사용해야 합니다.
def foo(relations,*args):
print(relations,args)
ex=foo('BestFriends', '김규영', '서한선')
#실행결과 BestFriends ('김규영', '서한선')
만약에 순서를 바꿔서 *arg, 일반 매개변수 순서로 사용할 경우
def foo(*args, relations):
print(relations,args)
ex=foo('BestFriends', '김규영', '서한선')
*arg를 어디까지 적용할지 알수 없기에 실행이 안되고 다음과 같은 에러문구가 뜹니다.
TypeError: test_func() missing 1 required keyword-only argument: 'relations'
위치 인수의 경우에는 순서가 중요했습니다. 키워드 인수의 경우에는 인수들의 순서가 중요하지 않습니다.
def foo(num1, num2, num3, num4):
result= (num1+num2)+(num3*num4)
return result
ex=foo(num1=1, num3=3, num4=4, num2=2)
print(ex)
#실행결과 15가 나옵니다.
매개변수명=인수
이렇게 키워드를 지정해주면 순서에 관계없이 키워드와 매칭되어 들어갑니다.
키워드 인수 방식으로 매개변수값을 전달할때의 장점
1) 키워드 인수는 매개변수이름에 맞춰서 값을 함수에 전달하기에 위치가 바뀌어도 괜찮고,
실수로 함수에 잘못 전달하는 실수를 사전에 예방할수 있다.
2) 키워드를 사용하기에 어떤값을 함수의 매개변수로 넘기는지 명확하게 알수 있어서 가독성이 높아진다.
이럴 경우에는 위치인수를 키워드 인수 앞에 사용합니다.
def foo(num1, num2, num3, num4):
result= (num1+num2)+(num3*num4)
return result
ex=foo(1, 2, num4=4,num3=3)
print(ex)
#실행결과 15가 나옵니다.
만약에 위치인수보다 키워드 인수가 먼저 나오면, 키워드 인수는 인수가 맞는 키워드에 들어가겠지만 위치인수는 자신이 매개변수 어디에 들어가야 할지 모르게 됩니다.
def foo(num1, num2, num3, num4):
result= (num1+num2)+(num3*num4)
return result
ex=foo(1,num4=4,num3=3,2)
print(ex)
이럴때 발생하는 에러는
SyntaxError: positional argument follows keyword argument
입니다.
가변 키워드 인수는 다음과 같이 사용한다. def 함수명(**kwargs)
꼭 매개변수 명을 kwargs로 써야하는것은 아니지만 관습상 kwargs를 쓴다.
def foo(**kwargs):
print(kwargs)
foo(name="Kim", age="30")
#실행결과 {'name': 'Kim', 'age': '30'}
**kwargs
를 사용하면 출력값이 딕셔너리로 나옵니다.
*args
와 **kwargs
를 함께 사용할 경우, 순서가 중요합니다.
def foo(a, b, *args, **kwargs):
print(a, b, args, kwargs)
foo(3, 6, 9, 12, x=15, name="Kim")
#실행결과 3 6 (9, 12) {'x': 15, 'name': 'Kim'}
*args
가 **kwargs
앞에 나와야 합니다.
만약에 **kwargs
가 *args
앞에 나오게 되면, 에러가 발생하게 됩니다.
def foo(a, b, **kwargs, *args):
print(a, b, args, kwargs)
foo(3, 6, 9, 12, x=15, name="Kim")
이럴때 발생하는 에러는
SyntaxError: invalid syntax
입니다.
한짤 요약
Q1 위치 인수(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)
Q2 가변 키워드 인수 (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")
Q3 위치 인수와 키워드 가변 키워드 인수 (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")
A1
#확인된 에러
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'
#수정한 코드
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
A2
#확인된 에러
SyntaxError: invalid syntax
#수정한 코드
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
A3
#확인된 에러
SyntaxError: invalid syntax
#수정한 코드
def mixed_params(age, address,name="아이유", *args, **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, "seoul", "정우성", "01012341234", "male", mobile="01012341234")
#실행결과
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul