[Python] 함수(2): 매개변수, 인수, 반환

#3 매개변수와 인수

매개변수

매개변수는 함수의 외부에서 내부로 객체의 참조를 전달한다.

def repeat_print(message, count):
    """메세지를 주어진 횟수만큼 반복 출력"""
    for i in range(count):
        print(message)

repeat_print("안녕", 3)

인수

인수는 함수 실행시 함수 내부로 실제로 전달되는 대상이다. 인수는 위치인수와 키워드 인수가 있다.

위치인수는 매개변수의 순서와 대응해서 들어간다.

def repeat_print(message, count):
    """message를 count번 출력"""

    for _ in range(count):
        print(message)

repeat_print(3, "안녕")  # 오류 발생

키워드 인수는 지정된 매개변수의 자리에 들어간다.

def repeat_print(message, count):
    """message를 count번 출력"""

    for _ in range(count):
        print(message)

# 키워드 인수를 사용하면
# 매개변수가 정의된 순서와 인수를 넣어주는 순서가 달라도
# 오류가 발생하지 않아요
repeat_print(count=3, message="안녕")

함수 정의 시 매개변수 기본값도 정의할 수 있다.

def repeat_print(message="안녕", count=1):
    """message를 count번 출력"""

    for _ in range(count):
        print(message)

repeat_print()

매개변수 중에 기본값이 없는 매개변수가 함수 정의 시 왼쪽에 배치되어야 한다.

def repeat_print(message, count=1):
    """message를 count번 출력"""

    for _ in range(count):
        print(message)

repeat_print(3)

#4 덕타이핑과 타이프 힌팅

파이썬에서는 함수의 매개변수의 사용과 관련하여 인수의 자료형을 고려하지 않고 일단 넣어서 작동하게끔한다. 다만 실행 중에 원하지 않는 오류가 발생할 수 있으므로 함수의 매개변수와 관련하여 타이프 힌팅이 가능하다.

def repeat_print(message: str = "안녕", count: int = 1) -> None:
    """message를 count번 출력"""

    for _ in range(count):
        print(message)

repeat_print(3)

#5 가변인수

함수 정의시 매개변수의 형식

인수의 개수가 변할 수 있다. 이를 가변인수라고 한다. 가변인수의 경우 컨테이너에 넣어서 인수로 전달할 수 있다.

def print_many(*arguments):

    print(type(arguments))

    print(arguments)

print_many(1, 2, 3, 4, 5)

매개변수 앞에 *를 붙이면 가변인수를 튜플로 받는다. 다만, 가변인수들을 튜플 형식으로 전달하면 함수 내부에서는 튜플을 아이템으로 갖는 튜플을 받는다.

def print_many(*arguments):

    print(type(arguments))

    print(arguments)

print_many((1, 2, 3, 4, 5))

사전을 인수로 전달하려면 **를 매개변수 앞에 붙인다.

def print_many(**keywords):

    print(type(keywords))

    for k in keywords:
        print(k, ":", keywords[k])

print_many(a=65, b=66)

함수 실행 시 가변인수의 형식

언패킹 연산자(*)를 이터러블 객체 앞에 사용하면 아이템들을 여러개의 객체로 풀어준다.

my_list = [1, 2, 3]

print(my_list)  # print([1, 2, 3])

print(*my_list)  # print(1, 2, 3)

언패킹 연산자를 통해 이터러블들을 하나로 합칠 수 있다.

my_list1 = [1, 2, 3]
my_list2 = [4, 5, 6]

my_list = [*my_list1, *my_list2] # 하나로 합치기
# my_list = [my_list1, my_list2]

my_list

리스트를 인수로 전달할 때 언패킹 연산자를 사용하면 가변인수로 전달이 된다.

def add_three(a, b, c):

    print("a = ", a)
    print("b = ", b)
    print("c = ", c)

    return a + b + c

add_three(*[1, 2, 3])

다만 사전을 언패킹을 할 때는 **을 사용한다.

def add_three(a, b, c):

    print("a = ", a)
    print("b = ", b)
    print("c = ", c)

    return a + b + c

my_dict = {"a": 1, "b": 2, "c": 3}
add_three(**my_dict)

#6 반환

return 문

함수는 내부 명령문들을 모두 실행한 후에 종료된다. 또는 return 문을 만나면 실행이 종료된다. return 뒤에 아무것도 없으면 자동으로 None을 반환한다.

def repeat_print(message="안녕", count=1):
    """message를 count번 출력"""

    for _ in range(count):
        print(message)

    # return None

result = repeat_print("오우야!", 3)

print(result)

함수 중간에도 반환이 가능하다.

def compute_tax(my_income):
    """수입을 받아서 세금을 계산"""

    if my_income <= 12:
        return my_income * 0.06
    elif my_income <= 46:
        return my_income * 0.15 - 1.08
    else:
        return my_income * 0.24 - 5.22

my_income = float(input("연수입을 입력해주세요:"))

tax = compute_tax(my_income)

print("내야할 세금은", tax, "입니다.")

반환값이 여러개인 경우

반환값이 여러개일 경우에 내부적으로 튜플로 묶어서 반환한다.

import random

def two_random_numbers():
    # return random.random(), random.random()
    # return (random.random(), random.random())
    return [random.random(), random.random()]  # 원한다면 리스트 사용도 가능

two_random_numbers()