
지금까지 하나씩 배워오면서,
점점 코드를 ‘작성하는 것’보다 ‘정리하는 것’이 더 중요해진다는 느낌을 받았다.
액션에 이름을 붙이고 그 이름을 사용하면, 간편하게 정해진 액션대로 출력되도록 할 순 없을까?
이럴 때 필요한 개념이 바로 함수(Function)다.
오늘은 함수를 통해 코드를 의미 단위로 묶고, 연습하는 시간을 가지려 한다.
함수는 자주 사용하는 코드 묶음에 이름을 붙여두고, 필요할 때마다 호출해서 쓰는 것이다.
쉽게 말해,
“이 작업은 이런 이름으로 불러서 쓰자”
라고 약속해두는 개념이다.
예를 들어, 인사 메시지를 여러 번 출력해야 한다고 가정해보자.
print("안녕하세요!")
print("안녕하세요!")
print("안녕하세요!")
지금은 간단하지만,
내용이 길어진다거나 이 코드가 10번, 100번 필요해진다면 어떨까?
이럴 때 함수를 사용하면 아래와 같이 바꿀 수 있다.
def say_hello():
print("안녕하세요!")
say_hello()
say_hello()
say_hello()
같은 코드를 반복해서 작성하지 않아도 되고
코드의 의도가 훨씬 명확해진다
say_hello()라는 이름만 봐도
“아, 인사하는 코드구나” 하고 바로 이해할 수 있다.
def 함수 이름():
실행할 코드 블록
def : 함수를 정의한다는 뜻함수 이름 : 내가 붙인 약속 이름() : 함수임을 나타냄: 이후는 반드시 들여쓰기함수는 매개변수(parameter)를 통해 외부에서 값을 전달받아
그 값에 따라 다르게 동작하도록 만들 수 있다.
예를 들어,
def greet(name):
print(f"안녕하세요, {name}님!")
여기서 name은 함수가 값을 전달받기 위해 준비해둔 '매개변수'이다.
그 결과,
greet("Ariel") # 결과: 안녕하세요, Ariel님!
greet("Python") # 결과: 안녕하세요, Python님!
이 때 함수를 호출하기 위해 전달하는 "Ariel", "Python"과 같은 실제 값은
'인자'라고 부른다.
이와 같이, 함수 이름과 구조는 같지만
어떤 인자를 전달하느냐에 따라 결과가 달라질 수 있다.
함수는 정의만 해서는 아무 일도 일어나지 않는다.
def say_hello():
print("안녕하세요!")
이 상태에서는 아직 실행되지 않는다.
반드시 함수 이름 뒤에 ()를 붙여 호출(call) 해야 실제로 실행된다.
say_hello() # 이 줄에서 실행
이렇듯, 미리 설계해두고 필요할 때 꺼내 쓰는 구조가 '함수'이다.
출력(print)과 결과 반환(return)은 다르다
핵심만 먼저 말하자면,
print는 결과를 보여주기 위한 도구이고,
return은 결과를 다음 코드에서 사용하기 위한 도구이다.
따라서 함수의 목적이 무엇이냐에 따라 다르게 선택해야 한다.
🔹 return
파이썬에서 이미 구현된 함수로써 자세한 사항은 아래 링크를 참고한다.
간략한 예시로는 아래 함수들이 있다.
abs(): 절댓값 반환print(abs(-3)) # 결과: 3
len(): 길이 반환print(len("hello")) # 결과: 5
str(): 문자열 반환print(str(123)) # 결과: "123"
위의 함수의 기본 구조에서 설명한 형태의 사용자가 직접 정의한 함수.
익명 함수(이름이 없는 함수)를 만들 때 사용.
lambda와 인자, 함수 본문을 이용하여 정의한다.
주로 간단한 계산이나 일회성 로직을 위해 사용되며
특히, 함수를 매개변수로 전달하는 경우에 유용하다.
# 사용자 정의 함수
def add(a, b):
return a + b
# 위의 함수를 람다 함수로 바꿔서 표현하면
add = lambda a, b: a + b
print(add(3, 4)) # 결과: 7
lambda: 익명 함수 만들거임a, b: 매개변수:: 여기서부터 함수의 내용a + b: return값👉 람다 함수는 return을 쓰지 않으며, 콜론 뒤 표현식 자체가 곧 return 값이다.
인자의 순서에 따라 매개변수에 할당되는 인자.
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 결과: 8
위의 경우,
위치에 따라 a에는 3이, b에는 5가 할당된다.
함수를 정의할 때 미리 매개변수에 정의해둔 값으로
함수 호출 시 인자를 전달하지 않으면 기본값이 사용된다.
이 때 기본값 인자는 매개변수 = 기본값의 형태로 지정하며,
이는 반드시 위치 인자 뒤에 정의되어야 한다.
def greeting(name, message="어서오세요"):
print(f"{message}, {name}님!")
greeting("홍길동", "환영합니다") # 결과: 환영합니다, 홍길동님!
greeting("홍길동") # 결과: 어서오세요, 홍길동님!
인자를 이름과 함께 지정하여 순서가 상관 없는 인자.
코드의 가독성을 높이고, 유지 보수를 용이하게 해줄 수 있다.
def greet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet(greeting="Hi", name="Ariel") # 결과: Hi, Ariel!
임의의 개수의 인자를 받을 수 있게 해주는 기능.
가변 인자는 매개변수 앞에 *를 붙여 정의하며, 함수 내부에서는 튜플로 처리된다.
일반 매개변수와 함께 사용할 경우에는 일반 매개변수 뒤에 정의되어야 한다.
def sum_numbers(*args): # ()안의 값들이 튜플로 만들어짐
total = 0 # 합계는 0부터 시작
for number in args: # 튜플 안에 있는 값들을 하나씩 꺼내 사용
total += number # 앞 순서의 합계 값에 다음 숫자를 더함
return total
result = sum_numbers(1, 2, 3, 4, 5)
print(result) # 결과: 15
임의의 개수의 키워드 인자를 받을 수 있는 기능.
매개변수 앞에 **를 붙여 정의하며, 함수 내부에서는 딕셔너리로 처리된다.
일반 매개변수 및 가변 인자와 함께 사용 시
일반 매개변수, 가변 인자, 키워드 가변 인자 순으로 정의되어야 한다.
def print_info(**kwargs): # ()안의 값들이 딕셔너리로 만들어짐
for key, value in kwargs.items(): # 키와 값을 둘 다 사용. kwargs만 적으면 키 값만 호출되어 에러 발생
print(f"{key}: {value}")
print_info(name="홍길동", age=30, city="서울")
# 결과
name: 홍길동
age: 30
city: 서울
함수는 지금까지 배운 모든 개념을 담을 수 있다.
예를 들어,
def check_bloodsugar(have_meal, blood_glucose_level):
if (not have_meal) and (blood_glucose_level < 100):
return("정상입니다.")
elif (have_meal) and (blood_glucose_level < 140):
return("정상입니다.")
elif (not have_meal) and (100 <= blood_glucose_level <= 125):
return("공복혈당장애(당뇨 전 단계)입니다.")
elif (have_meal) and (blood_glucose_level >= 200):
return("위험합니다.")
elif (not have_meal) and (blood_glucose_level >= 126):
return("위험합니다.")
if result == "공복혈당장애(당뇨 전 단계)입니다.":
print("생활습관 개선 필요")
result = check_bloodsugar(False, 110) # 결과: 생활습관 개선 필요
이 순간부터 코드는 본격적으로 “설계된 구조”가 되기 시작한다.
이렇듯 함수를 사용하면 보다 효율적이고 깔끔하게 코드를 짤 수 있다.
[참고한 사이트 목록]