[Python] 함수의 parameter

Kook Han·2020년 5월 26일
0

Python

목록 보기
4/13

함수는 함수 명과 함수에 투입될 parameter 값만 호출해주면 이미 함수에 지정된 코드를 불러와 parameter을 넣고 실행시켜주는 매우 유용한 기능임.

함수의 기본적인 형태는 아래와 같음.

Positional Parameter

위 함수를 실행시키기 위해서는 함수명과 parameter 값을 함수에 지정된 parameter 순서대로 입력해야됨. 만일 love_you("아이유","정우성") 이라고 입력 할 시에는 "아이유 loves 정우성" 이라는 반대의 결과가 나오게 됨.

Keyword Arguments

만약 parameter 값을 이미 지정된 순서와 상관 없이 입력하고 싶다면 함수에 정의된 parameter들의 이름을 함수 호출시 parameter 란에 값과 같이 작성하고 이름에 값을 부여하면 됨.

이렇게 함수 parameter 이름을 값과 같이 작성해주면 순서에 상관없이 parameter 값을 입력할 수 있을 뿐만 아니라 어떤 parameter에 어떤 값을 넣었는지 한눈에 알 수 있어 코드의 가독성을 높이고 실수를 줄일 수 있는 부가적인 장점이 있음.

Mixing positional arguments and keyword arguments

특정 parameter 값만 이름과 같이 입력하고, 다른 parameter 값은 값만 입력하는 식으로 위에 소개한 두가지 방법을 혼용해서 사용할 수도 있음.

단, 이렇게 두가지 방법을 혼용할 경우 Positional Parameters (parameter 값만 입력한 부분) 들은 원래 함수에 정의된 순서를 꼭 지켜줘야 됨. Positional Parameters 는 순서가 맞다는 가정 하에 함수가 제대로 값을 불러올 수 있는 parameter이기 때문임.

Parameter Default Value (assignment 1)

아래와 같이 함수 정의 시 특정 parameter에 default 값을 지정할 수도 있음. 이런 경우 추후 함수를 불러올 때 default 값이 정의된 parameter는 공란으로 두어도 default 값을 불러오므로 이상 없이 작동할 수 있음.

이런 형식의 parameter을 사용할 때에도 주의해야될 사항이 있는데, 함수를 정의할 때 default 값이 미리 정의된 parameter는 default 값이 정의되지 않은 parameter보다 선행해서 오면 안된다는 점임. 만약 이렇게 사용할 시 syntax error가 나게 됨. 아래 예시를 참고.

함수를 불러올 때 입력된 parameter 값이 default 값을 변경하라는 뜻인지, 아니면 default값이 지정된 parameter를 건너 뛰고 다음 parameter에 값을 지정하는 것인지 알 수 없기 때문에 에러가 발생하게 되는 것임.

가변 인수 (variable length arguments) (assignment 2)

variable length arguments는 parameter가 몇개가 들어갈지 모를 때 여러 개의 parameters를 자유롭게 입력할 수 있는 유용한 기능임. 함수 정의시 *뒤에 parameter 이름을 적어주면 사용 가능함.

예시)

def add_many(*args)
	result = 0
    for i in args:
    	result = result + i
	return result
    
add_many(1,2,3,4,5)
>>> 15

위와 같이 *로 parameter 명칭을 args로 정의 한 뒤 함수 호출 시 여러 parameter를 입력해도 함수는 정상 동작함.

단, 아래와 같이 variable length argument와 positional argument를 혼용 시 variable length argument 뒤에 나오는 positional argument는 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("wecode", "01012341234", "seoul", 20)
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    func_param_with_var_args("wecode", "01012341234", "seoul", 20)
TypeError: func_param_with_var_args() missing 1 required keyword-only argument: 'age'

