본문 바로가기
  • Coding & Book
학습단/Python 학습단

4주차 완료입니다.

by 루이3 2023. 7. 28.

학습인증


7/24


클래스 변수

  • 한 클래스로 만들어진 객체에 일괄적으로 무언가를 적용하기 위해 인스턴스 변수가 아닌
    클래스 변수로 정의해야 합니다.
  • 클래스명 바로 밑에 정의하고 클래스로부터 만들어진 모든 객체에 값이 일괄적으로 적용됩니다.

 

게임 만들기(완성)

  • 공격하는 과정에서 우리 편도 피해를 입습니다.(피해는 난수값으로 지정)
  • Unit 클래스를 공격 유닛인 AttackUnit 클래스가 상속받습니다.
  • 지상공격 유닛인 보병과 탱크를 Soldier와 Tank 클래스를 정의합니다.
  • 공중유닛을 위해 비행 기능을 제공하는 Flyable 클래스를 정의합니다.
  • 공중 공격 유닛인 FlyableAttckUnit 클래스는 Flyable 클래스와 AttackUnit 클래스 다중 상속받습니다.
  • 전투기 유닛을 위한 Stealth 클래스를 정의합니다.

 

from random import *

class Unit:
    def __init__(self, name, hp, speed):
        self.name = name
        self.hp = hp
        self.speed = speed
        print("{0} 유닛을 생성했습니다.".format(name))
        
        
    def move(self, location):
        print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed))


    def damaged(self, damage):
        print("{0} : {1}만큼 피해를 입었습니다.".format(self.name, damage))
        self.hp -= damage
        print("{0} : 현재 체력은 {1}입니다.".format(self.name, self.hp))
        
        if self.hp <= 0:
            print("{0} : 파괴됐습니다.".format(self.name))



class AttackUnit(Unit):
    def __init__(self, name, hp, damage, speed):
        Unit.__init__(self, name, hp, speed)
        self.damage = damage

    def attack(self, location):
        print("{0} : {1} 방향 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage))



class Soldier(AttackUnit):
    def __init__(self):
        AttackUnit.__init__(self, "보병", 40, 5, 1)


    def booster(self):
        if self.hp > 10:
            self.hp -= 10
            print("{0} : 강화제를 사용합니다. (HP 10 감소)".format(self.name))
        else:
            print("{0} : 체력이 부족해 기술을 사용할 수 없습니다".format(self.name))


class Tank(AttackUnit):
    siege_developed = False

    def __init__(self):
        AttackUnit.__init__(self, "탱크", 150, 35, 1)
        self.siege_mode = False

    def set_siege_mode(self):
        
        if Tank.siege_developed == False:
            return
 
        if self.siege_mode == False:
            print("{0} : 시지 모드로 전환합니다.".format(self.name))
            self.damage *= 2
            self.siege_mode = True

        else:
            print("{0} : 시지 모드를 해제합니다.".format(self.name))
            self.damage //= 2
            self.siege_mode = False



class Flyable:
    def __init__(self, flying_speed):
        self.flying_speed = flying_speed

    def fly(self, name, location):
        print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed))


class FlyableAttackUnit(AttackUnit, Flyable):
    def __init__(self, name, hp, damage, flying_speed):
        AttackUnit.__init__(self, name, hp, damage, 0)
        Flyable.__init__(self, flying_speed)

    def move(self, location):
        self.fly(self.name, location)


class Stealth(FlyableAttackUnit):
    def __init__(self):
        FlyableAttackUnit.__init__(self, "전투기", 80, 20, 5)
        self.cloaked = False

    def cloaking(self):
        
        if self.cloaked == True:
            print("{0} : 은폐 모드를 해제합니다.".format(self.name))
            self.cloaked = False
        
        else:
            print("{0} : 은폐 모드를 설정합니다.".format(self.name))
            self.cloaked = True

def game_start():
    print("[알림] 새로운 게임을 시작합니다.")


