파이썬 기초 강좌: 4. 함수 사용법과 예제 실습 (Python Basics – Function Examples and Exercises)

예제와 실습, 연습문제로 빠르게 배워보는 파이썬 기초 강좌입니다. 이번 시간에는 Python 함수에 대해서 공부해 봅시다. 함수를 활용하면 좀 더 깔끔하고 아름다운 파이썬 코드를 작성하실 수 있습니다. 손코딩 하면서 몸에 익히세요. 그럼 시작해 봅시다.

파이썬 기초 강좌 - 함수 사용법과 예제 실습

1. Function calls

  • 프로그래밍에서 함수는 특정 계산을 수행하는 명령문들의 이름이 지정된 블록입니다.
  • 함수를 정의할 때는 이름과 명령문의 순서를 지정합니다.
  • 나중에 함수이름을 사용하여 호출할 수 있습니다.
  • (실습) 대화식 모드에서 실습해 보세요.
# 함수 이름: type
# 함수 호출: type + ()
# '32' 라는 argument를 전달 받아서 전달 받은 argument의 type 정보를 return 
>>> type(32)
<class 'int'>

2. Built-in functions

  • 파이썬은 함수 정의를 제공하지 않고도 사용할 수 있는 많은 중요한 내장 함수를 제공합니다.
  • 파이썬의 창시자들은 일반적인 문제를 해결하기 위한 함수들을 작성하고 이를 파이썬에 포함시켜 우리가 사용할 수 있도록 했습니다.
  • 참고URL: https://docs.python.org/3/library/functions.html
  • (실습) 대화식 모드에서 실습해 보세요.
>>> max('Hello world')
>>> min('Hello world')
>>> len('Hello world')
>>> help(max)

3. Type conversion functions

  • 파이썬은 값들을 하나의 타입에서 다른 타입으로 변환하는 내장 함수도 제공합니다.
  • int 함수는 가능한 경우 어떤 값을 정수로 변환하거나, 그렇지 않으면 오류를 발생시킵니다.
  • (실습) 대화식 모드에서 실습해 보세요.
>>> int('32')
32
>>> int('Hello')
ValueError: invalid literal for int() with base 10: 'Hello'

>>> int(3.99999)
3
>>> int(-2.3)
-2

>>> float(32)
32.0
>>> float('3.14159')
3.14159

>>> str(32)
'32'
>>> str(3.14159)
'3.14159'

4. Math functions

  • 파이썬에는 대부분의 익숙한 수학 함수를 제공하는 math 모듈이 있습니다.
  • 이 모듈을 사용하기 전에 먼저 import 해서 가져와야 합니다.
  • (실습) 대화식 모드에서 실습해 보세요.
>>> import math
>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'math']

>>> print(math)
<module 'math' from '/path/.pyenv/versions/3.11.4/lib/python3.11/lib-dynload/math.cpython-311-x86_64-linux-gnu.so'>

>>> math.sqrt(2) / 2.0
0.7071067811865476

5. Random numbers

  • (실습) main.py 에 작성해서 실행해 보세요.
# random_test.py
import random

for i in range(10):
    x = random.random()
    print(x)
  • (실습) 대화식 모드에서 실습해 보세요.
>>> random.randint(5, 10)
>>> random.randint(5, 10)
>>> random.randint(5, 10)
>>> random.randint(5, 10)

>>> t = [1, 2, 3, 4, 5]
>>> random.choice(t)
>>> random.choice(t)
>>> random.choice(t)
>>> random.choice(t)

6. Adding new functions

  • (실습) 대화식 모드에서 실습해 보세요.
>>> def print_hello():
...     print("Hello~!")
...
>>> print_hello()
Hello~!
>>>
>>> print(print_hello)
<function print_hello at 0x7ff7961c8540>
>>>
>>> print(type(print_hello))
<class 'function'>
>>>
>>> for _ in range(10):
...     print_hello()
...
>>>

7. Definitions and uses

  • (실습) main.py 에 작성해서 실행해 보세요.
# function_test.py
def print_hello():
    print("Hello~!")

def repeat_hello():
    print_hello()
    print_hello()

repeat_hello()
  • Exercise#1
위 실습 프로그램의 마지막 줄을 위로 옮겨서 함수 호출이 정의보다 먼저 나타나도록 하세요.
프로그램을 실행하고 어떤 오류 메시지가 나오는지 확인하세요.
  • Exercise#2
함수 호출을 다시 아래로 옮기고,
print_hello의 정의를 repeat_hello의 정의 아래로 옮깁니다.
이 프로그램을 실행했을 때 어떤 일이 발생하나요?

