wecode Day3. 파이썬 함수파라미터 에 대해 알아보기

.·2020년 4월 22일
0

Coding

목록 보기
3/33

함수 파라미터에는 Positional Arguments와 Keyword Arguments 두 가지 방식이 있다.

1. Positional Arguments

Positional Arguments는 가장 기본적인 함수의 파라미터 형태로, 말 그대로 위치에 따라 인자가 함수 내부식에 대입되고 함수 호출시 파라미터 값 순서대로 입력하여 호출한다.

def personal_info(name, age, food) :
  print(f"""
  이름 : {name}
  나이 : {age}
  좋아하는음식 : {food}
  """)
  
>>> personal_info("mimi", 19, "hamburger")

  이름 : mimi
  나이 : 19
  좋아하는음식 : hamburger

### 단점 : 순서를 잘못 입력하면 아래와 같이 엉터리로 원하는 결과값과는 다르게 나온다.
>>> personal_info("pikachu", "apple", 5)

  이름 : pikachu
  나이 : apple
  좋아하는음식 : 5

인자의 수가 적을 때는 모르겠지만, 수가 무척이나 많아져 각 위치에 들어갈 값을 잘못 입력하면 원하는 값을 얻지 못할 수 있다.
이런 경우를 방지하기 위해서 다음에 설명할 Keyword Arguments 형태를 사용하라고 한다.

2. Keyword Arguments (키워드 인자)

def personal_info(name, age, food) :
  print(f"""
  이름 : {name}
  나이 : {age}
  좋아하는음식 : {food}
  """)

### 이거!! 함수 호출시 파라미터 이름과 값을 쌍으로 넣어 주기만 하면 기존 함수의 정의 순서
대로 잘 나오게 된다. 어쨋든 함수 선언 내에서 print 로 찍어나올 순서는 거기서 정해지니까)
>>> personal_info(age=20, food="마멀레이드", name="Ted")

  이름 : Ted
  나이 : 20
  좋아하는음식 : 마멀레이드

입력 순서와는 관계없이 (함수선언시 입력한 파라미터순서대로가 아닌) parameter 이름으로 맞추어서 값을 전달하는 방식이다.

Keyword Arguments는 순서가 아니라 각 인자에 대입된 값을 함수 호출 시 함수 내에 전달해 준다. 순서를 기억할 필요가 없다.

◎키워드 인자 Keyword Arguments 는 파라미터 이름과 값의 쌍으로 이루어져 있다고 이해하면 쉬울까요?

3. Positional Arguments와 Keyword Arguments의 혼합

두 가지 형태의 인자를 혼합하여 함수 호출에 사용할 수 있다.
하지만 맨 처음 설명한 함수 호출 시 위치 인자를 입력하는 부분에서는 반드시 괄호 내에서 순서를 지켜서 써줘야 한다!
아무튼 이렇게 두가지 형태의 인자를 혼용해서 쓰면 위치 인자에는 함수 호출할 때 반드시 순서를 지켜줘야 한다는 거다. 키워드 인자가 나오는 순간부터 순서를 알 수 없게 되어버리기 떄문이다.

>>> personal_info(age = 20, "Ted", food="마멀레이드")
SyntaxError: positional argument follows keyword argument

### "Ted" 는 파라미터 이름이 name 인 위치 인자이다. 앞서 함수 선언시 이름이 name 인 인자는 
맨 앞에 튀어나와야 하므로 보기와 같이 오류가 발생했다.

하나 확실한 사실은 키워드 인자가 나오는 순간부터 파라미터 간의 순서를 파악하기가 어려워진다는 것이다.

아래의 두 가지 형태의 인자가 올바르게 혼합되어 함수 호출된 예시를 보자.

>>> personal_info("Ted", age = 20, food="마멀레이드")

  이름 : Ted
  나이 : 20
  좋아하는음식 : 마멀레이드

◎위치 인자가 키워드 인자 앞에 항상 위치 해야 한다는 말은 참인가요? 거짓일까요?

4. 파라미터의 default 값 설정

함수를 정의할 때 각 파라미터의 디폴트 값을 지정해 놓을 수도 있다.

함수 정의 시 파라미터 옆에 값을 지정해 주어서 미리 값을 정의 해 놓는 것.

언제? 1번. 해당 인자에 넣을 값을 모르겠거나, 2번. 넣을 값이 없을 경우에 이제 함수가 반환될 때 기존에 설정한 디폴트 값이 대신 노출되게 하는 것을 뜻한다.

이렇게 그 해당되는 파라미터를 빼고서 함수를 호출하면 기존에 설정한 디폴트 값이 노출된다.

아래 예시와 같이 기존에 함수를 정의할 때 넣어둔 매개변수의 수 만큼 인자를 입력하지 않으면, 인자가 더 필요하다는 에러 메시지가 나타나게 된다.

함수에 정의된 인자 food 를 뺐을 때, 아래와 같은 에러 메시지를 확인할 수 있다.

>>> personal_info("Ted", age = 20)
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    personal_info("Ted", age = 20)
TypeError: personal_info() missing 1 required positional argument: 'food'

반면에 함수를 아래와 같이 food에 default 값을 주고 재정의한 후, food인자 없이 함수를 호출하면 기존에 설정한 default 값이 노출되는 것을 확인할 수 있다.

>>> def personal_info(name, age, food="모르겠음") :
  print(f"""
  이름 : {name}
  나이 : {age}
  좋아하는음식 : {food}
  """)

  
>>> personal_info("애플이", 8)

  이름 : 애플이
  나이 : 8
  좋아하는음식 : 모르겠음  ### 오오 여기 default 값이 노출되어 있다.

이렇게 default 값을 정의할 때도 주의할 점이 있는데 그것은 함수를 정의할 때 default 값 파라미터를 non-default 값 파라미터 앞에 선언하면 안된다는 점 이다.
아래와 같이 default 값 파라미터를 앞에 선언하면, SyntaxError가 뜨면서 함수가 선언되지 않게 만들어 버린다.

def personal_info(name, age="잘모르겠음", food) :
  print(f"""
  이름 : {name}
  나이 : {age}
  좋아하는음식 : {food}
  """)
### non-디폴트 값 파라미터인 food 앞에 default 값을 정의한 파라미터인 age 가 앞에 
나왔더니 아래처럼 에러 문구가 나온다.
  
SyntaxError: non-default argument follows default argument

왜냐하면 default 값 파라미터가 앞에 선언되어 버리면, 이후에 함수를 호출할 때 입력한 특정 인자가 어떤 파라미터에 대입되는지 알 수 없기 때문이다. default 값 파라미터 자체가 입력이 될 수도, 안될 수도 있는 값이기 때문에, 정확히 원하는 값을 반환하는데 어려움이 있다.

profile
.

0개의 댓글