본문 바로가기
프로그래밍/Python

[AI 부트캠프] DAY 11 - 파이썬 5

by HOHHOH 2023. 8. 1.

[오늘의 일지]

파이썬 온라인 실시간 강의 - 반복문부터 클래스까지의 내용

[상세 내용]

파이썬 기본 내용 및 실습

반복문

- try, except(오류처리 혹은 예외처리) : try, except 구문은 오류 발생가능성이 있는 구문을 처리하거나 반드시 오류가 발생하는 구문을 감싸 정상적인 프로그램 흐름이 이어질 수 있도록 처리하는 예외처리 구문입니다.

# try, except 형식
try:
    처리하고 싶은 코드
    
except 오류명:
    try로 처리하지 못한 작업을 처리하기 위한 코드

 

- try, except를 이용한 연습문제 : 간단한 ATM기 시스템

# try, except 사용 예시
# 간단한 ATM기 시스템을 만들어보겠습니다.
# 사용자로부터 메뉴를 입력받습니다.
# 입금
# 출금
# 잔액확인
# 종료
# 입력받은 메뉴에 따라 계좌잔액에 입금과 출금을 적용하고 잔액을 출력해봅시다. 
# 종료메뉴는 while 문을 빠져나오도록 프로그램을 종료시킵니다.