def game_over():
    print("Player : Good Game")
    print("[Player] 님이 게임에서 퇴장했습니다.")


game_start()

so1 = Soldier()
so2 = Soldier()
so3 = Soldier()

ta1 = Tank()
ta2 = Tank()

st1 = Stealth()

attack_units = []
attack_units.append(so1)
attack_units.append(so2)
attack_units.append(so3)
attack_units.append(ta1)
attack_units.append(ta2)
attack_units.append(st1)

for unit in attack_units:
    unit.move("1시")

Tank.siege_developed = True
print("[알림] 탱크의 시지 모드 개발이 완료됐습니다.")


for unit in attack_units:
    if isinstance(unit, Soldier):
        unit.booster()
    elif isinstance(unit, Tank):
        unit.set_siege_mode()
    elif isinstance(unit, Stealth):
        unit.cloaking()


for unit in attack_units:
    unit.attack("1시")


for unit in attack_units:
    unit.damaged(randint(5, 20))
        
game_over()

7/25


예외처리

  • 예상치 못한 실수 또는 잘못된 무언가를 오류라고 합니다.
  • 오류 상황에 대처하는 것을예외 처리라고 합니다.
  • 예시로 어떤 사이트에 접속하려는데 URL 주소를 잘못 적은 경우를 말합니다.

 

try-except 문

  • try 문의 하위에 있는 명령문을 실행하다가 오류가 발생하면 프로그램을 종료하지 않고
    except 문의 오류 종류와 일치하는지 확인합니다.
  • 일치하는 경우 except 문의 하위 명령문들이 실행됩니다.
try:
	실행할 명령1
	실행할 명령2
    ...
 except 오류 종류:
 	예외 처리 명령1
	예외 처리 명령2
    ...

 

as

  • 오류가 발생할 때 표시하는 오류 메시지를 가져와 출력하도록 예외처리를 할 수 있습니다.
  • 예외처리 형식에서 except 뒤 as 키워드 변수명을 추가해주면 됩니다.
try:
    실행할 명령1
    실행할 명령2
    ...
 except 오류 종류:
 	예외 처리 명령1
	예외 처리 명령2
    ...
 except 오류 종류2 as 변수명:
 	예외 처리 명령1
	예외 처리 명령2
    ...

 

예시)

try:
    print("나누기 전용 계산기")
    nums = []
    nums.append(int(input("첫 번째 숫자를 입력: ")))
    nums.append(int(input("두 번째 숫자를 입력: ")))
    print("{0}/{1} = {2}".format(nums[0], nums[1], nums[2]))
except ValueError:
    print("잘못된 값 입력")
except ZeroDivisionError as err:
    print(err)
except Exception as err:
    print("알수 없는 오류가 발생")
    print(err)

 

 

오류 발생시키기

  • 아래 코드를 이용해 의도적으로 오류를 발생시킬 수 있습니다.
raise 오류 종류

 

예시)

try:
    print("나누기 전용 계산기")
    num1 = int(input("첫 번째 숫자를 입력: "))
    num2 = int(input("두 번째 숫자를 입력: "))
    if num1 >= 10 or num2 >= 10:
        raise ValueError
    print("{0}/{1} = {2}".format(num1,num2, int(num1/num2)))
    
except ValueError:
    print("잘못된 값 입력")

7/26


오류와 상관없이 무조건 실행하기 (finally)

  • finally는 try 문에서 오류가 발생하든 말든 try 문을 벗어나는 시점에 무조건 실행됩니다.
  • 작성 시 try와 except로 이루어진 구문의 가장 밑에 정의해주시면 됩니다.
try:
    실행할 명령1
    실행할 명령2
    ...
 except 오류 종류:
 	예외 처리 명령1
	예외 처리 명령2
    ...
 except 오류 종류2 as 변수명:
 	예외 처리 명령1
	예외 처리 명령2
    ...
finally:
    실행할 명령1
    실행할 명령2
    ....

 


 

 

실습문제: 치킨 주문하기

문제

 

