본문 바로가기

SK네트웍스 Family AI캠프 10기/Daily 회고

5일차. 함수

더보기
더보기

 

5일 차 회고.

 

 주말 내내 약속이 있어서 쉴 시간이 없었다. 그래서 유난히 피곤한 날이었다. 아직 파이썬 부분이라서 다행이지만, 나중에는 피곤하면 수업을 따라가는 데에 지장이 있을 것 같다. 빨리 일찍 자고 일찍 일어나는 것이 습관이 되어야 할 것 같다.

 

 
 
 

0. 복습

 
 

0-0. 가상환경 생성

 

py -3.13 -m venv .venv
.\.venv\Scripts\activate
python -m pip install --upgrade pip
pip install jupyter

 
 

0-1. 가위 바위 보(사용자 vs. 사용자) 게임

 
게임 방식
- 사용자는 가위, 바위, 보 중에 하나의 값을 입력한다.
- 게임의 승패가 결정될 때까지 게임을 계속 진행한다.
 
GAME enum class: 가위, 바위, 보 입력값, 결괏값 정의 

import enum

class GAME(enum.Enum):
    가위 = {
        '바위': '패배',
        '보': '승리'
    }
    바위 = {
        '가위': '승리',
        '보': '패배'
    }
    보 = {
        '가위': '패배',
        '바위': '승리'
    }

 
UndefinedValue class: GAME class에 정의되지 않은 값이 입력되었을 때 예외 처리

class UndefinedValue(Exception):
    def __init__(self):
        super().__init__("Undefined Value.")

 
Main: 가위 바위 보 게임 진행

i = 1

while True:
    try:
        print("\n------------------\n")
        print(f"{i}번째 게임입니다.")
        i += 1

        A = input("A : [ 가위 | 바위 | 보 ] 중에 입력하세요.")
        A = A.strip()
        if A not in GAME.__members__:
            print("A : 잘못 입력하였습니다.")
            raise UndefinedValue()
        A = GAME[A]
        print(f"A : {A.name}")
    
        B = input("B : [ 가위 | 바위 | 보 ] 중에 입력하세요.")
        B = B.strip()
        if B not in GAME.__members__:
            print("B : 잘못 입력하였습니다.")
            raise UndefinedValue()
        B = GAME[B]
        print(f"B : {B.name}")
    
        if A.name != B.name:
            break

        print("무승부입니다.")
        print("게임을 다시 시작하겠습니다.")

    except Exception as e:
        print(e)

print(f"A가 {A.value[B.name]}했습니다.")
print(f"B가 {B.value[A.name]}했습니다.")

 
 

1-2. 가위 바위 보(사용자 vs. 컴퓨터) 게임

 
컴퓨터와 함께 게임을 하기 위해서는 랜덤으로 값을 생성해주어야 한다.
이때, 사용할 수 있는 것이 random 모듈이다.

import random

random.random()		# 0 ~ 1 사이의 실수값을 랜덤 추출
random.randint(1, 10)	# 1 ~ 10 사이의 실수값을 랜덤 추출
random.choice([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])	# 리스트의 값을 랜덤 추출

 
Main 함수: 가위 바위 보 게임 진행

import random

i = 1

while True:
    try:
        print("\n------------------\n")
        print(f"{i}번째 게임입니다.")
        i += 1

        user = input("USER : [ 가위 | 바위 | 보 ] 중에 입력하세요.")
        user = user.strip()
        if user not in GAME.__members__:
            print("USER : 잘못 입력하였습니다.")
            raise UndefinedValue
        user = GAME[user]
        print(f"USER : {user.name}")
    
        computer = random.choice(list(GAME.__members__.keys()))
        computer = GAME[computer]
        print(f"COMPUTER : {computer.name}")

        if user != computer:
            break
        
        print("무승부입니다.")
        print("게임을 다시 시작하겠습니다.")
        
    except Exception as e:
        print(e)

print(f"USER가 {user.value[computer.name]}했습니다.")

 
 
 

1. 함수

 
 

1-1. 함수 구조

 
함수는 기본적으로 입력 변수출력 변수를 가진다. 하지만 때에 따라 이를 생략할 수 있어 구조는 4가지로 나뉜다.
첫 번째 구조는 입력 변수와 출력 변수를 모두 가지지 않는 구조이다.

