Today I Learnt Function Parameter

Jiwon Jung·2020년 12월 20일
0

T.I.L

목록 보기
5/10
post-thumbnail

Parameter

매개 변수라는 뜻으로 변수의 특별한 종류로서, 함수와 같은 서브루틴에 인풋되는 변수이다. 또한 그 파라미터 안에 입력되는 값을 argument라 부른다.

a=1
b=2
def multiply(x,y):
	z=x*y
    return(z)
    
multiply(a,b)

윗 함수 선언에서 파라미터는 x,y이며 argument는 a,b이다.

argument의 종류

argument를 직접 지정할 수 있다.

이처럼 지정을 하면 parameter의 순서가 바뀌어도 지정 argument가 입력된다. parameter의 지정 순서에 따라 입력하는 argument를 positional arguments라 하며 직접 지정해주는 것을 keyword arguments라 한다

또한 이처럼 positional argument와 keyword argument를 섞어서 사용할 수가 있다. 여기서 keyword argument는 순서가 바뀌어도 상관없지만, positional argument는 순서를 지켜 주어야한다.

Default Value Parameter

함수 파라미터 기본값을 부여 해준다.

이처럼 2번째 parameter의 기본값을 주어 1번째 parameter만 입력하여도 2번째 파라미터의 기본값이 출력이 된다..

여기서 주의점은 default parameter가 정의 되지 않은 parameter 앞으로 올수가 없어 error가 발생한다.

parameter는 함수가 구동 되어지고 나서 기본값을 부여하기 때문이다. 만약 default 값이 주어진 parameter에 인수를 제공하면 그 인수가 출력된다. 입력값이 없을시에 기본값이 출력 된다. 그러기에 첫번째 파라미터를 default 처리하고 두번째를 position parameter를 설정한 후 인수를 1개만 부여하면 default 파라미터에 부여되어지며 두번째 파라미터는 공백이 된다. 이러한 error를 방지하기 위함으로 본다.

Variable Lenght Arguments 가변 인수

Variable Lenght Argument(가변 인수, 줄여서 arg)는 즉 받아 드리는 값이 단일이 아닌 복수의 인수를 받아 드리는 형태를 말한다. 이때는 복수의 입력값을 튜플 형태로 출력을 한다. 선언은 파라미터 앞 를 붙인다.
예를 들어

👨‍💻입력
def example(a,*b):👨‍💻🙏
	print(a)
    print(b)

example(1,2,3,4,5,6,7,8)
🙏결과
>1
>(2, 3, 4, 5, 6, 7, 8)

처럼 나올 것이다. b는 가변인수로, a는 순서상 첫번째인 '1'만 이수로 가져가고 나머지는 가변 인수인 b가 모두 가져간 것이다.
아마 여기서 눈치를 챗다면 가변 인수는 당연히 위치 인수와 키보드 인수보다 앞에 올수 없다.

가변 인수 중에서도 Variable Keyword Argument(가변 키원드 인수 줄여서 kargs)가 있다. 말 그대로 *args 중에도 지정되지 않은 키워드 인수들을 모두 들고 간다. 이 역시 파라미터 앞 를 붙여 선언 가능하다.

👨‍💻입력
def example(a,**b):
	print(a)
    print(b)

example(1,c=2,d=3,e=4)
🙏결과
>1
>{'c': 2, 'd': 3, 'e': 4}

**vargs 역시 순서가 뒷 쪽에 위치 해야한다.

여기꺼지 우리는 파라미터와 인수들의 순서가 중요하다는 것을 보았다. 그렇다면 모든 것을 종합적으로 사용한 mixed arguments 유형에서는 어떻게 순서를 정하면 될까?
밑 예시들을 통해 알아보고자 한다.

parameters and 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)

아래 함수는 syntax error가 납니다. 먼저 앞서 배운 내용을 통해 error를 파악을 해보면 name과 age 말고는 설명되는 인수가 2개가 있다. 하지만 *args가 정상 작동하기에는 위치가 위치 인수보다 앞에 있다.

그렇다면 *args를 뒤로 이동시키고 나이 값에 해당되는 20을 age 순서에 맞게 인수의 순서를 2번째로 옮겨 보겠다.

잘 구동되는 것을 확인할 수가 있습니다. *args는 항상 위치 인수 뒤에, 그리고 위치 인수들도 해당 파라미터 순서에 맞게 잘 배치가 되야 된다.

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

이번 스크립트 같은 경우에는 vargs가 존재하는 것을 볼 수가 있다. 또한 address는 지정값을 주었다. 구동시켜보면 error가 발생한다. vargs의 자리를 마지막자리로 이동시켜서 구동시켜보면

작동이 되는 것을 볼 수가 있다. 이처럼 **vargs는 default 값보다 뒤에 위치해야한다. 또한 default값에 새로운 키워드 인수를 지정하면 적용이 된다. 아래 처럼 address의 키워드 인수를 없애면 default 값이 출력되는 것을 볼 수가 있다.

마지막으로 종합 인수 유형을 사용한 예제이다.

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

이 역시 error가 발생하는데 파악되는 이유는 두가지이다.
1. default인수의 선두 순위
2. *args와 **vargs이 위치 파라미터 보다 우선 순위


🐍
def mixed_params(age, address, name="아이유", *args, **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")

이처럼 입력하였음에도 error가 발생하는 결과값을 출력한다. 이는 파라미터를 다시 보자. 위치 기반이자 서로 대응 되는 파라미터와 인수는 age의 20과 default값이 존재하는 name의 정우성 뿐이다. 이두 변수를 앞배치하고 default는 position 뒤에 배치한다.

🐍
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

성공리 출력되었다. 여기서 전체적인 인수와 parameter의 절대적인 순위를 알수가 있다.

position ➡ default ➡ *args ➡ keyword ➡ **vargs

앞으로 수많은 파이썬 함수를 정의할 때 아마 많은 골칫거리가 될것이 벌써 부터 눈에 선하다.

하지만 함수는 프로그래밍 떠나 변수에 인수 대입이 주 용도이기 때문에 순서를 익혀서 많이 연습해보는게 좋을 듯하다. 앞으로 리스트, 튜플 등등 더 복잡한 데이터를 사용하면서 이 순서는 더 중요해질 것으로 보인다.

profile
Venire, Videre, Vincere

0개의 댓글