함수란?
우리가 지금까지 사용한 print, input 등 괄호가 붙는 것을 함수라고 한다.
필요에 따라 우리가 직접 함수를 만들 수도 있으며 이를 사용자 정의 함수라고 한다.
함수를 만들면 불필요한 코드 반복을 줄일 수도 있고 여러모로 편하다.
사용자 정의 함수
사용자 정의 함수는 기본적으로 def 함수명(매개변수)과 같은 형식으로 만들 수 있으며 조건문, 반복문과 같이
뒤에 세미콜론을 붙여주며 밑에 코드들은 들여 쓰기를 해주며 뒤에 오는 매개변수는 함수를 호출했을 시 전달받을 값을 넣어준다.
# 함수 만들기
def add(n1, n2): # 함수 호출로부터 전달된 값이 n1, n2에 각각 저장된다.
print(n1 + n2) # 저장된 값을 더하고 출력한다.
add(3, 5) # 함수 호출은 함수명(값)로 해주며 괄호 안에 있는 값이 함수의 매개변수에 전달된다.
8
함수의 결과를 위처럼 바로 출력할 수 있지만 변수에 저장해야될 때도 있을 것이다.
그럴 때는 return을 사용해주면 함수의 결과를 바로 변수에 저장시켜 줄 수 있다.
# 함수 만들기
def add(n1, n2):
return n1 + n2 # 저장된 값을 더하고 반환한다.
result = add(3, 5) # 함수의 결과를 반환할 시에는 변수에 저장이 필요하다.
print(result)
8
사용자 정의 함수의 종류
매개변수의 존재, 반환 유무를 통해 함수의 종류를 나눠보도록 하겠다.
1. 매개변수X, 반환 X
# 매개변수X, 반환X
def add():
print(2 + 3)
add()
5
2. 매개변수 O, 반환 X
# 매개변수O, 반환X
def add(n1, n2): # 함수 호출로부터 전달된 값이 n1, n2에 각각 저장된다.
print(n1 + n2) # 저장된 값을 더하고 출력한다.
add(3, 5) # 함수 호출은 함수명(값)로 해주며 괄호 안에 있는 값이 함수의 매개변수에 전달된다.
8
3. 매개변수 X, 반환 O
# 매개변수X, 반환O
def add():
return 7 + 3
result = add()
print(result)
10
4. 매개변수 O, 반환 O
# 매개변수O, 반환O
def add(n1, n2):
return n1 + n2
result = add(9, 7)
print(result)
16
매개변수의 개수를 모를 때는?
함수를 만들다 보면 매개변수의 개수가 정해져 있지 않은 경우가 있다.
대표적으로 list생성 함수는 요소의 개수를 사용자가 정해준다.
1. 가변인자
가변인자는 함수의 매개변수에 *을 붙인 상태로 함수에 전달되는 인자들이 튜플 형태로 바뀐다.
# 가변인자
def print_numbers(*args):
for num in args:
print(num)
print_numbers(1, 2, 3, 4, 5)
1
2
3
4
5
2. 키워드인자
키워드인자는 함수의 매개변수에 **을 붙인 상태로 함수에 전달되는 인자들이 딕셔너리 형태로 바뀐다.
# 키워드인자
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="홍길동", age=20, city="서울특별시")
name: 홍길동
age: 20
city: 서울특별시
3. 가변인자와 키워드인자 혼합 사용
이 둘을 같이 사용할 때는 일반인자, 가변인자, 키워드인자 순서대로 사용해야 한다.
# 혼합사용
def mixed_function(a, *args, **kwargs):
print(f"a: {a}")
print(f"args: {args}")
print(f"kwargs: {kwargs}")
mixed_function(10, 20, 30, name="홍길동", age=20)
a: 10
args: (20, 30)
kwargs: {'name': '홍길동', 'age': 20}
인자에는 값이 순서대로 들어가기 때문에 a에 10이, 가변인자에는 나머지 20, 30이 키워드인자에는 딕셔너리 형태로 전달된 name과 age가 전달된다.
4. 함수 호출 시 사용
*은 함수의 매개변수에만 사용되는 것이 아닌 함수 호출 시에도 사용할 수 있다.
def number(n1, n2, n3): # 순서대로 각각 전달된다.
print(n1, n2, n3)
num = (1, 2, 3)
number(*num) # 튜플을 풀어서 전달
1 2 3
def greet(name, age): # name에는 name의 value가 들어가고 age에는 age의 value가 자동으로 들어간다.
print(name)
print(age)
info = {"name": "홍길동", "age": 20}
greet(**info) # 딕셔너리를 풀어서 전달
홍길동
20
매개변수에 기본값 정하기
함수에는 매개변수를 만들어놓았지만 전달하지 않아도 되는 경우가 있다.
이럴 때는 매개변수에 기본값을 정해 값이 전달되지 않아도 기본값이 저장되도록 한다.
# 매개변수에 기본값
def info(name, age, address = '서울특별시'):
print(name, age, address)
info('홍길동', 20)
홍길동 20 서울특별시
기본값이 있어도 매개변수에 값을 전달한다면 기본값에서 전달된 값으로 값이 바뀐다.
# 매개변수에 기본값 바꾸기
def info(name, age, address = '서울특별시'):
print(name, age, address)
info('홍길동', 20, '부산광역시')
홍길동 20 부산광역시
기본값은 항상 오른쪽부터 왼쪽 순서대로 정해줘야 한다.
만약 순서를 지키지 않는다면 에러가 발생한다.
# 매개변수 기본값 순서
def info(name, age = 20, address):
print(name, age, address)
info('홍길동', '부산광역시') # 홍길동은 name, 부산광역시는 age에 전달되게 되어 address에 값이 전달되지 않는다.
SyntaxError: parameter without a default follows parameter with a default
재귀호출 사용하기
재귀호출이란 함수 안에서 함수를 불러오는 것이다.
재귀호출을 사용하면 특정한 작업에서 편리할 때가 있으니 알아두도록 하고 다음은 재귀호출로 팩토리얼을 계산하는 예제이다.
# 재귀호출
def factorial(n):
if n == 1: # n이 1일 때
return 1 # 1을 반환하고 재귀호출을 끝냄
return n * factorial(n - 1) # n과 factorial 함수에 n - 1을 넣어서 반환된 값을 곱함
print(factorial(5))
120
마지막 return을 보면 팩토리얼 함수에 n-1을 넣은 후 재귀호출하고 있다.
이렇게 되면 n이 1이 될 때까지 계속 함수를 호출하게 되며 결국 함수 호출에서 5를 넣을 시 5, 4, 3, 2, 1이 곱해진 형태로 나온다.
결론
파이썬에서 함수는 정말 편리하다.
나중에 알고리즘을 설계하거나 어떠한 작업을 할 때 특정한 코드들을 많이 반복 사용하게 되는데 그럴 때 함수를 만든다면
쉽게 특정 코드들을 반복 사용할 수 있다.
'Python > Foundation' 카테고리의 다른 글
13강. [Python]클래스 (0) | 2025.02.02 |
---|---|
12강. [Python]람다 (0) | 2025.02.02 |
10강. [Python]반복문 (0) | 2025.02.02 |
09강. [Python]조건문 (0) | 2025.02.02 |
08강. [Python]세트 (0) | 2025.02.02 |