TIL-023 | Python_Function Parameters

Lee, Chankyu·2021년 10월 8일
0
post-thumbnail
post-custom-banner

Function Parameters

  • 함수의 기본 구조는 아래와 같다.
def name(last_name, first_name):
    print(f"{last_name}{first_name}")

name("홍", "길동") # 홍길동
  • input parameter를 받아서 output을 리턴하게 된다. 이 경우 parameter는 last_name, first_name 이다.
    last_name 파라미터에 "홍", first_name parameter에 "길동"이 들어가게 되어 함수가 실행된다.

Positional Arguments & Keyword Arguments

  • 위의 기본구조에서 볼 수 있듯이 parameter의 순서대로 값을 전달해 주는 것은 Positional Argument 라고 한다.
  • 아래와 같이 argument를 parameter의 순서대로 전해주는 것이 아닌 parameter의 이름으로 맞추어서 값을 전달하는 것을 Keyword Argument 라고 한다.
def name(last_name, first_name):
    print(f"{last_name}{first_name}")

name(first_name = "길동", last_name = "홍")
  • positional arguments와 keyword arguments는 함께 사용하는 것 또한 가능하다. 그러나 여기에는 지켜야 할 규칙이 있다.
def name(last_name, first_name):
    print(f"{last_name}{first_name}")

name(first_name = "길동", "홍") # SyntaxError: positional argument follows keyword argument
  • keyword arguments가 앞에 나오고 positional arguments가 나오게되면 위와 같이 SyntaxError: positional argument follows keyword argument 라는 에러가 뜨게 된다.

Parameter Default Value

  • 함수의 parameter에 default 값을 지정해주는 것도 가능하다. 이 경우 함수 호출시 argument를 전달해 주지 않아도 되고 default 값이 자동으로 함수로 넘겨지게 된다.
def name(last_name, first_name="길동"):
    print(f"{last_name}{first_name}")

name("홍") # 홍길동
  • 하지만 여기에도 규칙이 있다.

👉 함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 이유

def name(last_name = "길동", first_name):
    print(f"{last_name}{first_name}")

name("홍") #SyntaxError: non-default argument follows default argument
  • 파이썬 함수의 parameter에는 우선순위가 있는데, positional arguments가 default arguments보다 높은 순위에 위치한다. 파이썬에서는 이 우선순위를 따라주지 않으면 에러가 발생한다.
    parameter의 우선순위는 다음과 같다.
    1. Regular Positional Arguments
    2. Default Arguments
    3. Variable Length Positional Arguments
    4. Non-Default Keyword-Only Arguments
    5. Keyword-Only Arguments
    6. Keyword-Only Arguments With Defaults
    7. Variable Length Keyword Arguments

✅ 지금까지 공부한 내용과 parameter 우선순위를 고려하여 에러가 발생할 수 있는 몇 가지 경우의 수와 해결책을 알아보도록 하자.


👉 위치 인수(positional arguments)와 가변 인수(variable length arguments)의 위치에 따른 output 값

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'
  • 에러 메시지를 통해 age 값이 전달되지 않은 것으로 확인 할 수 있다. parameter 우선 순위를 고려하여 두 가지 방법으로 해결해 보도록 하겠다.
# parameter의 순서 변경하기 
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

# age 값으로 전달하고 싶은 인자 값(20)을 keyword argument로 전달하기
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", age=20)
# name=정우성
# args=('01012341234', 'seoul')
# age=20

👉 가변 키워드 인수 (variable length keyword arguments)의 위치에 따른 output 값

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
  • parameter의 우선순위를 보면 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", mobile="01012341234", address="seoul")
# name=정우성
# args=('01012341234', 'seoul')
# age=20

👉 위치 인수와 키워드 가변 키워드 인수 (variable length keyword arguments)의 위치에 따른 output 값

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
  • parameter에 positional, default, variable length positonal, keyword-only, variable length keyword argument 들이 복합적으로 포함되어 있는 케이스 이다.
    위의 경우들 보다 좀 더 복잡하긴 하지만 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
profile
Backend Developer - "Growth itself contains the germ of happiness"
post-custom-banner

0개의 댓글