무엇을 하는 것인가
코드가 길어지면 같은 계산이 여기저기 되풀이됩니다. 그러다 계산식이 틀린 걸 발견하면 붙여넣은 곳을 전부 찾아 고쳐야 하고, 하나를 빠뜨리면 그게 버그가 됩니다.
함수는 그 덩어리에 이름을 붙여 두고 필요할 때 부르는 것입니다. def 이름(재료):로 만들고, 이름(값)으로 부릅니다. 고칠 일이 생기면 함수 안 한 곳만 고치면 됩니다.
괄호 안에 적는 것을 매개변수라고 합니다. 함수가 일하는 데 필요한 재료입니다. 일을 마치고 결과를 돌려주려면 return을 씁니다. return이 없으면 None이 돌아옵니다.
print와 return은 다릅니다. print는 화면에 보여줄 뿐이고, return은 값을 넘겨줘서 다른 계산에 쓸 수 있게 합니다. 초보자가 가장 자주 헷갈리는 지점이고, "함수가 값을 안 돌려준다"는 문제의 대부분이 이것입니다.
예제 코드
아래 코드가 위 버튼으로 받는 파일과 같은 내용입니다. 통째로 복사해 실행해 보고, 값을 바꿔 가며 결과가 어떻게 달라지는지 보는 편이 읽기만 하는 것보다 훨씬 빨리 익습니다.
# 함수 def — 코드 덩어리에 이름 붙여 두고 불러 쓰기
def 인사(이름):
print("안녕하세요,", 이름, "님")
인사("김서연")
인사("이준호")
# return 은 값을 돌려주고, print 는 보여주기만 합니다. 이게 제일 헷갈립니다.
def 더하기_보여주기(a, b):
print(a + b) # 화면에 보여줄 뿐
def 더하기(a, b):
return a + b # 값을 넘겨줍니다
결과1 = 더하기_보여주기(3, 4) # 화면엔 7 이 뜨지만
print("돌려받은 값:", 결과1) # None ← return 이 없어서
결과2 = 더하기(3, 4)
print("돌려받은 값:", 결과2) # 7 ← 다른 계산에 쓸 수 있습니다
print("두 배:", 더하기(3, 4) * 2)
# 기본값을 주면 부를 때 생략할 수 있습니다
def 할인가(정가, 할인율=0.1):
return int(정가 * (1 - 할인율))
print(할인가(20000)) # 18000 (기본 10%)
print(할인가(20000, 0.3)) # 14000
# return 을 만나면 함수는 그 자리에서 끝납니다
def 학점(점수):
if 점수 >= 90:
return "A" # 여기서 끝. 아래는 안 봅니다.
if 점수 >= 80:
return "B"
return "F"
print(학점(95), 학점(85), 학점(20))
# 값을 두 개 이상 돌려주기
def 통계(목록):
return sum(목록), sum(목록) / len(목록)
합, 평균 = 통계([90, 80, 70])
print("합:", 합, "/ 평균:", 평균)
# 함수 안에서 만든 변수는 밖에서 안 보입니다
def 시험():
안쪽값 = 123
return 안쪽값
print(시험())
# print(안쪽값) ← 이 줄의 주석을 풀면 NameError 가 납니다
기억할 것
def 이름(매개변수):— 만들고,이름(값)— 부릅니다.return은 값을 돌려주고,print는 보여주기만 합니다.return을 만나면 함수는 그 자리에서 끝납니다. 아래 줄은 실행되지 않습니다.- 매개변수에 기본값을 주면 부를 때 생략할 수 있습니다.
- 함수 안에서 만든 변수는 함수 밖에서 안 보입니다.
자주 묻는 것
함수를 불렀는데 None 이 나옵니다
함수 안에서 print만 하고 return을 안 했을 때 그렇습니다. print는 화면에 보여줄 뿐 값을 넘기지 않습니다. 결과를 다른 곳에 쓰려면 return으로 돌려주세요.
함수 안에서 바꾼 변수가 밖에서는 그대로입니다
함수 안에서 만든 변수는 그 함수 안에서만 삽니다(지역 변수). 밖의 값을 바꾸고 싶으면 return으로 돌려받아 다시 넣는 것이 정석입니다. global도 있지만 코드가 꼬이기 쉬워 권하지 않습니다.
매개변수와 인자는 뭐가 다른가요
만들 때 괄호에 적는 이름이 매개변수, 부를 때 실제로 넣는 값이 인자입니다. def 더하기(a, b)의 a, b가 매개변수고 더하기(3, 4)의 3, 4가 인자입니다.
값을 두 개 돌려줄 수 있나요
됩니다. return 합계, 평균처럼 쉼표로 나열하면 튜플로 묶여 나오고, a, b = 함수()로 한 번에 받을 수 있습니다.