TIL DAY 4 - 2 || Python Function Parameters

TK·2021년 2월 18일
1

TIL

목록 보기
5/55

default value parameter

  • default value parameter는 함수가 호출될때 Parameter에 인자를 받아야만 한다.

non-default value parameter

non-default value parameter는 함수가 호출될때 Parameter에
1. 인자를 받아 넘겨줄 수도 있고,
2. 인자를 넘겨주지 않아도 keywordname = value 형식으로 선언되어 있기 때문에 value 를 넘겨줄 수 있다.

mixed up parameters

default value parameter 와 non-default value parameter 가 혼합되서 사용되는 경우

default value parameter 앞에 non-default value parameter 를 정의하면 안된다.

def love_you(my_name = "정우성", your_name): 
    print("{} loves {}".format(my_name, your_name)) 
    
    love_you("아이유")

다음과 같이 작성 후 실행하면 이런 에러가 뜬다.

SyntaxError: non-default argument follows default argument

왜냐하면

  • love_you() 의 첫 번째 인자로 받은 "아이유""정우성" 으로 값이 설정되어있던 my_name 의 value 를 업데이트 하지만,
  • 두 번째 positional argument 인 your_name 은 아무 값도 넘겨받지 못하기 때문이다.

Positional / Variable length arguments

위치인수와 가변인수의 순서는 다음과 같이 정해져있는 규칙을 따라야한다.

다음 get_parameters() 함수를 호출하여 파라미터를 넘길 때 우리가 name 의 값을 디폴트로 주고, address 는 항상 키워드 인자로 넘긴다고 가정해보자.

그렇다면 해당 함수 파라미터의 올바른 순서는 다음과 같다.

def get_parameters(age, name="default", *args, address=0, **kwargs):
	pass

그렇다면 호출은 어떻게 해야할까?

get_parameters(20, 'hi', 'there', mobile="01012345678", address="seoul")

# 함수 호출 시 address="seoul" 의 위치는 키워드 가변인자의 앞 또는 뒤에 넣어줘야 한다.

arguments 의 우선순위 :

  1. positional(non-default) arguments
  2. default arguments
  3. variable length positional arguments (*arg)
  4. keyword-only arguments
  5. variable length keyword arguments (**kwargs)

파라미터 순서에 따른 오류 예시들

오류 예시 1:

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'

*args 파라미터가 name 다음에 오는 인자들을 다 받아버리기 때문에 age 까지 인자가 도달하지 않는다.

따라서 다음과 같이 age*args 순서를 바꿔야 한다.

	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("정우성", "01012341234", "seoul", 20)

출력 결과는 다음과 같다.

name=정우성
args=('seoul', 20)
age=01012341234

오류 예시 2:

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 가 발생한다.

regular parameter after ** parameter

address="seoul" default value 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")

키워드 가변인수 앞으로 keyword-only argument 를 옮겼더니, 출력이 성공적으로 됐다.

name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

오류 예시 3:

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

위의 코드 결과가 에러가 뜨는 이유는 문법이 틀렸기 때문이다.

  • 우선 keyword-only argument는 keword 가변인수 앞으로 와야하고,
  • regular positional argument(non-default), 즉 일반 위치인수가 맨 앞으로 와야하기 때문이다.

다시 정리해보자

  1. positional(non-default) arguments: age
  2. default arguments: name="아이유"
  3. variable length positional arguments: *arg
  4. keyword-only arguments: address
  5. variable length keyword arguments: **kwargs
  • 1번은 논 디폴트 위치인수 age
  • 2번은 디폴트 값이 정해져 있는 디폴트 인수 name="아이유"
  • 3번은 가변위치인수 *args
  • 4번은 keyword-only arguent address, 이 부분이 가장 헷갈렸는데 왜냐하면 1번 age 과 모양이 같았기 때문이다.
    하지만 자세히 보면 실제로 함수를 호출할 때 파라미터로 넘기는 값은 address="seoul" 이기 때문에 age 파라미터로 넘기는 값 20 과는 다르다.
  • 5번은 키워드 가변인수 **kwargs

위 우선순위를 적용해서 코드를 다시 작성해보았다.

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

0개의 댓글