파이썬 함수 매개변수, 인자 정리

개발자 강세영·2022년 4월 27일
0

TIL

목록 보기
5/66

파이썬 함수 매개변수 기본내용 정리

파이썬에서 변수가 여럿인 함수를 만들 때 사용할 수 있는 방법으로 asterisk(별표)을 사용하는 것이 있다. 변수명 앞에 asterisk를 하나 붙이면, 입력받은 변수들의 튜플을 의미한다.
매개변수 표현은 관례상 *args을 많이 사용한다(arguments)

def function(*args):
    print(args)

function(1, 2, 3, 4) # (1, 2, 3, 4)를 출력한다.

Asterisk를 2개 붙인 것은 키워드 변수를 의미한다. 이때, (키 - 값)의 딕셔너리 형태가 된다. 이때, 키는 문자열(str)이 된다.
매개변수 표현은 관례상 **kwargs을 많이 사용한다(keyword arguments)

def function(**kwargs):
    print(kwargs)

function(a = 1, b = 2) # {'a': 1, 'b': 2}를 출력한다.

일반 변수, 키워드 변수, asterisk를 붙인 변수, double asterisk를 붙인 변수가 모두 있다면, 키워드 > 일반 > ** 변수 > * 변수 순서로 인식된다.

def function(a, b = 0, *args, **kwargs):
    print("a =", a)
    print("b =", b)
    print("args = ", args)
    print("kwargs =", kwargs)

function(1, 2, 3, b = 4, i = 5)

a = 1
b = 4
args = (2, 3)
kwargs = {'i': 5}

함수 매개변수의 올바른 순서

  • positional parameter or non-default parameter
  • keyword parameter or default parameter
  • keyword-only parameter (*args)
  • var-keyword parameter (**kwargs)
def example(a, b, c=None, r="w" , d=[], *ae,  **ab):
(a,b) are positional parameter
(c=none) is optional parameter
(r="w") is keyword paramete
(d=[]) is list parameter
(*ae) is keyword-only
(*ab) is var-keyword parameter

Assignment
Q:함수를 정의 할때 default value parameter를 non-default value parameter 앞에 정의 하면 안 되는 이유에 대해 생각해보시고 블로깅 해주세요.

A: 디폴트 매개변수를 일반 매개변수 앞쪽에 넣으면 파이썬 인터프리터가 일반 매개변수와 디폴트 매개변수를 구분할 수 없기 때문이며 디폴트를 앞에 넣으면 구문오류가 발생한다
SyntaxError: non-default argument follows default argument

Q: 위치 인수(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)
위의 코드 실행시 오류발생 
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

A: 매개변수 순서가 잘못되어 오류가 난것이고

def func_param_with_var_args(name, age, *args):

다음과 같은 순서로 매개변수를 넣으면 정상적으로 실행된다

Q:가변 키워드 인수 (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")
위의 코드 실행시 syntaxerror 발생

A: address=0 는 디폴트 매개변수 이기 때문에 **kwargs 앞으로 옮겨야한다

함수 수정
def func_param_with_kwargs(name, age, address=0, **kwargs):
이렇게 수정하면 다음 내용 출력됨
name=정우성
age=20
kwargs={'mobile': '01012341234'}
address=seoul

Q: 위치 인수와 키워드 가변 키워드 인수 (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")
위의 코드 실행시 syntaxerror 발생

A: 매개변수 순서와 인자의 순서가 잘못돼었다

매개변수 순서 수정
def mixed_params(name="아이유", *args, age, address, **kwargs):
함수호출 인자 수정
mixed_params("정우성", "01012341234", "male", age=20,
             mobile="01012341234", address="seoul")
이렇게 수정하고 호출하면 다음 내용 출력됨
name=정우성
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

함수 정의만 수정할 경우
def mixed_params(age, name="아이유", *args, address, **kwargs):

매개변수 위치에 문제가 있는 경우 vs code에서 pylance를 설치하면 문제있는 부분이 빨간줄로 표시된다

참고 자료
https://getkt.com/blog/python-keyword-only-arguments/
https://velog.io/@jiffydev/TIL-3.replit3.-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%98-%ED%95%A8%EC%88%98%EC%99%80-parameter
https://codechacha.com/ko/python-default-parameters/

0개의 댓글