[Python] Function Parameters

박광수·2022년 3월 5일
0

Function Parameters

  • 함수란 입력변수를 받아서 어떤 결과값을 받는 일련의 과정을 정의한 것이다.

  • 이 때 입력값이 어떤 변수에 해당하는지를 지정하기 위해 Function Parameter를 활용하게 된다. 아래에서 num1, num2가 이에 해당한다.

def f1(num1, num2):
	return f"첫 번째 숫자는 {num1}, 두 번째 숫자는 {num2}입니다."
  • 이렇게 정의한 함수를 가지고 이용하여 실제 함숫값을 return 하려면 parameter에 값을 부여하게 된다.

positional argument & keyword argument

  • positional argument : 위치에 의해서 주어진 값이 어떤 parameter의 값인지 결정됨. 아래의 경우 5가 num1의 위치, 3이 num2의 위치에 있기에 자연스럽게 해당 parameter에 값이 부여된다.
print(f1(5,3))

출력값: "첫 번째 숫자는 5, 두 번째 숫자는 3입니다."

  • keyword argument : parameter를 구체적으로 명시하여 값을 부여하는 경우. 이 경우 위치에 관계없이 명시한 parameter에 값이 부여됨
print(f1(num2=5,num1=3))

출력값: "첫 번째 숫자는 3, 두 번째 숫자는 5입니다."

  • Mixing positional & keyword argument
    positional, keyword argument를 함께 사용 하는 것도 가능. 예를 들면,
print(f1(4,num2=1))

출력값: "첫 번째 숫자는 4, 두 번째 숫자는 1입니다."

  • 이 경우 주의할 점은 keyword argument가 positional argument보다 앞에 나오면 Error가 뜬다는 점. Keyword argument를 통해 위치가 다른 parameter에 값을 부여해버리면 그 자리에 해당하는 positional argument가 받을 값이 없어지기 때문이다.
print(f1(num2=1,4))

SyntaxError: positional argument follows keyword argument
num2=1이 num1이 정의됐던 위치에 있어서 num1을 positional argument로 값을 부여할 수 없기 때문이다.

default value

  • 함수를 정의할 때 default값을 정의해놓으면 함수를 호출할 때 해당 parameter의 값이 주어지지 않을 때 자동으로 default값을 받는다.
def f2(num1, num2=55):
	return f"첫 번째 숫자는 {num1}, 두 번째 숫자는 {num2}입니다."
print(f2(1,3))
print(f2(22))

출력값:
"첫 번째 숫자는 1, 두 번째 숫자는 3입니다."
"첫 번째 숫자는 22, 두 번째 숫자는 55입니다."

  • 역시 주의할 점이 있는데 default value는 non-default value보다 앞에 나오면 Error가 발생한다.
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 뒤에 오는 에러 (위에서 설명) 이 있다.

*args, **kwargs의 위치

  • *args는 positional argument 보다 앞에 나올 수 없다.
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

Exercise

다음 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")
  • Error 1: **kwargs 가 가장 뒤에 있지 않다.
  • Error 2: positional argument인 age가 *args 뒤에 있다.
  • Error 3: default vaule argument인 name이 non-default value인 age 앞에 있다.
  • 참고: address는 keyword only argument 이기 때문에 *args 뒤에 있어도 상관없다.

이를 참고하여 수정하면 다음과 같다.

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
profile
박광수입니다.

0개의 댓글

관련 채용 정보