"""
def 함수명():
    수행할 프로그램1
    수행할 프로그램2
    ...
"""

def func1():	# func1 함수 정의
    print("Hello World")

func1()		# func1 함수 호출
# Hello World

 
두 번째 구조는 입력 변수는 가지지만 출력 변수를 가지지 않는 구조이다.

"""
def 함수명(입력 변수):
    수행할 프로그램1
    수행할 프로그램2
    ...
"""

def func2(num):	# func2 함수 정의
    print("Hello World " * num)

func2(3)	# func2 함수 호출
# Hello World Hello World Hello World

 
세 번째 구조는 입력 변수는 가지지 않지만 출력 변수를 가지는 구조이다.

"""
def 함수명():
    수행할 프로그램1
    수행할 프로그램2
    ...
    return 출력 변수
"""

def func3():	# func3 함수 정의
    hi = "Hello World"
    return hi

hello = func3()	# func3 함수 호출
print(hello)
# Hello World

 
네 번째 구조는 입력 변수와 출력 변수를 모두 가지는 구조이다.

"""
def 함수명(입력 변수):
    수행할 프로그램1
    수행할 프로그램2
    ...
    return 출력 변수
"""

def func4(num):		# func4 함수 정의
    hi = "Hello World "
    return hi * num

hello = func4(3)	# func4 함수 호출
print(hello)
# Hello World Hello World Hello World

 
 

1-2. Scope

 
변수는 범위에 따라 전역 변수와 지역 변수로 나뉜다.
전역 변수(Global Variable)는 함수 외부에서 선언한 변수로, 함수의 내부와 외부 모든 범위에서 사용이 가능하다.
반면, 지역 변수(Local Variable)는 함수 내부에서 선언한 변수로, 함수의 내부에서만 사용이 가능하다.

global_var = 10		# global_var: 전역 변수

def func():
    local_var = 5	# local_var: 지역 변수

 
함수는 재사용하는 경우가 많기 때문에, 전역 변수를 함수 내부에서 직접 사용하는 것을 지양하는 것이 좋다.
따라서 전역 변수를 매개변수에 넣어 지역 변수로 사용하는 것이 좋다.

global_num = 10		# global_num: 전역 변수

def add(f_num):		# f_num: 지역 변수
    local_num = 5	# local_num: 지역 변수
    return f_num + local_num

result = add(global_num)
print(result)

 
 

1-3. 입력 변수(매개변수, parameter)

 
입력 변수는 없을 수도, 하나일 수도, 또는 두 개 이상일 수도 있다.

def 함수명():
    pass

def 함수명(입력 변수):
    pass

def 함수명(입력 변수1, 입력 변수2, ...):
    pass

 
함수의 입력 변수 개수와 인수 개수는 동일해야 한다.

def add(a, b):
    return a + b

result = add(10, 10)
print(result)
# 20

 
이때, 입력 변수는 기본값을 지정하여, 입력 변수를 전달받지 않았을 때, 대신 사용할 수 있다.

def add(a, b=20):	# b의 Default 값: 20
    return a + b

result = add(10)
print(result)
# 30

 
입력 변수에는 리스트, 튜플, 딕셔너리 등 다양한 형식이 들어갈 수 있다.

def add(lst):
    result = 0
    for i in lst:
        result += i
    return result

add([1, 2, 3, 4])
# 10

 

def add(dic):
    result = 0
    for k in dic.keys()
        result += dic[k]
    return result

add({
    'a': 10, 'b': 20, 'c': 30
})
# 60

 
 

1-4. 가변 인자

 
매개변수의 개수를 모를 때, 가변 인자(*)를 사용한다. 이때, 가변 인자는 리스트로 변환된다.

def add(*args):
    result = 0
    for i in args:
        result += i
    return result

add(1, 2, 3)
# 6

 
매개변수에는 키워드 가변 인자가 있다.
매개변수를 정확한 순서로 전달하기 위해 딕셔너리 형태로 전달해 줄 수 있는데, 이때 키워드 가변 인자(**)를 사용한다.

def add(a, b, c):
    a *= 2
    b *= 3
    c *= 4
    
    return a + b + c

a1 = 10
b1 = 5
c1 = 7