account = 0
while True:
    msg = '''
    -------------------------------------------------------------
    안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
    1. 입금
    2. 출금
    3. 잔액확인
    4. 종료
    -------------------------------------------------------------
    '''
    print(msg)
    
    menu = input('원하시는 서비스 메뉴를 실행 번호로 입력 해주세요. : ')

    if menu == '1':
        try:
            Deposit = int(input('입금하실 금액을 적어주세요. : '))
            account += Deposit
            print(f'귀하의 현재 잔액은 {account}입니다.')
        except ValueError:
            print('서비스 입력이 잘못 되었습니다. 금액만 입력해주세요. 시작 메뉴로 돌아갑니다.')
            pass
        
        
    elif menu == '2':
        try:
            Withdrawal = int(input('출금하실 금액을 적어주세요. : '))
            if account >= Withdrawal:
                account -= Withdrawal
                print(f'귀하의 현재 잔액은 {account}입니다.')
            else:
                print('잔액이 부족합니다.')
        except ValueError:
            print('서비스 입력이 잘못 되었습니다. 금액만 입력해주세요. 시작 메뉴로 돌아갑니다.')
            pass     
       
    
    elif menu == '3':
        try:
            print(f'귀하의 현재 잔액은 {account}입니다.')
        except ValueError:
            print('서비스 입력이 잘못 되었습니다. 금액만 입력해주세요. 시작 메뉴로 돌아갑니다.')
            pass             
       
    
    elif menu == '4':
        print('이용해 주셔서 감사합니다.')
        break
    else: # 위에서 설정한 조건 1, 2, 3, 4 숫자형태로 전달받지 않은 모든 경우
        pass
        print('서비스 입력이 잘못 되었습니다. 실행 번호만 입력해주세요'

 

- try, except를 이용한 연습문제 결과 : 문자를 입력했을 때 발생하는 오류도 수정하였습니다.

    -------------------------------------------------------------
    안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
    1. 입금
    2. 출금
    3. 잔액확인
    4. 종료
    -------------------------------------------------------------
    
원하시는 서비스 메뉴를 실행 번호로 입력 해주세요. : aaa
서비스 입력이 잘못 되었습니다. 실행 번호만 입력해주세요

    -------------------------------------------------------------
    안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
    1. 입금
    2. 출금
    3. 잔액확인
    4. 종료
    -------------------------------------------------------------
    
원하시는 서비스 메뉴를 실행 번호로 입력 해주세요. : 1
입금하실 금액을 적어주세요. : aaa
서비스 입력이 잘못 되었습니다. 금액만 입력해주세요. 시작 메뉴로 돌아갑니다.

    -------------------------------------------------------------
    안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
    1. 입금
    2. 출금
    3. 잔액확인
    4. 종료
    -------------------------------------------------------------
    
원하시는 서비스 메뉴를 실행 번호로 입력 해주세요. : 1
입금하실 금액을 적어주세요. : 1000
귀하의 현재 잔액은 1000입니다.

    -------------------------------------------------------------
    안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
    1. 입금
    2. 출금
    3. 잔액확인
    4. 종료
    -------------------------------------------------------------
    
원하시는 서비스 메뉴를 실행 번호로 입력 해주세요. : 2
출금하실 금액을 적어주세요. : 500
귀하의 현재 잔액은 500입니다.

    -------------------------------------------------------------
    안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
    1. 입금
    2. 출금
    3. 잔액확인
    4. 종료
    -------------------------------------------------------------
    
원하시는 서비스 메뉴를 실행 번호로 입력 해주세요. : 3
귀하의 현재 잔액은 500입니다.

    -------------------------------------------------------------
    안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
    1. 입금
    2. 출금
    3. 잔액확인
    4. 종료
    -------------------------------------------------------------
    
원하시는 서비스 메뉴를 실행 번호로 입력 해주세요. : 4
이용해 주셔서 감사합니다.

 

- 함수와 클래스

- 함수

- 수학적 정의의 함수 : 𝑦 = 𝑓(𝑥)

- 프로그래밍에서의 함수 : 자주 사용해야 하는 코드를 재사용하기 위한 코드의 묶음을 의미한다고 할 수 있습니다.

- 데이터과학에서의 함수 : 입력값을 받아 사용자가 원하는 처리를 한 후 결괏값을 되돌려 받는 코드의 묶음을 의미한다.

-함수의 구조

def 함수이름(파라메터 혹은 매개변수): # 함수이름을 메모리에 저장, 파라메터는 없어도 가능
    
    실행코드 # 함수이름을 호출하면 실행코드가 위에서 아래로 실행
    실행코드 # 보통 기능단위로 코드로 묶어 함수화 한다.
    실행코드 # 실제로는 코드가 메모리에 저장되는 구조를 갖는다.
    
    return 반환값 # 함수에서 실행코드를 거친 결과값을 다시 사용해야 할 경우 값을 반환시킨다.
# 파라메터 혹은 매개변수 : 함수의 입력값, 혹은 함수의 작동에 영향을 줄 수 있는 값(변수)
# 파라메터는 없어도 되지만 세미콜론은 반드시 찍어준다.

 

- 기본적인 함수 예시
# 함수 정의하기

def person():#person이라는 이름값을 앞으로는 내가 정의하는 기능명으로 사용하겠다.
    print('제 이름은 Lee입니다.')
    
# 함수호출 테스트
person()
>>>
제 이름은 LEE입니다.
 

- 입력값(파라미터 혹은 매개변수)을 받는 함수 예시

# 파라메터가 있는 함수 정의
def person_name(x):
    print(f'제 이름은 {x}입니다.')
# 함수 호출 시 실행 될 구문
person_name('Lee')
>>>
제 이름은 lee입니다.

 

- 함수 안에서 정의된 변수

def person_name(x):
    add = '지역'
    age = 30
    print(f'제 이름은 {x}입니다.')

# 함수 내부에서 정의 된 age 변수는 함수 내부에서만 정의되는 변수로서 함수 밖에서는 호출할 수 없다.

# 그렇기에 다른 함수에서 같은 이름의 변수를 사용해도 관계없음

# 함수 연산 결과로서 결과값을 빼기 위해서는 반드시 **return**구문으로 반환값을 사용해줘야 함

# 함수도 기본컴퓨터의 작동프로세스와 같이 입력, 처리, 출력의 처리를 하기위한 구조를 가짐

 

- 숫자 개수를 입력받고 그 숫자를 리스트에 저장하고 리스트의 총합을 출력하는 함수 예시

# 예시
def exam(x):
    total = []
    for i in range(x):
        num = int(input('합을 계산 할 숫자를 입력하세요 : '))
        total.append(num)
    return sum(total)
# 함수호출
exam(5)
>>>
합을 계산 할 숫자를 입력하세요 : 4
합을 계산 할 숫자를 입력하세요 : 3
합을 계산 할 숫자를 입력하세요 : 2
합을 계산 할 숫자를 입력하세요 : 1
합을 계산 할 숫자를 입력하세요 : 2
12

 

- 반환을 사용하는 함수

# 함수 내부에서 정의 된 변수를 사용하기 위해서는 값을 반환(return) 시켜야 한다.
# x와 y의 합을 반환시킴
def bmi(x, y):

    bmi =x/(y/100)**2
    if  30 <= bmi :
        print('비만입니다.')
    elif 24 <= bmi < 30 :
        print('과체중입니다.')
    elif 20 <= bmi < 24 :
        print('표준체중입니다.')
    else :
        print('저체중입니다.')
    return bmi
# 함수 호출
bmi(80,175)
>>>
과체중입니다.
26.122448979591837

 

- 지금까지 알게 모르게 사용했던 함수들

print() 
int()
str()
float()  
input()  
list()  
dict()  
range()  
list.append()

 

- 심플한 계산기 만들기

# 덧셈
def cal_sum(x, y):
    z = x + y
    return z
    
# 뺄셈
def cal_minus(x, y):
    z = x - y
    return z
    
# 곱셈
def cal_multy(x, y):
    z = x * y
    return z
    
# 나눗셈
def cal_division(x, y):
    z = x / y
    return z

 

- 파이썬 예약어로 지정된 함수 쪼개보기

# sum() 함수는 python 언어에 내장되어 있는 함수입니다.

# 파라메터로 iterable 변수 즉, 반복문으로 내부 인자의 루프를 돌 수 있는 변수를 받습니다.

# max() 함수도 python 내장 함수로서 sum()과 같은 형식의 입력값을 받아 최대값을 반환하는 함수입니다.

 

- sum() 함수 쪼개보기
test_list = [1, 2, 3, 4, 5]
sum(test_list)
>>>
15

# sum_sum을 함수 이름으로 갖는 python sum() 함수를 재현해보기
def sum_sum(x):
    total = 0
    for i in x:
        total += i
    return total
sum_sum(test_list)
>>>
15

 

- max() 함수 쪼개보기

# max_max를 함수 이름으로 갖는 python max() 함수를 재현해보기
def max_max(x):
    x.sort()
    return x[-1]
>>>
5

# 다양한 방식이 있다
def max_max(x):
    max_num = -99999999999999
    for i in x:
        if max_num < i:
            max_num = i
            
    return max_num
max_max(test_list)
>>>
5

 

- 클래스 : 같은 목적 혹은 대상을 위해 만들어진 함수들의 묶음

클래스의 선언은 함수와 달리 소괄호 없이 선언한다.

클래스명은 단어의 첫 알파벳을 대문자로 ex) MyClass, SumTotal