항상 대기 손님이 많은 맛있는 치킨 가게가 있습니다.

손님들의 대기시간을 줄이고자 자동 주문 프로그램을 만들었습니다.

다음 코드를 확인하고 적절한 예외 처리 구문을 추가하세요

 

 

조건

 

1보다 작거나 숫자가 아닌 입력값이 들어올 때 ValueError로 처리합니다.

대기손님이 주문할 수 있는 최대 주문량은 10마리입니다.

치킨 소진 시 오류(SoldOutError)를 발생시키고 프로그램을 종료합니다.

 

chicken = 10
waiting = 1

while True:
    print("남은치킨:{0}".format(chicken))
    order = int(input("치킨을 몇마리 주문하시겠습니까?"))
    if order >chicken:
        print("재료 부족")
    else:
        print("대기번호 {0}, {1}마리를 주문하셧습니다.".format(waiting, order))
        waiting +=1
        chicken -= order

 

 


문제 풀어보기

chicken = 10
waiting = 1

class SoldOutError(Exception):
    pass

while True:
    try:
        print("남은치킨:{0}".format(chicken))
        order = int(input("치킨을 몇마리 주문하시겠습니까?"))
        if order >chicken:
         print("재료 부족")
        elif order <=0:
         raise ValueError
        else:
            print("대기번호 {0}, {1}마리를 주문하셧습니다.".format(waiting, order))
            waiting +=1
            chicken -= order
        
        
        if chicken ==0:
            raise SoldOutError

    except ValueError:
        print(ValueError)
        
    except SoldOutError:
        break

 

7/27


모듈

  • 파이썬에서 서로 관련이 있거나 비슷한 기능을 하는 함수, 클래스를 담고 있는 파일을 제공하는 것을 말합니다.
  • 프로그램의 기능을 독립적인 작은 단위로 나누는 작업을 모듈화라고 합니다.

 

모듈 사용하는 방법

 

& import문

  • 기본적인 방법으로 import문인데 파일명에서 확장자. py를 제외한 모듈명만 적어주시면 됩니다.

예를 들어 theater_moudle.py라는 모듈을 만들었을 경우 theater_moudle 이 모듈명입니다.

import theater_moudle

theater_moudle.price(3)
theater_moudle.price_morning(1)

 

위와 같이 긴 이름을 계속 적기에는 효율이 떨어지므로 as를 이용해 아래와 같이 줄일 수 있습니다.

import theater_moudle as mv

mv.price(3)
mv.price_morning(1)

 

 

 

& from ~ import문

  • from 뒤에 모듈명을 적고 모듈에서 가져다 사용할 기능이나 함수를 import 뒤에 적어주면 됩니다.
  • 모듈은 모듈명과 점 없이 모듈의 함수명만 적으면 됩니다.
  • import 뒤에 * 는 모든 기능을 뜻하는 것이고 모든 기능이 필요하지 않을 때는 사용하려는 함수명만 적어주시면 됩니다.
from theater_moudle import *

price(3)
price_morning(1)

 

 

패키지

  • 여러 모듈을 모아 놓은 집합을 파이썬에서는 패키지라고 합니다.
  • __init__. py를 넣어 해당 폴더가 패키지라는 것을 명시하기 위해 사용하기도 합니다.
  • 파이썬 3.3 버전부터는__init__. py 파일이 없어도 상관없습니다.

travel 패키지

 

패키지 사용 방법

 

& import문

  • 패키지명 뒤에 점을 찍고 모듈명을 적어 import문으로 가져오면 됩니다.
import travel.thailand

trip_to = travel.thailand.ThailandPackage()
trip_to.detail()

 

 

 

&from ~import문

  • 모듈과 비슷합니다.
from travel.thailand import ThailandPackage

trip_to = ThailandPackage()
trip_to.detail()

 

 

 

 

모듈 공개 설정하기

  • __all__이라는 변수에 리스트 형태로 모듈명을 넣으면 해당 모듈을 공개로 설정할 수 있습니다.
  • 명시적으로 공개할 식별자들을 지정하면 모듈을 사용하는 사용자에게 모듈의 인터페이스를 명확하게 보여줍니다.