8. Flow of execution

8.1 실행 흐름 이해하기

  • 함수가 처음 사용되기 전에 정의되었는지 확인하려면, 실행 순서를 알아야 합니다. 이를 실행 흐름이라고 합니다. 실행은 항상 프로그램의 첫 번째 문장에서 시작됩니다.
  • 문장들은 위에서 아래로 차례대로 한 번에 하나씩 실행됩니다. 함수 정의는 프로그램의 실행 흐름을 변경하지 않지만, 함수 내부의 문장들은 함수가 호출될 때까지 실행되지 않는다는 것을 기억해야 합니다.

8.2 함수 호출과 실행 흐름

  • 함수 호출은 실행 흐름에서 우회로와 같습니다. 다음 문장으로 이동하는 대신, 실행 흐름은 함수의 본문으로 점프하여 거기에 있는 모든 문장들을 실행하고, 그 후에 중단했던 부분을 다시 진행합니다.
  • 이것은 충분히 간단해 보입니다. 하지만 하나의 함수가 다른 함수를 호출할 수 있다는 것을 기억할 때까지입니다. 하나의 함수를 실행하는 도중에 프로그램이 다른 함수의 문장들을 실행해야 할 수도 있습니다. 그리고 그 새로운 함수를 실행하는 동안, 프로그램은 또 다른 함수를 실행해야 할 수도 있습니다!

8.3 파이썬의 함수 추적 능력

  • 다행히도 파이썬은 어디에 있었는지 추적하는 데 능숙하여, 함수가 완료될 때마다 프로그램은 그것을 호출한 함수에서 중단했던 부분부터 다시 시작합니다. 프로그램이 끝에 도달하면 종료됩니다.

8.4 그래서

  • 프로그램을 읽을 때 항상 위에서 아래로 읽고 싶지 않을 것입니다. 때로는 실행 흐름을 따라가는 것이 더 의미가 있습니다.

9. Parameters and arguments

  • Parameter
    • Parameters는 함수가 정의될 때 사용되는 변수의 이름입니다.
    • 이 변수들은 함수가 호출될 때 전달되는 값들을 받기 위한 “플레이스홀더” 역할을 합니다.
    • 함수의 동작을 정의할 때, 이 파라미터는 필요한 입력값을 나타냅니다.
  • Argument
    • Arguments는 함수를 호출할 때 실제로 전달되는 값들입니다.
    • 이 값들은 함수의 파라미터에 할당되어 함수의 내부에서 사용됩니다.
    • 아규먼트는 함수에 데이터를 제공하고, 그 결과로 함수가 특정 작업을 수행할 수 있도록 합니다.
  • (실습) main.py 에 작성해서 실행해 보세요.
def greet(name):  # 'name'은 파라미터입니다. (혹은 매개변수)
    print(f"Hello, {name}!")

greet("Alice")  # 'Alice'는 아규먼트입니다.
greet("Bob")    # 'Bob'도 아규먼트입니다.

10. Fruitful functions and void functions

  • 결과를 반환하는 함수(Fruitful Functions)
def add(a, b):
    return a + b  # a와 b의 합을 반환합니다

result = add(3, 5)  # 결과를 반환하는 함수를 호출하고 결과를 저장합니다
# result = 8
print(result)  # 출력: 8
  • Void 함수 (Void Functions)
def greet(name):
    print(f"Hello, {name}!")  # 인사 메시지를 출력합니다; 아무것도 반환하지 않습니다

greet("Alice")  # 출력: Hello, Alice!

11. Why functions?

  • 새로운 함수를 만들면 문장 그룹에 이름을 지정할 수 있으므로 프로그램을 읽고 이해하며 디버그하기가 더 쉬워집니다.
  • 함수는 반복적인 코드를 제거함으로써 프로그램을 더 작게 만들 수 있습니다. 나중에 변경을 하려면 한 곳에서만 수정하면 됩니다.
  • 긴 프로그램을 함수로 나누면 각 부분을 하나씩 디버그한 후에 작동하는 전체로 조립할 수 있습니다.
  • 잘 설계된 함수는 많은 프로그램에서 유용하게 사용됩니다. 한 번 작성하고 디버그하면 재사용할 수 있습니다.

Exercises

  • (1) 파이썬에서 def 키워드의 목적은?
