Language/Python

Python 09 - 함수와 매개변수 with Tuple

me-theus 2024. 7. 6. 17:57
def function_name(parameter1,parameter2):
	print(f"{parameter1},{parameter2})
    
argument1 = 1
argument2 = 2

function_name(argement1,argument2)

 

함수를 정의할 때 함수의 이름과 parameter, 실행할 코드를 작성한다.

parameter(매개변수)란 함수 외부와 내부를 이어주는 통로이며 이를 구분할 수 있도록 식별자를 통해 각 통로에 이름을 정한다.

 

함수가 정의되면 ()를 이용해 함수를 호출하여 사용할 수 있다. 함수가 호출될 때 함수에 전달해 줄 객체를 argument(인자)라고 한다.

 

함수는 이렇게 매개변수를 통해서 외부의 값을 함수 내부로 가져와 사용할 수 있는데, 매개변수에는 여러 종류가 있다.

 

일반 매개변수, 가변 매개변수, 키워드 가변 매개변수, 기본 매개변수 // 위치인자, 키워드 인자로 구분된다.

 

일반 매개변수는 한 parameter가 하나의 argument를 받을 수 있다.

def function1(parameter):
	print(f"{parameter}입니다")
   
function1("hello")
hello입니다

 

 

 

가변 매개변수는 한 parameter가  여러 개의 argument를 받을 수 있다. ( parameter 앞에 * 한개로 설정 )

def function2(*arg):
	print(f"{arg}")
  
function2("hello","hi","nice")

 

이 경우에는 여러 개의 인자들이 튜플 형식으로 ("hello", "hi", "nice")와 같이 arg라는 파라미터에 전달된다.

('hello', 'hi', 'nice')

 

 

키워드 가변 매개변수는 한 parameter가 여러개의 키워드 argument를 받을 수 있다. ( parameter 앞에 ** 두개로 설정 ) 

def function3(**arg):
	print(f"{arg}")
  
function3(a="hello",b="hi",c="nice")

 

이 경우에는 여러 개의 인자들이 key와 value의 형식으로 묶여 dictionary 형식으로 arg라는 파라미터에 전달된다.

{'a': 'hello', 'b': 'hi', 'c': 'nice'}

 

기본 매개변수는 parameter가 받을 argument의 값을 미리 설정할 수 있다.

def function4(parameter="hello"):
	print(f"{parameter}는 이미 정해져 있다.")
  
function4() # 인자를 주지 않아도 실행
function4("hi") # "hello"가 아닌 "hi"가 parameter로 전달된다
hello는 이미 정해져 있다.
hi는 이미 정해져 있다.

 

한편 인자를 받는 방법에는 두가지가 있다. 하나는 위치인자, 다른 하나는 키워드 인자이다.

 

함수를 설계할 때 보통은 파라미터를 정의한 위치에 맞춰 그 위치에 인자를 넣어주는데 이것은 위치 인자 방법이다.

위와 같이 a=,b=,c=으로 인자를 받는 것을 키워드 인자라고 한다.

 

함수 내부에서 parameter에 기본 매개변수를 설정해준다면, 굳이 그 위치에 값을 넣지 않아도 함수가 실행이 잘된다. 하지만 기본 값을 바꿔서 사용할 경우에는 parameter의 위치에 맞게 인자를 넣어서 사용하면 된다. 함수의 parameter의 수가 적을 경우에는 위치 인자 방법을 이용해서 인자를 전달해주기 편하다.

 

하지만 함수가 받는 인자의 수가 많아질수록 헷갈리는 경우가 많아진다. 그럴 경우에 키워드 인자 방법을 이용해서 원하는 parameter에 원하는 인자를 전달해 줄 수 있다.

 

이와 같은 상황은 일반 매개변수를 활용해 함수를 만들 때 이야기다. 

 

여기서 가변 매개변수를 이용하여 만든 함수로 확장해보자.

def function5(*arg,**kwarg):
	print(arg)
    print(kwarg)
    
function5("hello","hi","nice", a=1,b=2,c=3,d=4)
('hello', 'hi', 'nice')
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

 

위와 같이 가변 매개변수와 키워드 가변 매개변수를 둘다 이용하면 위치인자와 키워드 인자 방식을 모두 이용할 수 있다.

 

여러 매개변수와 인자 전달 방식에 대해 알아보았다.

 

마지막으로 *에 대해서 조금만 더 살펴보자. 

 

*은 객체의 패킹을 하는 역할이다. 

def function2(*arg):
	print(f"arg : {arg}")
  
function2("hello","hi","nice")
arg : ('hello', 'hi', 'nice')

 

위와 같이 parameter앞에 *을 써주면 그 파라미터에 담기는 객체들은 모두 튜플의 형식으로 패킹된다.

 

반대로 인자를 전달해줄 때 *을 붙여주면 그 객체는 모두 언패킹되어 파라미터로 전달된다.

def function6(a,b,c,d):
    print(f"a : {a}")
    print(f"b : {b}")
    print(f"c : {c}")
    print(f"d : {d}")

function6(*[1,2,3,4])
# *[1,2,3,4]
# 1,2,3,4
# 1 -> a, 2 -> b, 3 -> c, 4 -> d
a : 1
b : 2
c : 3
d : 4

 

다만 언패킹 이용한 인자 전달의 경우 함수의 파라미터 갯수와 인자의 갯수가 일치해야한다.

 

** 키워드 인자의 패킹의 경우도 위와 비슷하다.