__all__ = ['vietnam"]

 

 

 

 

모듈 직접 실행하기

  • 모듈의 기능이 올바르게 동작하는지 확인하기 위해 사용합니다.
  • 모듈을 직접 실행할지 혹은 별도 파일을 호출해서 실행할지 아래와 같이 구분할 수 있습니다.
  • __name__은 현재 모듈(작성한 파이썬 파일)의 이름을 값으로 가지는 내장 변수입니다.
  • 모듈이 직접 실행되면 __name__ 값은 __main__ 으로 설정됩니다.
if __name__ == "__main__" #직접 실행
	pass
else:	#외부호출
	pass

 

 

 

 

패키지와 모듈 위치 확인하기

  • 모듈의 위치를 확인하기 위해 getfile() 함수를 사용하면 됩니다.
  • getfile() 함수 inspect라는 모듈에 속합니다.
  • 예시로 random 모듈의 위치를 파악하기 위해 아래와 같이 써주시면 됩니다.
import inspect
import random

print(inspect.getfile(random))

 

7/28


PyPI

  • PyPI는 파이썬용 패키지 저장소입니다
  • 사이트 주소는 아래와 같습니다.

https://pypi.org/

 

PyPI · The Python Package Index

The Python Package Index (PyPI) is a repository of software for the Python programming language.

pypi.org

 

 

PyPI 사용하는 방법

사이트에 접속하신 후 가운데에 있는 browse projects를 클릭해 줍니다.

 

 

 

눌러주시면 왼쪽에 많은 주제들이 있는 것을 확인하실 수 있습니다.

 

 

이중 웹스크래핑 분야에서 자주 사용하는 BeautifulSoup4 패키지를 한번 사용해 보겠습니다.

beautifulsoup를 검색을 하셔서 상단에 있는 beautifulsoup4 4.12.2를 눌러줍니다.

 

 

눌러주시면 창이 하나 뜹니다.

여기서 제목 아래에 있는 pip install beautifulsoup4 가 있는데 이는 패키지 설치 명령어입니다.

이를 복사해 주시고 VSCode에서 마우스 오른쪽 버튼을 클릭하거나 ctrl +v를 눌러 복사해 주신 것을 붙여 넣어주시고
enter를 눌러주시면 됩니다. 

 

 

 

 

 

 

설치가 끝났으면 Quick start에 나온 예제 코드를 복사해주시고 실행해 주시면 됩니다.

from bs4 import BeautifulSoup
soup = BeautifulSoup("<p>Some<b>bad<i>HTML")
print(soup.prettify())

 

 

pip 명령 사용방법

옵션 설명 사용법
install 패키지 설치 pip install [패키지명]
install --upgrade 패키지 업그레이드 pip install --upgrade  [패키지명]
uninstall 패키지 삭제 pip uninstall [패키지명]
list 설치 패키지 목록 pip list
show 패키지 상세 정보 pip show [패키지명]

 

 

내장함수 dir()

  • dir() 함수는 어떤 객체를 전달값으로 넘기면 이 객체가 어떤 변수와 함수를 가지고 있는지 알려줍니다.
  • 전달값이 빈값이면 현재 소스코드 안에서 사용할 수 있는 모듈 혹은 객체를 출력합니다.
  • 코드 마지막 부분에는 random 모듈을 직접 전달값으로 설정한 것입니다.
    (random 모듈 안에 있는 모든 것을 출력해 줍니다.)
print(dir())

import random
print (dir())
print(dir(random))

 

추가로 내장함수에 관한 내용은 아래 사이트에서 확인하시면 됩니다.

https://docs.python.org/ko/3/library/functions.html

 

Built-in Functions

The Python interpreter has a number of functions and types built into it that are always available. They are listed here in alphabetical order.,,,, Built-in Functions,,, A, abs(), aiter(), all(), a...

docs.python.org

 

 

외장함수 사용하기

  • 외장함수는 반드시 import 해야 프로그램 안에서 사용할 수 있습니다.
  • 파이썬에서 제공하는 모듈은 아래 사이트에서 확인할 수 있습니다.

https://docs.python.org/ko/3/py-modindex.html

 

Python 모듈 목록 — Python 3.11.4 문서

numbers Numeric abstract base classes (Complex, Real, Integral, etc.).

docs.python.org

 

자주 사용하는 모듈

  • 첫 번째는 어떤 경로에 있는 폴더 또는 파일을 조회할 때 사용하는 glob 모듈입니다.
  • 두 번째는 운영체제에서 제공하는 기본 기능을 사용할 수 있는 os 모듈입니다.
  • 세 번째는 시간 관련 함수를 제공하는 time 모듈입니다.
  • 아래는  시간 관련 함수에 사용하는 날짜 시간 포맷 코드와 실행결과 예시입니다.
코드 의미
%Y
%m
%d
%H
%M
%S

 

import glob
print(glob.glob("11-9.py")) #확장자가 py인 11-9 파일 출력
print("---------------------------------")
import os
print(os.getcwd()) #현재 작업 폴더위치
print("---------------------------------")
import time
print(time.localtime) #현재 시간 정보 반환

 

 

 

 

 


실습문제: 나만의 모듈 만들기

 

문제

 

프로젝트에 나만의 서명을 남기는 모듈을 만들어 보세요

 

조건

 

모듈 파일명은 byme.py라고 짓는다.

 

11-10.py

import byme

byme.sign()

 

 

byme.py

def sign():
    print("Python 끝")
    print("유튜브 없음")
    print("기록 끝")

 

 


4주 차 일별

https://loui3.tistory.com/133

 

9-3장(게임 만들기3)

클래스 변수 한 클래스로 만들어진 객체에 일괄적으로 무언가를 적용하기 위해 인스턴스 변수가 아닌 클래스 변수로 정의해야 합니다. 클래스명 바로 밑에 정의하고 클래스로부터 만들어진 모

loui3.tistory.com

https://loui3.tistory.com/134

 

10장 예외처리하기

예외처리 예상치 못한 실수 또는 잘못된 무언가를 오류라고 합니다. 오류 상황에 대처 하는것을 예외 처리라고 합니다. 예시로 어떤 사이트에 접속하려는데 URL 주소를 잘못 적은 경우를 말합니

loui3.tistory.com

https://loui3.tistory.com/137

 

10장 예외 (finally + 실습문제)

오류와 상관 없이 무조건 실행하기 (finally) finally는 try 문에서 오류가 발생하든 말든 try 문을 벗어나는 시점에 무조건 실행됩니다. 작성시 try 와 except로 이루어진 구문의 가장 밑에 정의 해주시

loui3.tistory.com

https://loui3.tistory.com/139

 

11장 모듈 다루기

모듈 파이썬에서 서로 관련이 있거나 비슷한 기능을 하는 함수, 클래스를 담고 있는 파일을 제공하는 것을 말합니다. 프로그램의 기능을 독립적인 작은 단위로 나누는 작업을 모듈화라고 합니

loui3.tistory.com

https://loui3.tistory.com/144

 

12장 패키지 설치하기(+실습문제)

PyPI PyPI는 파이썬용 패키지 저장소 입니다 사이트 주소는 아래와 같습니다. https://pypi.org/ PyPI · The Python Package Index The Python Package Index (PyPI) is a repository of software for the Python programming language. pypi.org

loui3.tistory.com

 

'학습단 > Python 학습단' 카테고리의 다른 글

12장 패키지 설치하기(+실습문제)  (0) 2023.07.28
11장 모듈 다루기  (0) 2023.07.27
10장 예외 (finally + 실습문제)  (0) 2023.07.26
10장 예외처리하기  (0) 2023.07.25
9-3장(게임 만들기3)  (0) 2023.07.24