#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()