2025/08/29 Python -7

김기훈·2025년 8월 29일

TIL

목록 보기
9/191

오늘 배운 내용

  • 예외처리
    • 구문오류/예외,런타임 오류
      • 예외를 처리하는 두가지 방법 : 조건문 / try except 구문
        • try except else finally
    • 예외객체와 구분하기
      • Exception as exception
      • raise
  • 모듈
    • 'from','as'구문
    • 'os','datetime','time','urllib',외부 모듈
    • 모듈만들기
    • 패키지
  • 데코레이터
    • 함수데코레이터

프로그래밍 오류

  • 프로그램 실행 전에 발생하는 오류 : 구문 오류
  • 프로그램 실행 중에 발생하는 오류 : 예외, 런타임 오류

1. 구문 오류

  • 괄호의 개수, 들여쓰기 문제 등으로 프로그램이 실행되기도 전에 발생하는 오류

2. 예외, 런타임 오류

#정상 실행
print("오류는 아주 사소한것부터 발생합니다.")

#예외 발생
dogs.append("말티즈") # 리스트가 없음
  • 예외를 해결하는 모든 것을 예외 처리라고 함
    • 위의 예시를 해결하기 위해서는 dogs라는 리스트가 존재하면 됨
      • 예외를 처리하는 두가지 방법 (구문오류는 코드 자체를 수정해야함)
        • 조건문을 사용하는 방법 : 기본 예외 처리
        • try구문을 사용하는 방법

조건문을 사용한 예외 처리

# x=3, y=5
x, y = map(int, input("밑변과 높이를 입력해주세요").split(" "))
# map(int,~) : 여러개의 값을 받는 것들을 한번에 정수형으로 변환
# split(" ") : 입력되는 두개의 값을 각각 띄어쓰기로 구분 = 3 5

# 계산결과 출력
print(f'삼각형의 넓이는 {x*y/2}입니다.') 
  • 위의 예시는 정상적으로 작동하는데, 만약 입력값을 x=3cm ,y=5cm로 입력한다면

    • 입력값이 정수형이 아니기 때문에 오류가 발생한다.
      • 예외를 해결하기 위해서 isdigit() 를 사용합니다.
  • isdigit()

    • 숫자로만 구성되어있는 글자인지를 판단하고 숫자로 변환이 가능한 글자라면 true를 반환합니다.
    • 문자열이 0~9로만 되어 있을 때 True
    • 문자가 섞여 있거나, 음수 기호(-), 소수점(.) 같은 게 들어 있을 때 False
# x=3cm, y=5cm
x, y = input("밑변과 높이를 입력해주세요").split(" ")

if x.isdigit() and y.isdigit():
    # 계산결과 출력
    x , y = int(x), int(y)
    print(f'삼각형의 넓이는 {x*y/2}입니다.')
else:
    print("정수로 입력하지 않아 계산이 불가합니다.")
    

isdigit(): 문자열(str)의 메서드(method)라서 x.isdigit()처럼 점(.)을 찍고 호출
isdigit(x) : isdigit()은 독립적인 함수가 아니라, 문자열(str)의 메서드이기 때문에 불가


try except 구문

try:
    예외가 발생할 가능성이 있는 코드
except
    예외가 발생했을 때 실행할 코드    
    
# x=3, y=5
try:
    x, y = map(int, input("밑변과 높이를 입력해주세요").split(" "))

    # 계산결과 출력
    print(f'삼각형의 넓이는 {x*y/2}입니다.')
except:
    print("정수로 입력하지 않아 계산이 불가합니다.")

try except 구문과 pass 키워드 조합 구조

  • 예외가 발생하더라도 지금 당장 처리하지 않아도 되는 부분이라면 pass 키워드를 사용가능
try:
    예외가 발생할 가능성이 있는 코드
except
    pass

list_input = ["1", "7", "3", "마피아", "4"]

list_number = []

for item in list_input:
    try:
        int(item)
        list_number.append(item)
    except:
        pass

