본문 바로가기

배운 책들 정리/혼자 공부하는 파이썬

혼자 공부하는 파이썬 6,7 - 예외 처리, 모듈

6장 예외 처리

1. 구문 오류와 예외

1) 확인 문제 379 p

* 1번 (구문 오류와 예외 처리의 차이점은?) // Syntax Error & Exception 에러

 

구문 오류는 if 조건을 걸어서 특정 상황이 되었을 때 에러 처리를 하는 것이지만 (코드 자체 에러)

 

예외 처리는 if 조건과 상관 없이 특정 조건이 아닐 경우 이외의 상황을 모두 예외 처리를 하여

에러를 무시하는 방법이다. (예외 상황 에러)

# 구문 오류
if x > 0
    print("x는 양수입니다.")

위의 코드는 if문이 끝나는 콜론(:)이 빠져 구문 오류(Syntax Error)가 발생합니다. 

파이썬의 문법에 맞지 않는 부분이 있어 코드를 실행하기 전에 수정이 필요합니다.

# 예외 처리
try:
    x = 10
    if x > 0:
        print("x는 양수입니다.")
except:
    print("예외가 발생하였습니다.")

위의 코드는 예외 처리를 통해 예외 상황에 대한 대응을 미리 정의한 예시입니다. try-except 구문을 사용하여 예외가 발생할 수 있는 부분을 감싸고, 예외가 발생하면 except 블록이 실행되어 예외 상황에 대한 처리를 수행합니다. 예외 처리를 통해 예외가 발생하더라도 프로그램이 비정상적으로 종료되지 않고 계속 실행될 수 있도록 합니다.

 

 

* 2번 (예외 처리를 통한 출력) // try - except ValueError - finally

# 380p 문제 예외처리 // try - except ValueError - finally
numbers = [52,273,32,103,90,10,275]
print("#(1) 요소 내부에 있는 값 찾기")
print("-{}는 {} 위치에 있습니다.".format(52,numbers.index(52)))
print()

print("#(2) 요소 내부에 없는 값 찾기")
number = 10000


try:
  print("-{}는 {} 위치에 있습니다.".format(number,numbers.index(number)))
except ValueError:
  print("-리스트 내부에 없는 값입니다.")
  print()
finally: # 생략가능
  print("--- 정상적으로 종료되었습니다 ---")

 

 

* 2번 (예외 처리를 통한 출력) // if - else

# 380p 문제 예외처리 // if - else
numbers = [52,273,32,103,90,10,275]
print("#(1) 요소 내부에 있는 값 찾기")
print("-{}는 {} 위치에 있습니다.".format(52,numbers.index(52)))
print()

print("#(2) 요소 내부에 없는 값 찾기")
number = 10000


if number in numbers:
  print("-{}는 {} 위치에 있습니다.".format(number,numbers.index(number)))
else : # 나머지, 값이 존재하지 않는 경우
  print("-리스트 내부에 없는 값입니다.")
print()
print("--- 정상적으로 종료되었습니다 ---")

 

 

* 3번

# 381p 문제 정답 찾기
# 1번 -> 예외 (TypeError)
output = 10 + "개"
# 2번 -> 예외 (ValueError)
int("안녕하세요")
# 3번 -> 구문 오류 (SyntaxError)
cursor.close)
# 4번 -> 예외 (IndexError)
[1,2,3,4,5][10]

# 381p 문제 3번 수정
# 1
output = "10" + "개"
print(output)

# 2번
print(int("10"))

# 3번
# cursor.close() 

# 4번
[1,2,3,4,5][4]

 

 

2. 예외 고급

1) 예외 객체

* 빈칸 입력시

* 문자 입력시

# 예외객체
try:
  no = input("정수 입력>")
  no = int(no)
  print("원의 반지름", no)
  print("원의 둘레", 2 * 3.14 * no)
  print("원의 넓이", 3.14 * no * no)

except Exception as exception:
  print("예외 종류:",type(exception))
  print("예외 객체:",exception)

 

2) 예외 구분하기 (여러가지 예외 상황)

 

* 빈칸

 

* 문자

 

*리스트에 없는 숫자

# 여러가지 예외 상황 만들기
a = [1,2,3,4,5]
try:
  # 예외1 : 숫자로 변환할 수 없는 값을 입력한 경우
  b = int(input("정수입력>")) 
  # 예외1 : 리스트에 없는 인덱스 번호 값(정수)을 입력한 경우
  print("{}번째 요소는 {}".format(b,a[b]))
except Exception as exception:
  print("예외 종류:",type(exception))
  print("예외 객체:",exception)

 

3) 예외 구분하기 2

* IndexError

