[TIL. 21] Python -함수의 parameter

신지원·2021년 3월 21일
0

Python

목록 보기
8/14
post-thumbnail
post-custom-banner

function parameter

positional arguments

  • 함수를 호출할때 parameter을 함수에 건내주어서 호출한다.
  • 값이 순서대로 parameter로 함수에 전해진다.

Keyword Arguments


parameter값을 전해줄때 순서 대신에 parameter 이름으로 맞추어서 값을 전해 줄 수 있다.

  • 가독성이 높아진다.
  • parameter 이름에 맞추어서 값을 함수에 넘겨주기 때문에 코드를 읽는 사람도 어떠한 값을 넘겨받는지 명확하게 알 수 있기때문에 코드의 가독성이 높아진다.

Mixing positional arguments and keyword arguments


positional arguments 와 keyword arguments를 섞어서 표현 할 수도있다. 이때, keyword arguments 순서는 바뀌어도 상관 없지만, positional argument는 순서를 지켜주어야 한다.

positional default value


함수의 인자에 미리 default 값을 정의 해줄 수 있다.
이렇게 미리 정의된 인자는 함수가 호출될때 값이 넘겨지지 않아도 괜찮다.
이때, default 값이 정의된 parameter가 default 값이 정의 되지 않은 parameter 보다 먼저 위치해 있으면 안된다.

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

함수 호출을 할때 argument 순서대로 parameter로 입력 받게 되는데 default vlaue parameter가 앞쪽에 이미 입력되어 있으면 parameter를 입력받는 순서가 꼬이면서 함수가 실행되지 않는다.

Q1. 다음 코드가 오류가 나는 이유는?

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)

이 함수를 실행시키면

와 같이 오류가 뜨게 된다.

  • variable length arguments (가변 매개변수)
    원하는 만큼 인자를 받을 수 있는 함수 (튜플 형태로 저장된다.)
    에를 들어 input()은 미리 몇개의 parameter을 받을지 지정해주지도 않았는데 그 입력들을 잘 처리한다. 이와 같은 맥락.

    가변 매개변수로 쓰고 싶은 parameter에 *를 붙여준다. 단, 가변 매개변수는 하나만 사용가능하다.

따라서 *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

첫번째 오류에서 keyword-only argument인 age의 답이 없다고 한다. 따라서 이거를.. 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

Q2. 다음코드가 오류가 나는 이유는?

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

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

**kwargs의 위치를 맨 끝으로 옮겨 주면 된다.

  • variable length keyword arguments(가변 키워드 인수)는 매개변수 앞에 **와 함께 온다.
    딕셔너리를 이용해서 키워드 인수로 값을 넣어주는 것이기 때문에 **를 2개 붙여서 사용한다. 따라서 함수를 호출할때도 키워드: 값 형태로 값을 입력해야 한다.
    variable length keyword arguments는 항상 맨뒤에 와야한다.

variable length argumentsvariable length keyword arguments가 같이 올때는 variable length keyword arguments가 맨뒤에 와야하며, parameter들의 순서는 다음과 같다.

def custom_print(a, b, *args, **kwargs):

처럼 고정매개변수,*args, **kwargs 순으로 와야한다.

Q3. 다음코드가 오류가 나는 이유는?

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

위의 코드는 앞서 봤던 1,2의 혼합형이라 생각 할 수가 있다. 우선 **kwarg는 맨뒤에 위치 해야 하기 때문에 맨뒤로 옮겨주어야 한다. 그리고 positional arguments는 맨 앞으로 끌어오고 positional default value를 2번째로 위치 시켜준다.
address는 keyword-only argument이기 때문에 variable length arguments 뒤에 위치 시켜준다.

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
post-custom-banner

0개의 댓글