print(f'{list_input} 내부에 있는 숫자는')
print(f'{list_number}입니다.')
  • int(item) : item에 있는 값들을 정수로 바꿀 수 있는지 확인
    • int() : "숫자 모양의 문자열"만 정수로 바꿀 수 있음 → 제한이 있음.
    • str() : 웬만한 자료형을 다 문자열로 바꿈 → 제한이 거의 없음.
      • "마피아"는 문자열로 정수형으로 변경이 불가능 하기 때문에 오류발생 하여 except로 빠짐

try except 구문과 else 키워드 조합 구조

  • else 구문을 붙여서 사용하면 예외가 발행하지 않았을 때 실행할 코드를 지정가능
try:
    예외가 발생할 가능성이 있는 코드
except:
    예외가 발생했을 때 실행할 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
# x=3cm, y=5cm
try:
    x, y = map(int, input("밑변과 높이를 입력해주세요").split(" "))

except:
    print("정수로 입력하지 않아 계산이 불가합니다.") # 이 줄 출력

else:
    # 계산결과 출력
    print(f'삼각형의 넓이는 {x*y/2}입니다.')
 

finally 구문

  • 예외 처리 구문에서 가장 마지막에 사용할 수 있는 구문
    • 예외가 발생하든 발생하지 않든 무조건 실행할 때 사용하는 코드
try:
    예외가 발생할 가능성이 있는 코드
except:
    예외가 발생했을 때 실행할 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
finally:
    무조건 실행할 코드
# x=3, y=5
try:
    x, y = map(int, input("밑변과 높이를 입력해주세요").split(" "))

    # 계산결과 출력
    print(f'삼각형의 넓이는 {x*y/2}입니다.') # ~7.5 입니다.
except:
    print("정수로 입력하지 않아 계산이 불가합니다.")
else:
    print("계산이 정상적으로 되었습니다.") # ~ 되었습니다
finally:
    print("프로그램이 종료 되었습니다.") # ~ 되었습니다.
    
  • return 구문으로 함수를 빠져나와도 finally 구문이 있다면 finally 구문이 실행됨
  • 반복문의 break문을 만나 빠져나와도 finally 구문이 있다면 finally 구문이 실행됨

결론 : try except finally 조합법

  • try ~ except
  • try ~ except ~ else
  • try ~ except ~ finally
  • try ~ except ~ else ~ finally
  • try ~ finally

예외객체와 구분하기

  • Exception을 사용하면 예외의 종류에 대해 알 수 있습니다.
    • 예외 원인까지 출력 가능
    • 여러 개의 except를 일일이 안 써도 웬만한 에러를 한 번에 처리 가능
# x=3cm, y=5cm
try:
    x, y = map(int, input("밑변과 높이를 입력해주세요").split(" "))

    # 계산결과 출력
    print(f'삼각형의 넓이는 {x*y/2}입니다.')
except Exception as exception:
    # 예외에 대한 정보 출력
    print("type(exception):", type(exception))
    print("exception:", exception)
    
# type(exception): <class 'ValueError'>
# exception: invalid literal for int() with base 10: '3cm'
  • Exception :파이썬에서 모든 예외의 최상위 클래스.
    • 어떤 에러(ValueError, TypeError, ZeroDivisionError …)가 나더라도 다 잡을 수 있음.
  • as exception : 발생한 예외 객체를 exception이라는 변수에 담아서 쓸 수 있음.
    • as 사용 안하면 예외가 발생했다는것은 알 수 있지만 어떤 에러인지는 알 수 없음

맞춤형으로 대처하기

try:
    예외가 발생할 가능성이 있는 구문
except 예외 키워드1:
    예외 키워드1가 발생했을 때 실행할 구문
except 예외 키워드2:
    예외 키워드2가 발생했을 때 실행할 구문
except 예외 키워드3:
    예외 키워드3이 발생했을 때 실행할 구문 
numbers = [23, 11, 7, 4, 12]

try:
    number_input = int(input("찾고싶은 값의 위치를 입력해주세요"))
    print(f'{number_input}번째 요소 : {numbers[number_input]}')
except ValueError: # 정수로 입력하지 않아서 발생한 에러
    print("정수로 입력해주세요")