클래스 선언 이후 처음 작성하는 __init__ 함수는

클래스가 정의되면서 입력되는 파라미터를 저장하고 재사용하기 위한 초기화함수

클래스 내 함수의 파라미터 맨 앞은 항상 **self**를 추가해주어야 하며,

__init__ 함수에서 설정한 변수 할당 시에도 self를 추가해 준다.

self. 변수는 클래스 내부에서 사용되며 클래스 내부에 있는 모든 함수에 사용이 가능하다.

- 클래스의 구조

class 클래스명: # 클래스 이름을 선언(저장), 앞으로 해당 이름은 클래스로 지정함
    
    def __init__(self, x): # 클래스 내부에 속한 함수임을 표현하기 위해 self 키워드를 파라메터에 추가
        # 클래스를 만들면서 입력받는 파라메터를 클래스 내에서 사용가능 하도록 초기화
        self.x = x 
        # 변수 x는 클래스가 만들어지며 전달받는 파라메터
        # self.x는 파라메터를 전달받아 클래스 내부에서 사용가능한 형태로 초기화한 변수
        
    def 함수명(self, 파라메터): # 클래스 내부에 속한 함수임을 표현하기 위해 self 키워드를 파라메터에 추가
        실행코드
        실행코드
        실행코드
        return 반환값

 

- 계산기 클래스

# 클래스의 형태를 눈으로 익혀봅시다.
class Calculator: # 클래스 선언
    
    def __init__(self, x, y): # 초기화함수
        self.x = x # 클래스 내 변수 초기화
        self.y = y
        
    def my_sum(self): # 함수 정의
        z = self.x + self.y
        return z

    def my_minus(self):
        z = self.x - self.y
        return z

    def my_multiply(self):
        z = self.x * self.y
        return z

    def my_division(self):
        z = self.x / self.y
        return z
# 클래스의 호출
Calculator
>>>
__main__.Calculator

 

 - 패키지(packages), 모듈(modules)

- random 패키지 사용해보기
random 은 파이썬 내장 패키지(모듈)입니다.
랜덤한 값을 생성하거나 뽑아오는데 사용합니다.

random 모듈 불러오기 import random

random 모듈의 자주 사용하는 함수
random .random() : 0 ~ 1 사이의 실수를 하나 반환
random .randint(a, b) : a ~ b 사이의 정수를 하나 반환
random .choice(list 혹은 데이터집합) : list의 무작위 샘플하나를 반환
random .sample(list 혹은 데이터집합, N(샘플링 할 데이터의 갯수)) : list의 무작위 샘플 N개를 반환
random .suffle(list 혹은 데이터집합) : list 순서 섞기

 

- random 패키지 예시

# random 모듈 불러오기
import random

# 0 ~ 1 사이의 실수를 하나 반환
random.random()
>>>
0.05399278623109127

# a ~ b 사이의 정수를 하나 반환
random.randint(0, 10)
>>>
3

test_list = [13, 2, 3, 45, 6, 21, 39]
# list의 무작위 샘플하나를 반환
random.choice(test_list)
>>>
2