# 예외 구분해서 문장 만들기
a = [1,2,3,4,5]  # 인덱스 번호 0 ~ 4
try:
  # 예외1 : 숫자로 변환할 수 없는 값을 입력한 경우
  b = int(input("정수입력>")) 
  # 예외1 : 리스트에 없는 인덱스 번호 값(정수)을 입력한 경우
  print("{}번째 요소는 {}".format(b,a[b]))
except ValueError:
  print("정수를 입력하세요.")
except IndexError:
  print("리스트의 인덱스를 벗어났습니다.")

 

*예외 객체 정보 출력 1

# 예외 구분해서 문장 만들기
a = [1,2,3,4,5]  # 인덱스 번호 0 ~ 4
try:
  # 예외1 : 숫자로 변환할 수 없는 값을 입력한 경우
  b = int(input("정수입력>")) 
  # 예외1 : 리스트에 없는 인덱스 번호 값(정수)을 입력한 경우
  print("{}번째 요소는 {}".format(b,a[b]))
except ValueError as exception:
  print("정수를 입력하세요.")
  print("예외 객체:",exception)
except IndexError as exception:
  print("리스트의 인덱스를 벗어났습니다.")
  print("예외 객체:",exception)

 

*예외 객체 정보 출력 2 (인덱스 값을 입력해도 오류가 나오는 경우)

# 우리가 예상하지 못한 예외 처리
a = [1,2,3,4,5]  # 인덱스 번호 0 ~ 4
try:
  # 예외1 : 숫자로 변환할 수 없는 값을 입력한 경우
  b = int(input("정수입력>")) 
  # 예외2 : 리스트에 없는 인덱스 번호 값(정수)을 입력한 경우
  print("{}번째 요소는 {}".format(b,a[b]))
  # 예외3 : 우리가 예상하지 못하는 예외
  예외.발생해주세요()
except ValueError as exception:
  print("정수를 입력하세요.")
  print("예외 객체: ",exception)
except IndexError as exception:
  print("리스트의 인덱스를 벗어났습니다.")
  print("예외 객체: ",exception)
except Exception as exception:
  print("예외 종류: ", type(exception))
  print("예외 객체: ",exception)

 

 

4) 강제로 예외 발생 _ raise 구문

 

# 강제 종료를 막는 예외 처리 (raise 구문)
# 입력을 받습니다.
number = input("정수 입력>")
number = int(number)
# 조건문 사용
if number > 0:
  # 양수일 때 : 아직 미구현 상태입니다.
  raise NotImplementedError
else:
  # 음수일 때 : 아직 미구현 상태입니다.
  raise NotImplementedError

 

 

7장 모듈

1. 표준 모듈

1) math

 

 

* 모듈 불러오기

 

# 모듈 불러오기
import math

# 다양한 math 함수들
print(math.sin(1))
print(math.cos(1))
print(math.tan(1))
print(math.floor(3.14))
print(math.ceil(3.14))

 

 

* 모듈의 별칭 설정

 

# 모듈의 별칭 설정
import math as m
print(m.sin(1))
print(m.cos(1))
print(m.tan(1))
print(m.floor(3.14))
print(m.ceil(3.14))

 

 

* 함수 이름만 사용하고 싶을 때

 

# 함수 이름만 사용하고 싶을 때
from math import sin,cos,tan,floor,ceil
print(sin(1))
print(cos(1))
print(tan(1))
print(floor(3.14))
print(ceil(3.14))

 

2) random

 

import random
print("# random 모듈")
print("- random(): ", random.random())

print("- uniform(10,20):", random.uniform(10,20))

print("- randrange(10)", random.randrange(10)) # int
print("- randrange(10,20)", random.randrange(10, 20)) # int

print("- choice([1,2,3,4,5])", random.choice([1,2,3,4,5])) 

print("- shuffle([1,2,3,4,5])", random.shuffle([1,2,3,4,5]))

print("- sample([1,2,3,4,5])", random.sample([1,2,3,4,5], k=2))

print("- shuffle([1,2,3,4,5])", random.shuffle([1,2,3,4,5]))
a = [1,2,3,4,5]
random.shuffle(a)
print(a)

 

 

 

4) os 모듈

import os
print("현재 운영체제: ", os.name)

print("현재 폴더: ", os.getcwd())

print("현재 폴더 내부의 요소: ", os.listdir())

os.mkdir("hello")

os.rmdir("hello")

with open("source.txt","w") as file:
  file.write("안녕 파이썬 아직도 하고 있니")
  os.rename("source.txt","new.txt")

os.remove("new.txt")

os.system("dir")

 

5) 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, "초")

 

*현재 날짜 시간을 포맷 맞춰서 출력

# 현재 날짜 시간을 포맷 맞춰서 출력
a = "{}년 {}월{}일 {}시 {}분 {}초".format(now.year,
                                    now.month,
                                    now.day,
                                    now.hour,
                                    now.minute,
                                    now.second)
