학습 기록
Python 공부 기록 #4 - 복붙 지옥 탈출! 마법의 단어 'def' (함수 기초)
- 목차
인트로: 컨트롤+C, V는 이제 그만
함수(Function): 라면 자판기와 def
매개변수(Parameter): 재료 투입구
Return: 결과물 배출구 (print와 차이점)
심화(args): 입력값이 몇 개일지 모를 때
아웃트로: 조립식 코딩의 시작
1.인트로
지난 포스팅(#3)에서 우리는 컴퓨터에게 If문으로 ’판단력’을 심어주고, For문으로 지치지 않는 ’성실함’을 가르쳤습니다.
이제 제법 똑똑하게 일을 시킬 수 있겠다고 생각했는데, 막상 코드를 짜다 보니 새로운 문제가 생기더군요.
회사에서 엑셀 작업을 할 때 가장 괴로운 순간이 언제인가요? 저는 똑같은 서식을 100개의 시트에 일일이 복사해서 붙여넣을 때 현타(?)가 오더라고요.
코딩에서도 똑같았습니다. 조건문과 반복문을 써서 기능을 만들었는데, 이 기능이 또 필요하면 습관적으로 윗줄 코드를 긁어서(Ctrl+C) 아랫줄에 붙여넣고(Ctrl+V) 있더라고요. 그러다 오타라도 하나 발견되면? 복사한 10군데를 전부 찾아서 고쳐야 하는 대참사가 일어납니다.
오늘 배운 ’함수(Function)’는 바로 이 ’무한 복붙의 굴레’를 끊어주는 도구입니다. 엑셀로 치면 복잡한 과정을 ’매크로’로 저장해두고 단축키 한 번으로 실행하는 것과 비슷하더군요. 오늘은 나의 퇴근 시간을 앞당겨줄, 그리고 코드를 깔끔하게 정리해 줄 ’함수’의 세계를 기록해 봅니다.
- 함수가 뭔데? (feat. 라면 자판기)
함수는 ’특정한 작업을 수행하는 코드 뭉치’입니다. 쉽게 말해 ’라면 자판기’를 만드는 것과 같아요.
우리가 매번 면을 삶고 스프를 넣는 과정을 직접 하는 게 아니라, “라면 끓여(함수 호출)” 버튼만 누르면,
기계가 알아서 물 끓이고 면 넣고 완성된 라면을 내놓는 거죠.
파이썬에서는 def(define, 정의하다)라는 키워드로 이 자판기를 만듭니다.
[Before] 함수를 몰랐던 시절의 노가다
print(“안녕하세요!”)
print(“결재 부탁드립니다.”)
print(“-” * 30)
print(“안녕하세요!”)
print(“결재 부탁드립니다.”)
print(“-” * 30)
(이걸 100번 해야 한다면…?)
[After] 함수로 깔끔하게!
def sign_please():
print(“안녕하세요!”)
print(“결재 부탁드립니다.”)
print(“-” * 30)
필요할 때마다 이름만 부르면 끝!
sign_please()
이제 “결재 부탁드립니다”를 “반려입니다”로 바꾸고 싶다면?
def 아래에 있는 코드 딱 한 줄만 고치면 됩니다. 유지보수가 엄청나게 쉬워지는 거죠.
- 재료 투입구: 매개변수(Parameter)
자판기에 동전을 넣거나 맛을 선택하듯이, 함수에도 데이터(재료)를 집어넣을 수 있습니다. 이걸 ’매개변수’라고 합니다.
괄호() 안에 재료를 받을 변수 이름을 써줍니다.
def introduce(name, age):
print(f“제 이름은 {name}이고, {age}살입니다.”)
함수를 쓸 때 실제 값(인자)을 던져줍니다.
introduce(“제이엠”, 10)
introduce(“망곰이”, 2)
- 결과물 배출구: return
이 부분이 처음에 좀 헷갈렸는데요. print와 return의 차이입니다.
print: 그냥 화면에 보여주고 끝 (증발함)
return: 계산된 결과값을 함수를 호출한 곳으로 돌려줌 (재사용 가능)
상사에게 보고할 때를 예로 들면 이렇습니다.
print: 상사에게 구두 보고만 하고 자리로 오는 것. (기록이 안 남음)
return: 결재 서류를 작성해서 상사 책상 위에 올려두는 것. (상사가 그 서류를 가지고 다른 일을 할 수 있음)
def add_numbers(a, b):
result = a + b
return result # 결과값을 뱉어내라!
뱉어낸 값을 변수에 저장해서 2차 가공 가능
sum_result = add_numbers(10, 20) print(f“합계는 {sum_result}입니다.”)
- 심화: 몇 개가 들어올지 모를 때 (*args)
업무를 하다 보면 팀장님이 “이 파일들 좀 처리해”라고 하시는데, 파일이 3개일 수도 있고 100개일 수도 있잖아요?
함수를 만들 때 재료가 몇 개 들어올지 모른다면, 변수 앞에 별(*)을 달아줍니다.
*args: 여러 개의 값을 튜플(Tuple)이라는 보따리에 싸서 한 번에 받습니다.
숫자들을 다 더해주는 함수 (몇 개든 상관없음)
def sum_all(*numbers):
total = 0
for num in numbers:
total += num
return total
print(sum_all(1, 2, 3)) # 3개도 OK
print(sum_all(10, 20, 30, 40, 50)) # 5개도 OK
#참고: 별 두 개(**kwargs)를 붙이면 딕셔너리(Key: Value) 형태로도 받을 수 있습니다.
(이건 나중에 API 같은 거 쓸 때 많이 나온다네요!)
- 정리하며
오늘은 코드를 블록처럼 조립해서 재사용하는 함수에 대해 정리해 봤습니다.
def로 만들고 ()로 호출한다.
매개변수로 값을 넣고, return으로 값을 받는다.
입력값이 몇 개일지 모르면 *args를 쓴다.
확실히 함수를 쓰고 나서부터는 코드가 훨씬 짧아지고, 무엇보다 “내가 뭘 하려는 코드인지” 이름만 봐도 알 수 있어서 가독성이 좋아졌습니다.
다음 포스팅에서는 이 함수들을 모아서 나만의 프로그램을 만드는 ‘클래스와 객체’…라는 조금 더 거대한 산을 넘어보겠습니다. (점점 개발자가 되어가는 기분이 드네요!)
혹시 설명 중에 틀린 부분이 있거나 더 좋은 팁이 있다면 댓글로 알려주세요! 같이 공부해요. 😊