TIL#38 PYTHON 기초(18)

dnpxm387·2020년 8월 20일
0

python

목록 보기
29/46
post-thumbnail

parameter 간의 절대적인 우선순위

함수 내에서 사용하는 arguments의 순서

  1. positional arguments
  2. default arguments (default값이 지정된 arguments)
  3. variable length positional arguments (호출시 튜플의 형태)
  4. keyword arguments (함수를 호출할 때 값을 지정, 'a=x' 의 형태로 호출)
  5. keyword default arguments (keyword arguments에 default 값이 지정된 경우)
  6. variable length keyword arguments(딕셔너리의 형태)

default value parameter를 non-default value parameter 앞에 정의 하면 안되는 이유

default value parameter : 초기값이 정해진 매개변수(기본매개변수). 함수를 호출할 때 변경 가능하다.
non-default value parameter : 함수 호출시 무조건 인자의 값을 설정하여야 한다.

함수 호출시 default value parameter 를 non-default value parameter 보다 앞에 정의하면 다음과 같은 에러가 발생한다.

SyntaxError: non-default argument follows default argument

default 값이 정의된 parameter가 default 값이 정의 되지 않은 parameter 보다 먼저 위치해 있으면 안된다.

위치 인수(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)

# 함수 호출 결과
Traceback (most recent call last):
  File "/Users/apple/Desktop/..py", line 6, in <module>
    func_param_with_var_args("정우성", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

age 인자는 non-default keyword-only 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)의 위치를 보고 어떤에러 인지 확인하고 함수가 호출되도록 에러를 고치고 호출후에 출력되는 결과 정리

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")

# 출력 결과
  File "/Users/apple/Desktop/..py", line 8
    def func_param_with_kwargs(name, age, **kwargs, address=0):
                                                    ^
SyntaxError: invalid syntax

**kwargs 는 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=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

위치 인수와 키워드 가변 키워드 인수 (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")

# 출력 결과
  File "/Users/apple/Desktop/..py", line 17
    def mixed_params(name="아이유", *args, age, **kwargs, address):
                                                       ^
SyntaxError: invalid syntax

**kwargs 는 parameter 우선순위에 따라 제일 뒤로 가야 한다. age는 positional 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
개발자꿈나무🌲

0개의 댓글