파이썬 함수 매개변수 - paisseon hamsu maegaebyeonsu

파이썬 공부하기

# 매개변수 지정하여 호출하기

함수를 호툴할 때 매개변수를 지정할 수도 있다.

다음 예를 보자.

>>> def add (a,b):
	return a+b

앞에서 알아본 add 함수이다. 이 함수를 다음과 같이 매개변수를 지정하여 사용할 수 있다.

-> a에 3, b에 7을 전달하기

>>> result = add(a=3, b=7)
>>> print(result)
10

매개변수를 지정하면 다음과 같이 순서에 상관없이 사용할 수 있다는 장점이 있다.

>>> result = add(b=5, a=3)
>>> print(result)
8

# 입력값이 몇 개가 될지 모를 때는 어떻게 해야 할까?

입력값이 여러 개일 때 그 입력값을 모두 더해 주는 함수를 생각해 보자.

하지만 몇 개가 입력될지 모를 때는 어떻게 해야 할까? 아마도 난감할 것이다.

파이썬은 이런 문제를 해결하기 위해 아래와 같은 방법을 제공한다. 일반적으로 볼 수 있는 함수 형태에서 괄호 안의 매개변수 부분이 *매개변수로 바뀌었다.

 def 함수이름 (*매개변수):

    수행할 문장

    ...

여러 개의 입력값을 받는 함수 만들기

다음 예를 통해 여러 개의 입력값을 모두 더하는 함수를 직접 만들어 보자. 예를 들어 add_many(1, 2)이면 3을, add_many(1, 2, 3)이면 6을, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이면 55를 돌러주는 함수를 만들어 보자.

>>> def add_many(*args):
	result = 0
	for i in args:
		result = result + i
	return result

>>> 

위에서 만든 add_many 함수는 입력값이 몇 개이든 상관이 없다. *args처럼 매개변수 이름 앞에 *을 붙이면 입력값을 전부 모아서 튜플로 만들어 주기 때문이다. 만약 add_many(1, 2, 3)처럼 이 함수를 쓰면 args는 (1, 2, 3)이 되고, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)처럼 쓰면 args는 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)이 된다. 여기에서 *args는 임의로 정한 변수 이름이다. *pey, *python처럼 아무 이름이나 써도 된다.

※ args는 매개변수를 뜻하는 영어 단어 arguments의 약자이며 관례적으로 자주 사용한다.

실제로 이 함수를 직접 실행해 보자.

>>> result = add_many(1, 2, 3)
>>> print(result)
6
>>> result = add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> print(result)
55

add_many(1, 2, 3)으로 함수를 호출하면 6을 돌려주고, add_many(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)을 대입하면 55를 돌려준다.