except IndexError: # 리스트에 없는거 입력해서 발생한 에러
    print("리스트의 범위를 벗어났습니다. 입력값을 다시 확인해주세요")    
    
  • 입력 값이 숫자가 아닐 때 발생할 수 있는 ValueError
  • 나누는 수가 0일 때 발생할 수 있는 ZeroDivisionError
  • 파일이 존재하지 않을 때 발생하는 FileNotFoundError를 처리

예외 구분 구문과 예외 객체

  • as 키워드를 이용해 as exception을 사용 가능
numbers = [23, 11, 7, 4, 12]

try:
    number_input = int(input("찾고싶은 값의 위치를 입력해주세요"))
    print(f'{number_input}번째 요소 : {numbers[number_input]}')
    문제를.만들자 # 여기서 에러 발생
except ValueError as exception:
    print("정수로 입력해주세요")
    print("exception:", exception)
except IndexError as exception:
    print("리스트의 범위를 벗어났습니다. 입력값을 다시 확인해주세요")
    print("exception:", exception)

# 위의 2가지로 예외처리가 불가능한 경우 모든 예외처리가 가능한 Exception을 이용하면 가능
except Exception as exception:
    print("대처 불가한 예외가 발생했습니다.")
    print(type(exception), exception)
    
  • 1 을 입력해서 1번째 요소 : 11 이 출력 -> 문제를.만들자 여기서 에러 발생
    • 하지만 위의 2가지 에러로는 대처 불가 하여
      • 3번째 Exception으로 대처
1번째 요소 : 11
대처 불가한 예외가 발생했습니다.
<class 'NameError'> name '문제를' is not defined

사용자 정의 예외를 생성

class NegativeNumberError(Exception):
    pass

try:
    number = int(input("양수를 입력하세요: "))
    if number < 0:
        raise NegativeNumberError("음수가 입력되었습니다. 양수를 입력해주세요!")
except NegativeNumberError as er:
    print(er)

class NegativeNumberError(Exception):

  • Exception(파이썬의 모든 예외 클래스의 부모)를 상속받아 새로운 예외 NegativeNumberError를 만든 것
  • pass
    • 특별히 추가할 기능이 없을 때 쓰는 키워드. 기본 예외 기능만 그대로 쓰겠다는 뜻

raise (자주 사용 X)

  • 실행이 되면 안되는 부분에서 실행이 될까봐 사 즉, 의도하지 않게 작동하는 상황을 방지
    • raise 뒤에 예외 이름 입력
number = input("숫자를 입력해주세요")
number = int(number)

#조건문 사용
if number > 0:
    #양수일 때: 아직 미구현 상태
    raise NotImplementedError
else:
    #음수일 때: 아직 미구현 상태
    raise NotImplementedError

표준모듈

  • 모듈 : 여러 변수와 함수를 가지고 있는 집합체
    • 파이썬에 기본적으로 내장되어 있는 모듈을 "표준 모듈" 이라고 함

math 모듈 : 수학 관련 기능

  • import math : math 모듈 불러오기
함수설명사용 예시
sin(x)사인 값을 구함print(math.sin(5))
cos(x)코사인 값을 구함print(math.cos(5))
ceil(x)올림print(math.ceil(3.4))
floor(x)내림print(math.floor(5.2))

from 구문

  • 모듈안에 수 많은 함수 중 사용자가 원하는 함수만을 가져와 사용하면 문법적으로 편리
    • from 모듈 이름 import 가져오고 싶은 변수 또는 함수
from math import sin, cos, ceil, floor

print(sin(5))
print(cos(5))
print(ceil(3.4))
print(floor(5.2))
  • from math import * : math 모듈의 모든 함수를 가져오는 방법으로 import에 *

as 구문

  • 모듈을 사용하다 이름의 충돌이 발생하거나 이름이 너무 길어서 짧게 줄려 사용하고 싶은 경우
    • 모듈의 식별자를 만들어 사용할 수 있는 문법 ex: import math as m
import math as m

print(m.sin(5))
print(m.cos(5))
print(m.ceil(3.4))
print(m.floor(5.2))

os 모듈

  • 운영체제와 관련된 기능을 가진 모듈
  • os.system 명령어의 경우 사용 시 주의를 요함
import os

#기본 정보 출력
print("현재 운영체제:", os.name)
print("현재 폴더:", os.getcwd())
print("현재 운영체제:", os.listdir())

 os.mkdir("oz") : 폴더 생성
 os.rmdir("oz") : 폴더 제거


