본문 바로가기
개발일기/PYTHON [codecademy]

*args와 **kwargs (1) (Function Arguments) [Intermediate]

by 르네팜 2022. 8. 14.

이전 두 글에서 *arg와 **kwargs 사용법을 알아보았다. 게시글을 확인하고 싶으면 아래 링크로 들어가서 찬찬히 읽어보도록 하자.

2022.08.14 - [개발일기/PYTHON [codecademy]] - *args (Function Arguments)

2022.08.14 - [개발일기/PYTHON [codecademy]] - **kwargs (Function Arguments)

 

*args와 **kwargs 둘 다 무한한 수의 인자를 받을 수 있는 편리한 애들이다. 그렇다면 이 둘을 함께 사용해서 함수를 만들 수는 없을까?


이번 글에서는 두 가지를 모두 사용하여 함수를 만들어 볼 거다.

 

def print_animals(animal1, animal2, *args, animal4, **kwargs):
  print(animal1, animal2)
  print(args)
  print(animal4)
  print(kwargs)
  
 print_animals('Snake', 'Fish', 'Guinea Pig', 'Owl', animal4='Cat', animal5='Dog')
 
#output:
Snake Fish 
#첫 번째 입력값이 그대로 animal1에 저장
('Guinea Pig', 'Owl') 
#두 번째 입력값은 animal2에 저장되고, animal4로 지정된 'Cat'전까지의 입력값이 *arg에 저장
Cat
{'animal5': 'Dog'} 
#입력한 animal5(key)='Dog'(value)가 dict 형태로 저장

 

animal1과 animal2는 위치 지정 인자이므로 괄호 안 animal1과 animal2의 위치에 있던 'Snake'와 'Fish'가 각각 animal1과 animal2에 저장되었다. 그다음은 *arg, animal4 순서로 입력이 되었기 때문에 *arg가 지정되는 범위를 정확히 설정해줘야 한다. 따라서 animal4='Cat'으로 stop지점을 설정했고, animal2 위치 이후부터 'Cat'이전까지가 *arg의 값으로 저장되었다. 맨 마지막에 **kwargs는 key와 value를 모두 입력해서 dict형태로 저장되도록 했다.

 

 

정리

*args 와 **kwargs는 함께 쓸 수도 있음

**kwargs는 모든 positional arguments의 뒤에 와야 함 (무조건 맨 뒤로 빼자)

*arg는 지정된 위치 안에 있는 모든 입력값을 저장함

 


연습문제

#Checkpoint 1-2
def single_prix_fixe_order(appetizer, *entrees, sides, **dessert_scoops):
  print(appetizer)
  print(entrees)
  print(sides)
  print(dessert_scoops)

#Checkpoint 3
single_prix_fixe_order('Baby Beets', 'Salmon', 'Scallops', sides='Mashed Potatoes', scoop1='Vanilla', scoop2='Cookies and Cream')

 

output:

Baby Beets
('Salmon', 'Scallops')
Mashed Potatoes
{'scoop1': 'Vanilla', 'scoop2': 'Cookies and Cream'}

 

댓글