여러 개의 입력을 처리할 때 def add_many("args)처럼 매개변수로 *args만 사용할 수 있는 것은 아니다. 다음 예를 보자.

>>> def add_mul(choice, *args):
	if choice == "add":
		result = 0
		for i in args:
			result = result + i
	elif choice == "mul":
		result = 1
		for i in args:
			result = result * i
	return result

>>> 

add_mul 함수는 여러 개의 입력값을 의미하는 "args 매개변수 앞에 choice 매개변수가 추가되어 있다.

이 함수는 다음과 같이 사용할 수 있다.

>>> result = add_mul('add', 1,2,3,4,5)
>>> print(result)
15
>>> result = add_mul('mul',1,2,3,4,5)
>>> print(result)
120

매개변수 choice에 'add'가 입력된 경우 *args에 입력되는 모든 값을 더해서 15를 돌려주고, 'mul'이 입력된 경우 *args에 입력되는 모든 값을 곱해서 120을 돌려준다.

* 키워드 파라미터

이번에는 키워드 파라미터에 대해 알아보자. 키워드 파라미터를 사용할 때는 매개변수 앞에 별 두개(**)를 붙인다. 역시 이것도 예제로 알아보자. 먼저 다음과 같은 함수를 작성한다.

>>> def print_kwargs(**kwargs):
	print(kwargs)

	
>>> 

print_kwarge 함수는 매개변수 kwargs를 출력하는 함수이다. 이제 이 함수를 다음과 같이 사용해보자.

>>> print_kwargs(a=1)
{'a': 1}
>>> print_kwargs(name='foo', age=3)
{'name': 'foo', 'age': 3}

입력값 a=1 또는 name='foo', age=3이 모두 딕셔너리로 만들어져서 출력된다는 것을 확인할 수 있다.

즉 **kwarge처럼 매개변수 이름 앞에 **을 붙이면 매개변수 kwarge처럼 매개변수 이름 앞에 **을 붙이면 매개변수 kwargs는 딕셔너리가 되고 모든 key=value 형태의 결과값이 그 딕셔너리에 저장된다.

※ 여기에서 kwargs는 keyword arguments의 약자이며 args와 마찬가지로 관례적으로 사용한다.

파이썬으로 코드를 짜다 보면 함수를 작성해서 사용할 일이 많아진다.

함수를 짜는 방법은 쉬우니 넘어가고, 그 외에 추가적으로 알고 있으면 좋은 내용들을 메모 차 남겨본다. 내용은 아래와 같다.

  • return을 명시하지 않았을 때 기본값(default)은 None이다.
  • 함수는 인수(매개변수)는 선택적으로 받을 수 있고, 기본 값 설정이 가능하다.
  • 함수의 매개변수(parameter)가 많다면 키워드 인수(keyword arguments)를 활용하면 된다.
  • 리스트와 같은 자료형을 인수로 지정할 때는 기본값을 None으로 지정하는 것이 좋다.
  • 함수의 return으로 여러 개의 값을 반환하면, 그 값들을 쉼표로 구분하여 변수에 저장할 수 있다.
  • 함수가 입력 받을 매개변수의 개수가 정해져 있지 않을 때는 별표 1개(*)를 사용한다.
  • 별표 2개(**)를 사용하여 “키워드 인수”를 받으면 딕셔너리 형태로 그 값을 사용할 수 있다.
  • 다양한 종류의 매개변수를 입력 받기 위해서는 지정된 순서를 따른다.

주로 매개변수(parameters), 인수(arguments)에 관한 내용이다. 하나씩 살펴보자.


return을 명시하지 않았을 때 기본값(default)은 None이다.

함수를 후딱 만들어서 테스트 해보면 알 수 있다.

return 없이 그냥 문자열만 출력하는 함수를 작성해봤다. 함수의 결과 값을 변수에 담아 그 변수를 출력해보자.

def no_return():
  print("노리턴")

test = no_return()

print(test)

None이라고 출력되는 걸 볼 수 있다. (함수에서 return 뒤를 비워 놓아도 마찬가지다.)

if 조건문과 None을 잘 활용하면 일종의 예외처리 같은 걸 쉽게 할 수 있다.


함수는 인수(매개변수)는 선택적으로 받을 수 있고, 기본 값 설정이 가능하다.

함수를 정의할 때 한 개 이상의 인수를 처리하는 작업을 한다면, def 구문 끝 괄호 안에 매개변수를 설정해야 한다.

  • 용어 정리
    : 함수를 정의할 땐 매개변수(parameter, 파라미터), 실제로 사용할 땐 인수(argument)라고 칭하는 게 옳으나 대부분 용어를 명확히 구분하지 않고 쓰긴 한다.

매개변수는 ‘필수’ 또는 ‘선택’을 지정할 수 있다. ‘선택’인 경우에는 그 인수를 넣지 않았을 때 적용할 기본값을 설정하면 되기 때문이다.

예를 들면 이렇게

def test(a, b, c=False):
    return

주의할 점은 def 구문에서 ‘필수’ 매개변수를 먼저, ‘선택’적인 매개변수는 나중에 써줘야 한다는 거다. 함수를 사용할 때는 괄호 안에 적힌 순서대로 인수를 받아 처리하기 때문이다.


함수의 매개변수(parameter)가 많다면 키워드 인수(keyword arguments)를 활용하면 된다.

애초에 너무 많은 선택적 매개변수를 가진 함수가 있다면

def test(a=1, b=2, c=False, d=True):
    return

‘키워드 인수’를 활용하게 된다. 함수를 사용할 때 직접 매개변수를 명시해주는 거다.

test(a=2, d=False)

리스트와 같은 자료형을 인수로 지정할 때는 기본값을 None으로 지정하는 것이 좋다.

아래 코드를 보자. current_order라는 선택적 인수를 받는 함수다.

def update_order(new_item, current_order=[]):
    current_order.append(new_item)
    return current_order

그런데 함수의 결과로 current_order라는 값을 돌려주기 때문에, 이 값을 다른 변수에 저장하더라도 계속 current_order라는 리스트가 따라다니면서 함수를 새로 사용할 때도 계속 적용되는 문제가 있다.

그래서 함수의 인수로 리스트, 딕셔너리, 튜플과 같은 형태의 자료형을 선택적으로 받고자 한다면 기본값을 None으로 지정하는 것이 좋다. 이렇게.

def update_order(new_item, current_order=None):
    if current_order is None:
        current_order = []
    current_order.append(new_item)
    return current_order

함수의 return으로 여러 개의 값을 반환하면, 그 값들을 쉼표로 구분하여 변수에 저장할 수 있다.

아래와 같이 return 구문에서 쉼표를 사용하면 여러 값을 반환할 수 있다,

def multiple_returns(num1, num2):
    sum_nums = num1 + num2
    div_nums = num1 / num2
    return sum_nums, div_nums

함수의 결과 값을 그냥 가져오면 튜플 형태로 괄호 안에서 값들이 쉼표로 구분된다.

sum_and_div = multiple_returns(20, 10)

print(sum_and_div)
# "(30, 2)"
print(sum_and_div[0])
# "30"

물론 인덱싱을 통해 개별 값에 접근할 수도 있지만, 애초에 함수 결과 값을 변수에 저장할 때 쉼표로 구분해주면 편하다.

result_sum, result_div = sum_and_div(18, 9)

print(result_sum)
# "27"
print(result_div)
# "2"

함수가 입력 받을 매개변수의 개수가 정해져 있지 않을 때는 별표 1개(*)를 사용한다.

함수의 입력 값으로 리스트(엄밀히 말하면 튜플)을 받아 처리하는 거라 생각하면 편하다.

def shout_strings(*args):
  for argument in args:
    print(argument.upper())

shout_strings("a", "b", "c")
# "A"
# "B"
# "C"

함수 정의할 때 매개변수에 *args라고 별 하나를 사용하는 게 바로 이러한 기능을 한다.


별표 2개(**)를 사용하여 “키워드 인수”를 받으면 딕셔너리 형태로 그 값을 사용할 수 있다.

이건 무엇인고 하니… 일단 문자열 포맷, 포매팅을 생각해보자.

print("My name is {name} and I'm feeling {feeling}.".format(name="Rick", feeling="confused"))

# "My name is Rick and I'm feeling confused."

.format()을 사용하면 원하는 ‘키’에 원하는 ‘값’을 지정해줄 수 있다.

함수에서도 마찬가지다. 매개변수 앞에 별표 두 개(**)를 사용하면 딕셔너리 형태로 인수를 받아 처리한다는 뜻이다. 예시를 보자.

def create_products(**kwargs):
    for name, price in kwargs.items():
        print(name, price)

create_products(Baseball=3, Shirt=14, Guitar=70)

# "Baseball 3"
# "Shirt 14"
# "Guitar 70"

함수에서 이런 방식으로 입력 받는 인수를 **kwargs (Keywords Argument, 키워드 인수)라고 부른다.

별표 두 개를 사용하면 애초에 딕셔너리로 지정된 값들을 함수의 인수로 처리하는 기능으로도 사용할 수 있다. 이런 식으로.

def create_products(**products_dict):
    for name, price in products_dict.items():
        create_product(name, price)

test = {'Apple': 1, 'Ice Cream': 3, 'Chocolate': 5}

create_products(**test)

다양한 종류의 매개변수를 입력 받기 위해서는 지정된 순서를 따른다.

위에서 소개한 내용을 종합해보면 결국 파이썬 매개변수는 아래와 같은 순서에 따라 입력을 받아야 한다.

  • 미리 정의된 매개변수
  • 이름과 개수가 정의되어 있지 않은 매개변수 (*args) – 리스트, 튜플
  • 미리 정의된 키워드 매개변수 – 딕셔너리
  • 이름과 개수가 정의되어 있지 않은 키워드 매개변수 (*kwargs) – 딕셔너리

예를 들어 텍스트 파일 본문에서 특정 단어들은 동일한 단어로(예를 들면 빈 문자열””로) 대체 혹은 삭제하고, 특정 단어들은 각각 지정된 다른 단어로 대체하는 함수를 만든다고 하면 이렇게 써볼 수 있겠다.

def remove(filename, *args, **kwargs):
    with open(filename) as file_obj:
        text = file_obj.read()
    for arg in args:
        text = text.replace(arg, "")
    for kwarg, replacement in kwargs.items():
        text = text.replace(kwarg, replacement)
    return text

print(remove("text.txt", "generous", "gallant", fond="amused by", Robin="Mr. Robin"))

오늘 포스팅은 여기까지.

나도 파이썬 더 잘하고 싶다.