dic = {
    'a': 10, 'b': 5, 'c': 7
}

add(**dic)
# 63

 
 

1-5. 람다(Lambda)

 
람다는 매개변수로 함수를 전달하기 위해 간단한 함수를 식의 형식으로 선언하는 것이다.

"""
lambda 매개변수 : 결과
"""

lambda_add = lambda a, b : a + b
lambda_add(1, 2)
# 3

 
 

1-6. 클로저(Closure)

 
함수 안에 내부 함수를 만들어, 내부 함수가 외부 함수의 지역 변수를 참조하는 것을 클로저라고 한다.

def func_out(out_param):	# func_out(): 외부 함수
    a = 10
    def func_in():		# func_in(): 내부 함수
        return a + out_param	# a: 외부 함수의 지역 변수
    return func_in		# 내부 함수 return

func = func_out(5)
func()		# -> func_in() 함수 실행

 
 

1-7. 콜백 함수(Callback Function)

 
함수의 매개변수로 사용되는 함수를 콜백 함수라고 한다.

def call_func(a, func):		# func: 콜백 함수
    return func(a)

def add_one(num):
    return num + 1

def add_three(num):
    return num + 3

call_func(3, add_one)
# 4

 
 

1-8. 데코레이터(Decorator)

 
데코레이터는 기존 함수를 수정하지 않고 추가 기능을 구현할 때 사용한다.

def decorator_func(param_func):	# 1. 외부에서 실행 함수를 받음
    def wrapper_func(*args):	# 2. 외부에서 받은 실행 함수 전에, 내부 함수 실행
        print("Decoration.")
        param_func(*args)	# 3. 내부 함수에서 외부 함수 실행
    return wrapper_func

@decorator_func		# 데코레이터 실행
def add(a, b):
    print(f"add 함수 실행 결과: {a + b}")
add(1, 2)
# Decoration.
# add 함수 실행 결과: 3

 
함수 실행 시간을 계산할 때 유용하게 사용할 수 있다.

import time

def time_func(param_func):	# param_func(): add() 함수
    def wrapper(*args):
        start = time.time()
        param_func(*args)	# param_func() 함수 실행 -> add() 함수 실행
        end = time.time()
        print("함수 실행 시간: %f초" % (end - start))
    return wrapper

@time_func
def add(a, b):
    print(f"add 함수 실행 결과: {a + b}")
add(1, 2)
# add 함수 실행 결과: 3
# 함수 실행 시간: 0.000293초

 
  
 

2. 가위 바위 보 게임 - 함수 사용

 
 

import enum

class GAME(enum.Enum):
    가위 = {
        '바위': '패배',
        '보': '승리'
    }
    바위 = {
        '가위': '승리',
        '보': '패배'
    }
    보 = {
        '가위': '패배',
        '바위': '승리'
    }

 

class UndefinedValue(Exception):
    def __init__(self):
        super().__init__("Undefined Value.")

 

import random

def value_fixed(name, who):		# value_fixed(): 각 변수에 값 고정
    who = GAME[who]
    print(f"{name} : {who.name}")
    return who

def user_value():			# user_value(): USER의 가위바위보 게임 값 입력
    user = input("USER : [ 가위 | 바위 | 보 ] 중에 입력하세요.")
    user = user.strip()
    if user not in GAME.__members__:
        print(f"USER : 잘못 입력하였습니다.")
        raise UndefinedValue
    user = value_fixed("USER", user)
    return user

def computer_value():			# computer_value(): COMPUTER의 가위바위보 게임 값 설정
    computer = random.choice(list(GAME.__members__.keys()))
    computer = value_fixed("COMPUTER", computer)
    return computer

def game_result(user, computer):	# game_result(): 가위바위보 게임 결과 출력
    print(f"User가 {user.value[computer.name]}했습니다.")

def game():				# game(): 가위바위보 게임 진행
    i = 1

    while True:
        try:
            print("\n----------------------------\n")
            print(f"{i}번째 게임입니다.")
            i += 1

            user = user_value()
            computer = computer_value()

            if user != computer:
                break

            print("무승부입니다.")
            print("게임을 다시 시작하겠습니다.")

        except Exception as e:
            print(e)

    game_result(user, computer)

game()