학습 기록

Python 공부 기록 #4 - 복붙 지옥 탈출! 마법의 단어 'def' (함수 기초)

  1. 목차

인트로: 컨트롤+C, V는 이제 그만

함수(Function): 라면 자판기와 def

매개변수(Parameter): 재료 투입구

Return: 결과물 배출구 (print와 차이점)

심화(args): 입력값이 몇 개일지 모를 때

아웃트로: 조립식 코딩의 시작

1.인트로

지난 포스팅(#3)에서 우리는 컴퓨터에게 If문으로 ’판단력’을 심어주고, For문으로 지치지 않는 ’성실함’을 가르쳤습니다.

이제 제법 똑똑하게 일을 시킬 수 있겠다고 생각했는데, 막상 코드를 짜다 보니 새로운 문제가 생기더군요.

회사에서 엑셀 작업을 할 때 가장 괴로운 순간이 언제인가요? 저는 똑같은 서식을 100개의 시트에 일일이 복사해서 붙여넣을 때 현타(?)가 오더라고요.

코딩에서도 똑같았습니다. 조건문과 반복문을 써서 기능을 만들었는데, 이 기능이 또 필요하면 습관적으로 윗줄 코드를 긁어서(Ctrl+C) 아랫줄에 붙여넣고(Ctrl+V) 있더라고요. 그러다 오타라도 하나 발견되면? 복사한 10군데를 전부 찾아서 고쳐야 하는 대참사가 일어납니다.

오늘 배운 ’함수(Function)’는 바로 이 ’무한 복붙의 굴레’를 끊어주는 도구입니다. 엑셀로 치면 복잡한 과정을 ’매크로’로 저장해두고 단축키 한 번으로 실행하는 것과 비슷하더군요. 오늘은 나의 퇴근 시간을 앞당겨줄, 그리고 코드를 깔끔하게 정리해 줄 ’함수’의 세계를 기록해 봅니다.

  1. 함수가 뭔데? (feat. 라면 자판기)

함수는 ’특정한 작업을 수행하는 코드 뭉치’입니다. 쉽게 말해 ’라면 자판기’를 만드는 것과 같아요.

우리가 매번 면을 삶고 스프를 넣는 과정을 직접 하는 게 아니라, “라면 끓여(함수 호출)” 버튼만 누르면,

기계가 알아서 물 끓이고 면 넣고 완성된 라면을 내놓는 거죠.

파이썬에서는 def(define, 정의하다)라는 키워드로 이 자판기를 만듭니다.

[Before] 함수를 몰랐던 시절의 노가다

print(“안녕하세요!”)

print(“결재 부탁드립니다.”)

print(“-” * 30)

print(“안녕하세요!”)

print(“결재 부탁드립니다.”)

print(“-” * 30)

(이걸 100번 해야 한다면…?)

[After] 함수로 깔끔하게!

def sign_please():

print(“안녕하세요!”)

print(“결재 부탁드립니다.”)

print(“-” * 30)

필요할 때마다 이름만 부르면 끝!

sign_please()

이제 “결재 부탁드립니다”를 “반려입니다”로 바꾸고 싶다면?

def 아래에 있는 코드 딱 한 줄만 고치면 됩니다. 유지보수가 엄청나게 쉬워지는 거죠.

  1. 재료 투입구: 매개변수(Parameter)

자판기에 동전을 넣거나 맛을 선택하듯이, 함수에도 데이터(재료)를 집어넣을 수 있습니다. 이걸 ’매개변수’라고 합니다.

괄호() 안에 재료를 받을 변수 이름을 써줍니다.

def introduce(name, age):

print(f“제 이름은 {name}이고, {age}살입니다.”)

함수를 쓸 때 실제 값(인자)을 던져줍니다.

introduce(“제이엠”, 10)

introduce(“망곰이”, 2)

  1. 결과물 배출구: 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}입니다.”)

  1. 심화: 몇 개가 들어올지 모를 때 (*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 같은 거 쓸 때 많이 나온다네요!)

  1. 정리하며

오늘은 코드를 블록처럼 조립해서 재사용하는 함수에 대해 정리해 봤습니다.

def로 만들고 ()로 호출한다.

매개변수로 값을 넣고, return으로 값을 받는다.

입력값이 몇 개일지 모르면 *args를 쓴다.

확실히 함수를 쓰고 나서부터는 코드가 훨씬 짧아지고, 무엇보다 “내가 뭘 하려는 코드인지” 이름만 봐도 알 수 있어서 가독성이 좋아졌습니다.

다음 포스팅에서는 이 함수들을 모아서 나만의 프로그램을 만드는 ‘클래스와 객체’…라는 조금 더 거대한 산을 넘어보겠습니다. (점점 개발자가 되어가는 기분이 드네요!)

혹시 설명 중에 틀린 부분이 있거나 더 좋은 팁이 있다면 댓글로 알려주세요! 같이 공부해요. 😊