a) “다음 코드는 정말 멋지다”는 의미의 은어입니다.
b) 함수의 시작을 나타냅니다.
c) 다음 들여쓰기된 코드 섹션이 나중에 저장될 것임을 나타냅니다.
d) b와 c 모두 참입니다.
e) 위의 어느 것도 아닙니다.
  • (정답) d) b와 c 모두 참입니다.

  • (2) 다음 코드의 예상 출력 결과는?
def fred():
    print("Zap")
def jane():
    print("ABC")

jane()
fred()
jane()

a) Zap ABC jane fred jane
b) Zap ABC Zap
c) ABC Zap jane
d) ABC Zap ABC
e) Zap Zap Zap
  • (정답) d) ABC Zap ABC

  • (3) 주 40시간을 초과하여 일한 시간에 대해 1.5배의 시급을 지급하는 시간외 근무에 대한 임금 계산을 위해 computepay라는 이름의 파이썬 함수를 만드세요. 이 함수는 두 개의 매개변수인 hours와 rate를 받아 총 임금을 계산해야합니다. (밑줄에 들어갈 코드를 작성하세요.)
# 가능하면 직접 코딩 해보세요.
# 아니면 아래 빈칸을 채워보세요.
def computepay(_____, _____):
    # 근무 시간이 40시간을 초과하는지 확인
    if _____ > 40:
        # 초과 근무 시간 계산
        overtime_hours = _____ - 40
        # 40시간에 대한 정규 임금과 초과 근무 시간에 대해 1.5배 시급 적용
        total_pay = (40 * _____) + (overtime_hours * _____ * 1.5)
    else:
        # 초과 근무가 없으면 일반 계산
        total_pay = _____ * _____
    return total_pay

# 사용자로부터 근무 시간과 시급 입력 받기
hours = float(_____("Enter Hours: "))
rate = float(_____("Enter Rate: "))

# 함수를 사용하여 임금 계산 후 출력
pay = computepay(hours, rate)
print("Pay:", pay)
  • (정답)
def computepay(hours, rate):
    # 근무 시간이 40시간을 초과하는지 확인
    if hours > 40:
        # 초과 근무 시간 계산
        overtime_hours = hours - 40
        # 40시간에 대한 정규 임금과 초과 근무 시간에 대해 1.5배 시급 적용
        total_pay = (40 * rate) + (overtime_hours * rate * 1.5)
    else:
        # 초과 근무가 없으면 일반 계산
        total_pay = hours * rate
    return total_pay

# 사용자로부터 근무 시간과 시급 입력 받기
hours = float(input("Enter Hours: "))
rate = float(input("Enter Rate: "))

# 함수를 사용하여 임금 계산 후 출력
pay = computepay(hours, rate)
print("Pay:", pay)
  • (4) 성적 프로그램을 computegrade 라는 함수를 사용하여 재작성 하세요. 이 함수는 점수를 매개변수로 받아 해당 성적을 문자열로 반환해야 하며, 숫자가 아닌 입력이나 유효 범위(0.0 에서 1.0)를 벗어난 점수 처리도 가능해야 합니다. (밑줄에 들어갈 코드를 작성하세요.)
   Score  Grade
>= 0.9   A
>= 0.8   B
>= 0.7   C
>= 0.6   D
<  0.6   F
_____ computegrade(score): # computegrade 함수 선언
    _____:
        score = float(score)
        if score < 0.0 _____ score > 1.0:
            return "Bad score" # return 이 실행되면 함수도 종료됨
        elif score >= 0.9:
            return "A"
        elif score >= 0.8:
            return "B"
        elif score >= 0.7:
            return "C"
        elif score >= 0.6:
            return "D"
        else:
            return "F"
    _____ ValueError:
        return "Bad score"

# 사용자에게 점수 입력 요청
user_input = input("Enter score: ")

# 성적 계산 및 표시
grade = computegrade(user_input)
print(grade)
  • (정답)
def computegrade(score): # computegrade 함수 선언
    try:
        score = float(score)
        if score < 0.0 or score > 1.0:
            return "Bad score" # return이 실행되면 함수도 종료됨
        elif score >= 0.9:
            return "A"
        elif score >= 0.8:
            return "B"
        elif score >= 0.7:
            return "C"
        elif score >= 0.6:
            return "D"
        else:
            return "F"
    except ValueError:
        return "Bad score"

# 사용자에게 점수 입력 요청
user_input = input("Enter score: ")

# 성적 계산 및 표시
grade = computegrade(user_input)
print(grade)

파이썬 기초 강좌: 5. 반복문 예제와 실습 (Python Basics – Loop Examples and Exercises)

Leave a Comment