# list의 무작위 샘플  N개를 반환
random.sample(test_list, 3)
>>>
[21, 2, 13]

# list 순서 섞기
random.shuffle(test_list)
test_list
>>>
[39, 13, 21, 45, 2, 6, 3]

 

- 로또 번호 생성기 만들어 보기

# 심플하게 만들기
lotto_list = [i for i in range(1,46)]
for i in range(5):
    print(random.sample(lotto_list, 6))
>>>

[24, 4, 40, 2, 26, 33]
[39, 24, 13, 11, 19, 7]
[26, 24, 32, 23, 44, 30]
[42, 29, 39, 41, 45, 23]
[25, 31, 27, 29, 14, 6]

 

 - 최종 버전 스무고개 게임

  • 컴퓨터와 스무고개 게임을 하는 프로그램을 만들어보겠습니다.
  • random 모듈로 컴퓨터가 1 ~ 100 중 숫자를 하나 선택하게 합니다.
  • 게이머에게 입력받은 숫자를 판별하여 업, 다운, 정답을 출력하는 프로그램입니다.
  • 게임 횟수는 10회이며, 10회 동안 정답을 못 맞출 경우 실패 문구를 출력하도록 프로그램을 짜 보겠습니다.
  • 선택) 사용자에게 최소숫자, 최대숫자를 입력받아 random으로 생성
import random

def game_20(x,y):
    com = random.randint(x, y)
    for i in range(10):
        num = int(input('숫자를 입려하세요 : '))
        if num > com:
            print('다운')
        elif num < com :
            print('업')
        else :
            print('정답입니다.')
            break
        if i == 9:
            print('실패입니다.')
# 함수 호출
game_20(1,100)
>>>
숫자를 입려하세요 : 20
다운
숫자를 입려하세요 : 10
업
숫자를 입려하세요 : 15
업
숫자를 입려하세요 : 16
업
숫자를 입려하세요 : 17
업
숫자를 입려하세요 : 18
정답입니다.

 

- 이번 강의 마지막 연습문제 : ATM 시스템 클래스화(실패:메뉴 이용 시 계좌금액이 저장이 안 되고 초기화되는 상황)

class ATM:
    def __init__(self):
        
        self.account = 0
  
    # menu
    def menu(self):
        while True:
            
            msg = '''
                -------------------------------------------------------------
                안녕하세 AI 은행입니다. 원하시는 서비스 메뉴를 입력 해주세요.
                1. 입금
                2. 출금
                3. 잔액확인
                4. 종료
                -------------------------------------------------------------
                '''
            print(msg)
            
            menu = input('원하시는 서비스 메뉴를 숫자로 입력 해주세요. : ')
            
            if menu == '1':
                ATM().deposit()
            elif menu == '2':
                ATM().withdrawal()
            elif menu == '3':
                ATM().Balance()
            elif menu == '4':
                print('이용해 주셔서 감사합니다.')
                break 
            else :
                pass
                print('서비스 입력이 잘못 되었습니다. 숫자만 입력해주세요')


    # 입금
    def deposit(self):
        try:
            num = int(input('입금하실 금액을 적어주세요. : '))
            self.account += num
            return print(f'귀하의 현재 잔액은 {self.account}입니다.')
        except ValueError:
            print('서비스 입력이 잘못 되었습니다. 금액만 입력해주세요. 시작 메뉴로 돌아갑니다.')
            pass 
       
    # 출금 
    def withdrawal(self):
        try:
            num = int(input('출금하실 금액을 적어주세요. : '))
            if self.account >= num:
                self.account -= num
                return print(f'귀하의 현재 잔액은 {self.account}입니다.')
            else:
                print('잔액이 부족합니다.')
        except ValueError:
            print('서비스 입력이 잘못 되었습니다. 금액만 입력해주세요. 시작 메뉴로 돌아갑니다.')
            pass
       
    # 잔액확인
    def Balance(self):
        return print(f"현재 잔액은 {self.account}입니다.")

 

[마무리]

 2일에 걸친 파이썬 기초 실시간 강의가 마무리되었습니다. 녹화 강의를 포함해서 3번 정도의 반복으로 파이썬의 기초에 대한 수업이 이루어졌는데 그래도 어느 정도 함수까지는 이해하는데 큰 어려움은 없었던 거 같습니다. 특히 for문이나 while문은 연습문제를 풀면서 더 이해가 잘 되었던 거 같습니다. 다만 마지막 부분에 나왔던 클래스 파트는 아직도 뭐가 뭔지 이해가 잘 안 되는 느낌을 받았습니다. 아직 남아있는 수업을 통해서 클래스 파트에 대한 이해할 수 있게 더 노력해 봐야 할 거 같습니다.

반응형

댓글