위 예시에서 func_param_with_var_args() missing 1 required keyword-only argument: 'age' 라는 에러가 발생했는데, 이는 variable length argument의 끝이 어디인지 파이썬이 인식하지 못해서 발생한 에러이다. 예시에 입력된 parameter중 20은 *args에 해당하는 것인지, age에 해당하는 것인지 모르기 때문에 에러가 도출 되었다는 뜻이다. 따라서 위의 에러 구문에서 안내해준 것처럼 age 부분에 들어갈 parameter 값에는 keyword argument로 입력해서 명확하게 구분을 해주면 에러가 사라진다.

>>> func_param_with_var_args("wecode", "01012341234", "seoul", age=20)
name=wecode
args=('01012341234', 'seoul')
age=20
>>> 

가변 키워드 인수 (variable length keyword arguments) (assignment 3)

위의 가변 인수와 동일하지만, 함수 호출 시 키워드와 값으로 구성된 parameter들을 입력하면 입력된 키워드와 값들을 동시에 딕셔너리 형태로 돌려준다.

예시)

>>> def print_kwargs(**kwargs):
		print(kwargs)
print_kwargs(name='taylor', age='28')

{'age': 28, 'name': 'taylor'}

단, 가변 키워드 인수를 다른 parameter 형식과 혼용하려면, 가변 키워드 인수를 맨 끝에 사용해야만 한다. 만약 순서가 아래와 같이 어긋나게 된다면 syntax error가 발생한다.

예시)

>>> 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)
	
SyntaxError: invalid syntax

아래와 같이 **kwargs를 맨 뒤로 옮기면 정상 동작한다.

>>> 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("wecode", "20", mobile="01012341234", address="seoul")
name=wecode
age=20
kwargs={'mobile': '01012341234'}
address=seoul
>>> 

parameter 간의 위치 연습 (assignment 4)

아래 예시를 통해 parameter 의 성질에 따른 위치에 대해 다시 정리함.

예시)

def mixed_params(name="wecode", *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)
    
 SyntaxError: invalid syntax

위 구문을 입력하면 Syntax Error가 발생함. 맨 뒤에 와야되는 kwargs가 address 앞에 나왔기 때문임. 따라서 kwargs를 맨 뒤로 보내면 해당 함수는 정상적으로 정의됨.

이제 정의된 함수를 아래와 같이 불러내보면 또다시 에러가 뜨게 됨.

mixed_params(20, "wecode", "01012341234", "male" ,mobile="01012341234", address="seoul")
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    mixed_params(20, "wecode", "01012341234", "male" ,mobile="01012341234", address="seoul")
TypeError: mixed_params() missing 1 required keyword-only argument: 'age'

위와 같이 에러가 뜨는 이유는 함수 호출 시 입력한 parameter 값들의 순서가 잘못되었기 때문임. 먼저 positional parameter는 정의할때 입력했던 위치와 동일해야 되므로 맨 앞에 나온 20을 네번째 자리로 옮겨야 됨. 또한 age 앞에는 *args가 위치하므로, 20만 입력하면 위에서 살펴본 예시와 같이 missing 1 required keyword-only argument 에러가 발생할 것임. 그러므로 20은 위치를 네번째로 옮기고 keyword 값도 age=20과 같이 적어준다.

mixed_params("wecode","01012341234", "male" ,age=20, mobile="01012341234", address="seoul")
name=wecode
args=('01012341234', 'male')
age=20
kwargs={'mobile': '01012341234'}
address=seoul

수정한 내용을 다시 입력하면 위와 같이 함수가 정상적으로 동작한다.

단, 위 내용을 보면 Parameter Default Value 에서 살펴보았던 내용에 위배되어 보이는 부분이 존재하는 것처럼 보인다. name="wecode"가 함수 정의 시 제일 처음에 입력이 되었는데에도 syntax error가 도출되지 않았던 부분이다. 이것은 Parameter Default Value 가 positional argument에 선행되어 올 수는 없지만 *args 앞에는 나올 수 있기 때문에 에러가 뜨지 않은 것으로 볼 수 있다. argument의 종류에 따른 순서는 아래 표를 참고.

0개의 댓글