함수 작성하기

Tip학습 목표
  • 함수를 정의(define)하는 것과 실제로 함수를 호출(call)하여 사용하는 것의 차이를 설명할 수 있습니다.
  • 특정 개수의 인수를 받아 결과를 반환하는 간단한 함수를 작성할 수 있습니다.
Note질문
  • 어떻게 나만의 함수를 만들어 사용할 수 있나요?

함수를 사용한 코드 모듈화

  • 인간의 기억력에는 한계가 있어 한 번에 너무 많은 정보를 처리하기 어렵습니다.
  • 따라서 복잡한 아이디어를 이해하기 위해서는 세부 사항들을 결합하여 더 큰 단위로 구조화해야 합니다.
    • 이는 거대한 기계 장치의 부품들이나 수학 증명의 보조정리와 같은 역할을 합니다.
  • 프로그래밍에서 함수(functions)는 바로 이러한 목적을 위해 존재합니다.
    • 캡슐화(Encapsulation)를 통해 복잡한 과정을 하나의 단위로 묶어 관리할 수 있게 해줍니다.
  • 함수는 한 번 작성해 두면 필요할 때마다 여러 번 재사용할 수 있다는 장점이 있습니다.

함수 정의하기

  • 파이썬에서 함수를 정의할 때는 def 키워드를 사용합니다.
  • def 뒤에 함수의 이름을 적습니다. 이름은 변수 명명 규칙과 동일하게 작성합니다.
  • 이름 뒤의 괄호 안에 매개변수(parameters)라고 불리는 입력값 변수들을 나열합니다. 입력값이 없다면 빈 괄호 ()를 사용합니다.
  • 줄 끝에 콜론 :을 붙이고, 다음 줄부터 들여쓰기를 하여 함수의 본문을 작성합니다.
def print_greeting():
    print('Hello!')
    print('The weather is nice today.')
    print('Right?')

함수 호출하기

  • 함수를 정의하는 것만으로는 코드가 실행되지 않습니다. 변수에 값을 할당하는 것과 유사하게 함수를 저장해 두는 단계입니다.
  • 함수 내부의 코드를 실제로 실행하려면 함수의 이름을 써서 명시적으로 호출(call)해야 합니다.
print_greeting()
Hello!
The weather is nice today.
Right?

인수(Arguments)와 매개변수(Parameters)

  • 함수가 다양한 데이터를 처리할 수 있도록 매개변수를 지정합니다.
  • 매개변수는 함수 내부에서 사용할 임시 변수 역할을 합니다.
  • 함수를 호출할 때 전달하는 실제 데이터를 인수(Arguments)라고 하며, 이 인수는 매개변수에 순서대로 할당됩니다.
def print_date(year, month, day):
    joined = str(year) + '/' + str(month) + '/' + str(day)
    print(joined)

print_date(1871, 3, 19)
1871/3/19
  • 호출 시 매개변수의 이름을 직접 지정하여 인수를 전달할 수도 있습니다. 이 경우 순서가 바뀌어도 상관없으며 코드가 더 명확해집니다.
print_date(month=3, day=19, year=1871)
1871/3/19

return 문을 통한 결과 반환

  • 함수 실행 결과를 호출한 곳으로 돌려주려면 return 구문을 사용합니다.
  • return 문은 함수 내 어디든 위치할 수 있지만, 주로 다음과 같은 경우에 사용합니다.
    • 함수의 시작 부분: 잘못된 입력 등을 확인하여 즉시 종료할 때.
    • 함수의 마지막 부분: 모든 로직을 마친 후 최종 결과를 반환할 때.
def average(values):
    if len(values) == 0:
        return None
    return sum(values) / len(values)
  • 파이썬의 모든 함수는 항상 무언가를 반환합니다. 명시적인 return 문이 없다면 자동으로 None을 반환합니다.
result = print_date(1871, 3, 19)
print('반환값:', result)
1871/3/19
반환값: None

Important연습 문제