print(a)

b = now.strftime("%Y.%m.%d %H:%M:%S")
print(b)

c = now.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초")
print(c)

# 특정 시간 이후 날짜 시간 출력
import datetime
now = datetime.datetime.now()
print("datetime.timedelta 로 시간 더하기")
after = now + datetime.timedelta(weeks = 1,
                                 days = 1,
                                 hours = 1,
                                 minutes = 1,
                                 seconds = 1)
print(now)
print(after)

print(after.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초"))

print("# now.replace()로 1년 더하기")
after_oneyear = now.replace(year = (now.year + 1))
print(after_oneyear.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초"))

 

6) time 모듈

import time
print("지금부터 5초 동안 정지합니다")
time.sleep(5)
print("종료합니다.")

 

 

7) urllib 모듈

 

from urllib import request
target = request.urlopen("https://google.com")
output = target.read()
print(output)

 

8) operator 모듈

# 콜백함수 = 매개변수로 사용 되는 함수
books = [{"제목": "A",
          "가격": 10000},
         {"제목": "B",
          "가격": 20000},
         {"제목": "C",
          "가격": 30000}]
def price(book):
  return book["가격"]          
print(min(books, key = price))
print(max(books, key = price))

# 람다
print(min(books, key = lambda book: book["가격"]))
print(max(books, key = lambda book: book["가격"]))

# itemgetter()
from operator import itemgetter
print(min(books, key = itemgetter("가격")))
print(max(books, key = itemgetter("가격")))

 

 

9) 확인문제 419p

 

* 1번 문제 (math 모듈의 함수를 제대로 읽어 들이지 못하는 코드를 고르세요)

- import math

- import sin, cos, tan from math   (from과 import의 위치가 바뀜)

- import math as m

- from math import *

 

 

* 2번 문제 (파이썬 문서 확인을 통해 모듈의 이름을 다섯개 적고 모듈의 기능이 어떤 것이 있는지 확인하기)

 

0 wave : WAV 파일 형식의 오디오 데이터를 읽고 쓰기 위한 모듈로, 오디오 처리에 관련된 기능을 제공합니다. 

1 array : 일정한 데이터 타입을 갖는 숫자 값들의 효율적인 배열(array)을 제공하는 모듈로, 

메모리 공간을 절약하면서 배열을 다룰 수 있습니다. 

2 enum : 열거형(enum)을 구현하기 위한 클래스를 제공하는 모듈로, 

고정된 값들의 집합을 정의하고 이를 사용하는데 도움을 줍니다. 

3 io : 스트림(stream)과 관련된 핵심적인 도구들을 제공하는 모듈로, 

파일 입출력, 네트워크 통신 등 다양한 데이터 스트림 처리에 사용됩니다. 

4 socket : 네트워크 통신을 위한 저수준(low-level) 인터페이스를 제공하는 모듈로, 소켓(socket) 프로그래밍에 사용되며, 네트워크 통신 기능을 구현할 때 필요한 다양한 메소드와 함수를 제공합니다.

 

 

3.11.3 Documentation

Python 3.11.3 문서 Welcome! This is the official documentation for Python 3.11.3. 설명서의 파트들: 파이썬 3.11 의 새로운 기능은? 2.0 이후의 모든 "새로운 기능" 문서 자습서 여기에서 시작하세요 라이브러리 레퍼

docs.python.org

 

 

* 3번 문제

('폴더라면 또 탐색하기'라는 재귀 구성으로 현재 폴더 내부에 있는 모든 파일을 탐색하도록 코드를 작성해 보세요.)

# 모듈을 읽어 들입니다.
import os

# 현재의 폴더의 파일/폴더를 출력합니다.
output = os.listdir(".")
print("os.listdir():", output)
print()

# 현재의 폴더의 파일/폴더를 구분합니다.
print("# 폴더와 파일 구분하기")
for path in output:
  if os.path.isdir(path):
    print("폴더:", path)
  else:
    print("파일:", path)

# 모듈을 읽어 들입니다.
import os

# 폴더를 읽어 들이는 함수
def read_folder(path):

  for item in output: # 폴더 내의 파일과 폴더 리스트를 얻어옴
    if os.path.isdir(os.path.join(path,item)) : # 폴더인 경우
      read_folder(path+"/"+item) # 재귀적으로 폴더 내부를 탐색
  else:
    print("파일:", item) # 파일을 출력


read_folder(".") # 현재 폴더를 시작으로 폴더 내부를 탐색

 

 

2. 외부 모듈

422~436p 참조

 

 

 

*6장, 7장 코랩 링크

 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

* 핵심

0) try,except 구문 사용법

1) raise 구문 사용법

2) 모듈 사용법

 

 

728x90
반응형
LIST