with open("food.txt", "w") as file: 파일생성(이름,"w":write:내용 쓸거임)
     file.write("배가 고프네요") :  쓸 내용
os.rename("food.txt", "hungry.txt") (기존이름 , 바꿀이름 ) 이름변경

파일 제거
os.remove("hungry.txt")

시스템 명렁어 사용

mac
os.system("ls")

window
os.system("dir")

datetime 모듈 : 날짜와 시간 관련 모듈

import datetime

print("오늘 날짜와 시간 출력")
now = datetime.datetime.now() # (모듈이름,클래스,함수이름) 현재날짜와 시간 출력
print(now.year, "년")
print(now.month, "월")
print(now.day, "일")
print(now.hour, "시")
print(now.minute, "분")
print(now.second, "초")
print()
import datetime

print("다양한 시간 포맷")
output_1 = now.strftime("%Y.%m.%d %H:%M:%S")
output_2 = f'{now.year}{now.month}{now.day}{now.hour}{now.minute}{now.second}초'
output_3 = now.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초")
print(output_1)
print(output_2)
print(output_3)
print()
  • *"년월일시분초" : 한개씩 쪼개서 "%Y{} %m{} %d{} %H{} %M{} %S{}" 여기 들어감

time 모듈

  • 시간과 관련된 기능을 다루는 모듈
  • 특정 시간동안 코드를 정지할 수 있는 기능이 있음
import time

print("3초 뒤에 어떤일이 일어날까요?")
time.sleep(3)
print("아무일도 없었다")
  • time.sleep(3) : 웹 크롤링 할때 인간인척 하기위해 인위적으로 작동시간을 조절할 수있음

urllib 모듈

  • url을 다루는 라이브러리
from urllib import request

target = request.urlopen("https://www.naver.com")
web_code = target.read()

print(web_code)

외부모듈

  • pip install 모듈 이름 : 모듈 설치하는 방법
  • beautifulsoup4 : 웹에 있는 정보를 가져올때 사용하는 프로그램
from urllib import request
from bs4 import BeautifulSoup

target = request.urlopen("https://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108")

soup = BeautifulSoup(target, "html.parser")

for location in soup.select("location"):
    print("도시:", location.select_one("city").string)
    print("날씨:", location.select_one("wf").string)
    print("최저기온:", location.select_one("tmn").string)
    print("최고기온:", location.select_one("tmx").string)
    print()
    
  • html.parser : 홈페이지 어느 위치에 뭐가 있는지 컴퓨터에게 정보를 알려주는 코드

데코레이터

  • @으로 시작하는 구문을 데코레이터 라고 한다.

함수 데코레이터

  • 함수 앞뒤에 붙일 내용이나 반복할 내용이 있을때 사용
def test(function):
    def wrapper():
        print("허언증이 재발했습니다.")
        function()
        print("격리 되었습니다.")
    return wrapper

@test
def oz():
    print("파이썬 진짜 재미있엉 하하")

oz()

모듈 만들기

  • 모듈 : 함수의 집합
#oz_module.py
pi = 3.141592

#반지름 값을 받아오는 함수
def number_input():
    value = input("반지름을 입력해주세요")
    return float(value)

#원의 둘레
def get_circum(radius):
    return 2 * pi * radius

#원의 넓이
def get_circle(radius):
    return pi * radius * radius
    
#oz.py

import oz_module as oz

radius = oz.number_input()
print(oz.get_circum(radius))
print(oz.get_circle(radius))
  • import oz_module as oz
    • oz_module 이라는 파일(모듈)을 불러와서, 그걸 oz라는 이름으로 사용
      • oz는 oz_module의 별칭

패키지

  • 모듈의 집합
    • 패키지를 불러온다는 건, 결국 그 안의 모듈들을 불러와서 사용하는 것
# oz_module_1.py

val_1 = "module_1의 변수"
# oz_module_2.py 
val_2 = "module_2의 변수"
# main.py
import oz_package.oz_module_1 as one
import oz_package.oz_module_2 as two

print(one.val_1)
print(two.val_2)
profile
안녕하세요.

0개의 댓글