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

*args (Function Arguments)

by 르네팜 2022. 8. 14.

*arg  : variable number of arguments

* = unpacking operator

*은 말 그대로 언팩을 해주는, 그러니까 주어진 리스트나 튜플 등을 풀어헤쳐주는 애다.

*arg가 이름이지만 arg대신에 어떤  변수이름을 써도 상관없다. 언팩킹을 하기 위해 * 만 앞에 붙여주면 된다.

 

*arg는 함수에 가변인자를 넣을 때 사용한다. 이게 무슨 말이냐?

함수의 인자를 몇 개 받을지 정해지지 않은 경우에 사용한다. 상황에 따라서 들어갈 인자의 수가 다를 때, 인자의 수가 확실하지 않을 때 등을 생각하면 된다. parameter(매개변수)가 *arg면 들어가는 인자 수가 몇이든지 상관없이 함수를 쓸 수 있다.

 

 

*arg를 사용하는 간단한 함수를 예시로 만들어보자:

def my_function(*args):
  print(args)

 

그리고 이 함수를 무작위 인자를 사용해서 호출해보자:

my_function('Arg1', 245, False)

 

output:

('Arg1', 245, False)

 

인자의 종류나 개수에 상관없이 전부 다 인자로 입력된다. 그렇기에 리스트[]나 사전{} 튜플()등으로 묶어줄 필요가 전혀 없다. 그냥 쓰고 싶은 인자를 , 로 이어 주기만 하면 된다.

 

 

*arg에 for loop(for 반복문)을 사용할 수도 있다.

def shout_strings(*args):
  for argument in args:
    print(argument.upper())
 
shout_strings('Working on', 'learning', 'argument unpacking!')

 

output:

WORKING ON
LEARNING
ARGUMENT UNPACKING!

 

for loop 만 *arg를 사용할 수 있느냐? 당연히 그건 아니다.

for loop외에도 다른 iterator 또한 *arg를 사용해서 각 element(객체)를 꺼내 쓸 수 있다.

 

물론 함수에 여러 변수를 사용하면서 그중 한 변수에 *arg를 사용할 수도 있다.

def truncate_sentences(length, *sentences):
  for sentence in sentences:
    print(sentence[:length])
 
truncate_sentences(8, "What's going on here", "Looks like we've been cut off")

 output:

What's g
Looks li

 

 

연습문제 

tables = {
  1: {
    'name': 'Jiho',
    'vip_status': False,
    'order': 'Orange Juice, Apple Juice'
  },
  2: {},
  3: {},
  4: {},
  5: {},
  6: {},
  7: {},
}

def assign_table(table_number, name, vip_status=False): 
  tables[table_number]['name'] = name
  tables[table_number]['vip_status'] = vip_status
  #'order'는 매개변수에 없기 때문에 'order'변수를 새로 만들어주고 비워둔다
  tables[table_number]['order'] = ''

def assign_and_print_order(table_number, *order_items):
  tables[table_number]['order'] = order_items
  for item in order_items:
    print(item)

assign_table(2, 'Arwa', True)
#위치 지정 매개 변수인 table_number를 입력한 후, order item을 전부 써주면 된다. 이때 묶어줄 필요 없음
assign_and_print_order(2, 'Steak', 'Seabass', 'Wine Bottle')
print(tables)

 

댓글