파이썬 - Function Parameter

코지클래식·2021년 9월 2일
0

1. Function Parameter 란?

  • 파이썬에서 함수 (또는 클래스의 메서드)에 파라미터를 인풋 할 때, 인풋할 파라미터를 의미한다.
  • 예시 코드 : arg1, arg2, args, kwargs 모두가 파라미터임.
def sample(arg1, arg2, *args, **kwargs) :
	print("arg1 : " , arg1)
	print("arg2 : "  arg2)
	for i in args :
		print("args : ", i)
	for key,value in kwargs : 
		print("kwargs//",key, " : ", value)

2. Parameter, Argument

파라미터 , 아규먼트의 차이점은
파라미터는 함수가 선언/정의 될 때 사용되는 변수명이고,
아규먼트는 함수를 실행시키기 위해 변수를 대입할 때 들어가는 값(변수) 라는 점이다.

3. 순서기본 : 위치 대응 (Positional-arguments)

- 기본개념 : 아규먼트파라미터의 순서를 따라간다. (법칙1)

→ 즉,함수에 5가지의 `파라미터`를 선언한다면, 함수 실행시 입력되는 5개의 `아규먼트`는, 실행 시 입력하는 순서(index)대로 함수에 선언된 파라미터에 할당된다.
def sample (ar1, ar2, ar3, ar4, ar5) :
	print(ar5)
	print(ar3)
	print(ar1)
	print(ar2)
	print(ar4)

sample(0,1,2,3,4) 
""" 출력 결과 :
4
2
0
1
3

4. 키워드 파라미터 : Keyword-Parameter,Argument

  • 파라미터는 함수 선언 시 디폴트 값이 입력되어 있는 상태로 사용할 수 있다.

    def sample(arg1, arg2, arg=3) :

- 다만, 이 때 디폴트 값이 있는 파라미터는, 디폴트 값이 없는 파라미터보다 뒤에 선언되어야 한다. (법칙2)

  • 아규먼트 는 함수 사용 시 특정 파라미터를 지정해서 값을 대입하도록, (파라미터 = 값) 의 형태로 사용될 수 있다.

    sample( 1, 3, arg=10 )

  • 다만 3개의 파라미터 를 선언하고, 3개의 어규먼트 를 선언한 상태에서 서로 순서가 다른 상태에서 어규먼트가 지정을 하게되면, 다음과 같은 오류가 발생한다. :: 한개의 파라미터에 여러개의 값이 입력되었습니다.

def mixed_params(age, address, name) :
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("address=",end=""), print(address)
 
mixed_params( 20, "정우성", address="seoul")

# 결과 -> 에러발생 : mixed_params() got multiple values for argument 'address'

—> 따라서, 아예 순서와 관계 없이 아규먼트를 입력하고 싶다면, 아예 모든 아규먼트를 키워드와 함께 사용하는 방법이 있을 것이다.

def mixed_params(age, address, name) :
    print("name=",end=""), print(name)
    print("age=",end=""), print(age)
    print("address=",end=""), print(address)
 
mixed_params( age=20, name="정우성", address="seoul")

#결과값
#name=정우성
#age=20
#address=seoul

5. *args, **kwargs 란?

  • 파이썬에서 얼마만큼의 파라미터가 입력될 지 모르는 상황에서 사용할 수 있는 문법이다.

    A. *args

    • 텍스트가 꼭 args가 아니어도 괜찮다. → vars, inputs, TT 등 맘대로 사용 가능.

    • *args가 함수 내에서 사용될 때의 데이터 타입은 튜플이다. (리스트에 사용되는 메서드들 사용 가능하다.)

    • 데이터가 0개가 들어올 수 도 있기 때문에 사용시 주의해야 한다.

      B. kwargs**

    • Key Word args 의 약자로, 키워드가 들어있는 아규먼트를 의미한다.

    • 역시 텍스트가 꼭 **kwargs가 아니더라도 괜찮다.

    • **kwargs가 함수 내에서 사용될 때의 데이터 타입은 딕셔너리 이다. (딕셔너리에 사용되는 메서드들 사용 가능)

    • 데이터가 0개가 들어올 수 도 있기 때문에 사용시 주의해야 한다.

      C. args, kwargs의 순서

- *args, **kwargs는 다른 변수가 선언되어 있는 파라미터 들 보다 뒤에 와야 한다. (법칙3)

6. 종합

  • 결과적으로 보면, 3가지의 법칙이 있는 것으로 보인다.

  • 아규먼트파라미터의 순서를 따라간다. (법칙1)

  • 디폴트 값이 있는 파라미터는, 디폴트 값이 없는 파라미터보다 뒤에 선언되어야 한다. (법칙2)

  • *args, **kwargs는 다른 변수가 선언되어 있는 파라미터 들 보다 뒤에 와야 한다. (법칙3)

  • 이 모든 법칙을 지키려고 하면, 함수는 선언 시 반드시 다음과 같은 순서로 파라미터를 선언해야 한다.

def sample (param1, param2, param3, *args, key1=None, key2=None, **kwargs) :
  • 어규먼트 의 순서는 위와는 다를 수 도 있을 것 같은데 기본적으로 그냥 순서대로 사용 하는것이 가장 마음 편하고 좋을 것 같다.

7. 기타

위의 내용을 안지켰을 때 발생하는 오류들

  1. got multiple values for argument : 아규먼트의 순서가 파라미터의 순서와 다른 상태에서 아규먼트에 (키워드=값) 형태를 입력했음. (법칙1)
  2. non-default argument follows default argument : 아규먼트 입력 시 (키워드=값)의 데이터가 (값)의 데이터보다 앞의 순서에 나타나 있음. -> 파라미터에 (pa1, pa2, pa3=None, *args, **kwargs) 형태로 넣어두고 아규먼트의 순서를 이에 맞추려고 할때 발생함. (법칙3)
  3. positional argument follows keyword argument : 파라미터 입력 시 (키워드=값)의 데이터가 (값)의 데이터보다 앞의 순서에 나타나 있음 (법칙2)
profile
코지베어

0개의 댓글