본문 바로가기
기타

TIL - 22.01.27

by DGK 2022. 1. 27.

 

개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

1월 27일(목)


function parameters

keyword arguments

 

  1. 일반적으로 함수 parameter는 순서에 맞게 함수에 전달되지만, 순서 대신에 parameter 이름으로 맞춰서 값을 전달해줄 수 있으며 이를 keyword arguments 라고 한다.
  2. keyword arguments 방식으로 parameter 값을 전해주면 실제 parameter 순서가 바뀌어도 상관없다.
  3. 또한, keyword arguments 방식을 사용하면 코드의 가독성이 높아진다.

keyword arguments

 

mixing positional arguments and keyword arguments

 

  1. 이는 순서를 맞춰서 parameter 값을 전해주는 positional arguments와 keyword arguments를 섞어서 함수로 parameter를 전달하는 방식이다.
  2. 다만, 여기서 중요한 것은 keyword arguments는 순서가 바뀌어도 상관 없지만, positional arguments 부분은 순서를 지켜줘야 한다는 것이다.

mixing positional arguments and keyword arguments

 

parameter default value

 

  1. 함수의 parameter에 default 값을 정의해 줄 수도 있다.
  2. default 값이 정의된 parameter는 함수가 호출될 때 parameter 값이 넘겨지지 않아도 자동으로 default 값이 넘겨지게 된다.
  3. 다만, 주의할 점은 default 값이 정의된 parameter가 default 값이 정의되지 않은 parameter 보다 먼저 위치해 있으면 안된다는 것이다.
  4. 만일, default value parameter를 non-default value parameter 앞에 선언하면 systax error가 발생한다.

parameter default value

 

 

function parameter errors

error case(1)

def love_you(my_name = "정우성", your_name): 
    print(f"{my_name} loves {your_name}") 
   
   
'''
출력 :
> Traceback (most recent call last):   
    File "python", line 1 
SyntaxError: non-default argument follows default argument

'''

 

함수를 정의할 때, default value parameter는 반드시 non-default value parameter 보다 뒤에 위치해야 한다.

이는 파이썬이 function parameter에서 arguments를 처리하는 순서와 연관이 있다.

즉, parameter를 무작위로 생성할 경우 함수는 어떤 parameter에 어떤 argument를 넘겨줘야할지 정할 수 없기 때문에 에러가 발생하는 것이다.

 

단, 파이썬3 이상부터는 ' * '를 사용하면 해당 문제를 해결할 수 있다. [아래 예시 참고]

 

(참고)

파이썬이 function parameters에서 arguments를 처리하는 순서는 다음과 같다.

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

 

(코드 수정-1)

def love_you(your_name, my_name = "정우성",): 
    print(f"{my_name} loves {your_name}")
    
love_you('kim')

# 출력 : 정우성 loves kim

 

(코드 수정-2 : 파이썬 3이상부터 적용가능)

def love_you(my_name = "정우성", *, your_name): 
    print(f"{my_name} loves {your_name}")
    
love_you(your_name='kim')

# 출력 : 정우성 loves kim

 

error case(2)

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'

 

parameter ' *args '가 "정우성"을 제외한 모든 arguments를 넘겨받았기 때문에, parameter ' age '는 어떠한 argument도 받지 못해서 에러가 발생한 것이다.

 

(코드 수정-1 : 함수 재정의)

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

'''

 

(코드 수정-2 : 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

'''

 

error case(3)

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 ' **kwargs '가 parameter ' address ' 보다 먼저나왔기 때문에, 해당 에러가 발생하는 것이다.

(위의 "파이썬 function parameters의 arguments 처리 순서" 참고할 것)

 

(코드 수정)

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

'''

 

함수호출 단계에서 argument ' mobile '이 argument ' address ' 보다 먼저 나왔지만, argument ' address '에 키워드를 정해줬기 때문에 순서에 상관없이 제자리를 찾아갔다.

 

error case(4)

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가 default - variable length - positional - variable length keyword - keyword-only 순으로 배열되었기 때문에 에러가 발생한 것이다.

 

(코드 수정)

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

'''

 

따라서, parameter를 positional - default - variable length - keyword-only - variable length keyword 순으로 재배열하면 더 이상 에러를 발생시키지 않는다. 

 

 

'기타' 카테고리의 다른 글

TIL - 22.01.29  (0) 2022.01.29
TIL - 22.01.28  (0) 2022.01.29
TIL - 22.01.26  (0) 2022.01.26
TIL - 22.01.25  (0) 2022.01.25
TIL - 22.01.24  (0) 2022.01.24

댓글