구문 오류 찾아내기

  1. 다음 코드에서 문법적으로 틀린 부분을 찾아보세요.
  2. 코드를 실행하여 어떤 에러 메시지가 나타나는지 확인해 보세요.
  3. 오류를 수정하여 코드가 정상적으로 실행되도록 만드세요.
def another_function
  print("Syntax errors are annoying.")
   print("But at least python tells us about them!")
  print("So they are usually not too hard to fix.")
def another_function():
    print("Syntax errors are annoying.")
    print("But at least Python tells us about them!")
    print("So they are usually not too hard to fix.")
Important연습 문제

함수 정의와 호출

다음 프로그램의 실행 결과는 무엇일까요? 함수를 호출할 때 괄호 ()의 유무가 어떤 차이를 만드는지 생각해 보세요.

def report(pressure):
    print('pressure is', pressure)

print('calling', report, 22.5)

함수 이름만 쓰면 함수 객체 자체가 출력됩니다. 함수를 실행하려면 반드시 report(22.5)와 같이 괄호를 사용하여 호출해야 합니다.

Important연습 문제

실행 순서와 반환값

  1. 아래 코드가 왜 오류를 발생시키는지 설명해 보세요.
  2. 오류를 수정한 후 실행했을 때 result의 값이 None인 이유는 무엇인가요?
result = print_time(11, 37, 59)

def print_time(hour, minute, second):
   time_string = str(hour) + ':' + str(minute) + ':' + str(second)
   print(time_string)
  1. 함수가 정의되기 전에 호출되었기 때문에 NameError가 발생합니다.
  2. print_time 함수 내부에 결과를 돌려주는 return 문이 없기 때문에 파이썬은 자동으로 None을 반환합니다.
Important연습 문제

데이터 분석 함수 작성하기

파일 이름을 인수로 받아 해당 파일을 읽고, 데이터의 최솟값을 반환하는 함수를 작성하세요.

import pandas as pd

def min_in_data(filename):
    data = pd.read_csv(filename)
    return data.min()
Important연습 문제

계란 등급 분류 함수 만들기

다음은 계란의 무게를 입력받아 등급을 결정하는 코드입니다. 이 로직을 get_egg_label(mass)이라는 함수로 만들어 보세요. 또한, 무게가 너무 가볍거나(50g 미만) 너무 무거운 경우(90g 이상)에 대한 예외 처리도 포함해 보세요.

def get_egg_label(mass):
    if mass >= 90:
        return "warning: egg might be dirty"
    elif mass >= 85:
        return "jumbo"
    elif mass >= 70:
        return "large"
    elif mass >= 55:
        return "medium"
    elif mass < 50:
        return "too light, probably spoiled"
    else:
        return "small"
Important연습 문제

동역학계 시뮬레이션

  1. 현재 인구 밀도 x와 상수 r을 받아 다음 단계의 인구 밀도를 계산하는 logistic_map(x, r) 함수를 작성하세요. 수식: f(t+1) = r * f(t) * (1 - f(t))
  2. 루프를 사용하여 10단계 동안 인구 변화를 계산하고 리스트에 저장하세요.
  3. 이 과정을 iterate(initial_population, t_final, r) 함수로 캡슐화하세요.
def logistic_map(x, r):
    return r * x * (1 - x)

def iterate(initial_population, t_final, r):
    population = [initial_population]
    for t in range(t_final):
        population.append(logistic_map(population[t], r))
    return population

print(iterate(0.5, 10, 1.0))
Note핵심 요약
  • 복잡한 코드는 함수를 사용하여 작고 관리하기 쉬운 단위로 쪼개는 것이 좋습니다.
  • def 키워드를 사용하여 함수를 정의하고, 이름을 통해 호출합니다.
  • 함수 정의 시 매개변수를 지정하고, 호출 시 인수를 전달합니다.
  • return 문을 사용하여 함수의 실행 결과를 반환할 수 있습니다. 반환값이 없으면 None이 반환됩니다.