본문 바로가기

미래 먹거리를 위하여

[파이썬 정복하기] 점프 투 파이썬 5장 – 파이썬 날개 달기 ② (책 없이 시작하기)

5. 파이썬 날개 달기- 본격적인 파이썬 프로그래밍 시작!

5-4. 예외 처리(Exception Handling)

예외(Exception)란? 프로그램 실행 중에 오류가 발생하는 상황을 말한다.

예시 결과 비고
print(10 / 0)   # ZeroDivisionError ZeroDivisionError: division by zero 이런 오류를 그냥 두면 프로그램이 멈추지만,
예외 처리를 하면 “프로그램이 멈추지 않게” 할 수 있음.

※ 오류 예외 처리 기법

구분 설명 예시 결과
예외(오류) 프로그램 실행 중
발생하는 오류
10 / 0 → ZeroDivisionError
int('a') → ValueError
프로그램이 강제 종료됨
기본 구조 예외를 처리하기 위한
try ~ except 구문
try:
      실행코드
except 예외명:
     오류 처리코드
오류 발생 시 프로그램이 멈추지 않고
except 블록 실행
여러 예외 처리 여러 종류의 예외를
한 번에 처리 가능
try:
...
except (ZeroDivisionError, ValueError):
      print("잘못된 입력입니다.")
두 예외 중 하나라도 발생 시
같은 처리 실행
예외 메시지확인 as 키워드로
예외 내용을 변수로 받음
try:
      4 / 0
except ZeroDivisionError as e:
         print(e)
division by zero
모든 예외
한꺼번에 처리
Exception 클래스로
모든 예외 포괄 처리
try:
...
except Exception as e:
   print("예외 발생:", e)
try: 아래 줄에 아무 코드도 없으면 오류발생

IndentationError: expected an indented block after 'try' statement on line 1
정상 실행 시
(else)
오류가 없을 때만
실행되는 코드
try:
   print(10 / 2)
except:
   print("에러")
else:
    print("정상 실행!")
5.0
정상 실행!
무조건 실행
(finally)
오류 발생 여부와
관계없이 실행
try:
10 / 0
except:
   print("에러!")
finally:
   print("종료")
에러!
종료
예외 강제 발생
(raise)
직접 예외 발생 가능
MyError 발생
def positive(x):
       if x <= 0:  # if 다음 줄은 들여쓰기 필수!
             raise ValueError("양수를 입력하세요!")
       return x
positive(-10) 입력 시
ValueError: 양수를 입력하세요!

positive(20) 입력 시
20
NotImplementedError (강제 구현)


상속받은 자식 클래스가 반드시 특정 메서드를 구현하도록 강제할 때 사용
- 부모 클래스
class Bird:
    def fly(self):
        raise NotImplementedError("자식 클래스에서 반드시 fly()를 구현해야 합니다.")
Bird는 “부모 클래스(기초 클래스)
메서드 함수.
이렇게 하면 Bird 클래스를 직접 사용할 순 있지만,
fly() 메서드를 호출하는 순간 예외가 발생.
fly() 호출 b = Bird()   # Bird 클래스의 인스턴스 생성
b.fly()      # 인스턴스를 통해 fly() 호출
fly()는 Bird 클래스의 인스턴스(객체) 안에 들어 있으므로
먼저 Bird 객체를 만들어서 fly()를 호출해야 함.
- 자식 클래스 class Eagle(Bird):
    def fly(self):
        print("독수리가 하늘을 납니다!")
Eagle은 “자식 클래스(상속 클래스)”
Eagle은 Bird를 상속받았고,
부모 클래스의 fly()를 직접 구현(오버라이드)한 상태.
fly() 호출 eagle = Eagle();
eagle.fly()
자식 클래스에서 메서드 구현 완료
Exception
클래스 상속
사용자 정의 예외 만들기 class MyError(Exception):
          pass
새로운 예외 타입 생성
str() 재정의 예외 메시지 출력 변경 class MyError(Exception):
    def __str__(self):
        return "허용되지 않는 별명입니다."

try:
      raise MyError()
except MyError as e:
      print("예외 발생:", e)
예외 발생: 허용되지 않는 별명입니다.

# raise로 실제로 발생시켜야 메시지가 보인다.

※ 오류 메세지 참고

SyntaxError: invalid syntax > “except”가 올 자리가 아닌데 들어왔다”

NameError: name 'fly' is not defined > “fly라는 이름을 가진 일반 함수는 없는데요?”

5-5. 내장 함수(Built-in Functions)

 

  • 내장 함수는 import 없이 바로 사용 가능
  • 함수 이름이 변수로 덮어쓰이지 않게 주의 (sum = 10 같은 것 ❌)
  • help(함수이름) 또는 dir(__builtins__) 으로 전체 목록 조회 가능
구분 설명 예시 결과
abs(x) 숫자의 절댓값 반환 abs(-3) 3
all(iterable) 모든 요소가 참(True)이면 True all([1, 2, 3]) True
any(iterable) 하나라도 참이면 True any([0, "", None, 5]) True
chr(i) 아스키 코드 → 문자 chr(65) 'A'
ord(c) 문자 → 아스키 코드 ord('A') 65
divmod(a, b) 몫과 나머지를 동시에 반환 (튜플) divmod(7, 3) (2, 1)
enumerate(iterable) 인덱스와 값을 함께 반환하는
enumerate 객체
보통 for 문과 함께 사용
for i, name in enumerate(['a', 'b', 'c']):
      print(i, name)
0 a
1 b
2 c
eval(expr) 문자열로 된 표현식을 실행 eval('1 + 2')
eval("'hi' + 'a'")
3
'hia'
filter(func, iterable) 조건에 맞는 요소만 반환 list(filter(lambda x: x > 0, [1, -3, 2, 0, -5])) [1, 2]
hex(x) 16진수 문자열로 변환 hex(234) '0xea'
id(obj) 객체의 고유 메모리 주소 id(3) (예: 4309232832)
input(prompt) 사용자 입력 받기 input("이름: ") 입력값 반환
int(x) 정수형으로 변환 int('3') 3
isinstance(obj, class) 특정 클래스의
인스턴스인지 검사
isinstance(3, int) True
len(obj) 길이(요소 개수) 반환 len("python") 6
list(iterable) 리스트로 변환 list("abc") ['a', 'b', 'c']
map(func, iterable) 모든 요소에 함수 적용 list(map(str, [1, 2, 3])) ['1', '2', '3']
max(iterable) 최댓값 max([1, 5, 2]) 5
min(iterable) 최솟값 min([1, 5, 2]) 1
oct(x) 8진수 문자열로 변환 oct(34) '0o42'
open(filename, mode) 파일 열기 open("test.txt", "w") 파일 객체 반환
pow(x, y) 제곱 (x의 y승) pow(2, 3) 8
range(start, stop[, step]) 숫자 시퀀스 생성 list(range(1, 5)) [1, 2, 3, 4]
round
(number[, ndigits])
반올림
, ndigits
는 소수점이
있을수도있고 없을수도 있다는말
round(4.6) 5
sorted(iterable) 정렬된 리스트 반환 sorted([3, 1, 2]) [1, 2, 3]
str(x) 문자열로 변환 str(3) '3'
sum(iterable) 합계 sum([1, 2, 3]) 6
tuple(iterable) 튜플로 변환 tuple([1, 2, 3]) (1, 2, 3)
type(obj) 객체의 자료형이 무엇인지 알려줌 type("hello") <class 'str'>
zip(iter1, iter2, …) 여러 시퀀스를 묶어 튜플로 반환 list(zip([1,2,3], ['a','b','c'])) [(1,'a'),(2,'b'),(3,'c')]

※ 추가 요약표

함수 분류 예시
수치 연산 abs(), pow(), round(), divmod()
형 변환 int(), str(), list(), tuple()
논리/판단 all(), any(), isinstance(), type()
반복 처리 enumerate(), filter(), map(), zip(), range()
입출력 input(), open()
기타 eval(), id(), len(), sorted()

5-6. 표준 라이브러리(Standard Library)

 

  • 표준 라이브러리는 설치 없이 import만 하면 바로 사용 가능(import 아래는 블록이 아니므로 들여쓰기 불가능)
  • 일부 모듈은 운영체제 의존 기능(OS 명령 등) 을 포함함
  • 모든 표준 라이브러리는 공식 문서에서 확인 가능 👉 Python Docs - Standard Library

 

모듈 설명 예시 결과
datetime 날짜와 시간 계산 ① from datetime import datetime
    datetime.now()
② 
 현재 날짜, 시각
time 시간 관련 함수 제공 import time
 time.time()     #에포크 기준 누적 초
 time.ctime()     #에포크초를 문자열로 변환
time.localtime(time.time())  
time.asctime(time.localtime(time.time()))
= time.ctime() #항상 현재 시간만 반환
time.strftime('%x', time.localtime(time.time()))
time.strftime('%c', time.localtime(time.time()))
 1734782021.583237
② 'Tue Oct 21 12:33:41 2025'
time.struct_time(tm_year=2025, tm_mon=10, tm_mday=22, tm_hour=7, tm_min=33, tm_sec=49, tm_wday=2, tm_yday=295, tm_isdst=0)
'Wed Oct 22 07:35:40 2025'
'10/22/25'
'Wed Oct 22 07:52:54 2025'
math 수학 계산 함수 제공 import math
 math.sqrt(9)      #    
② math.gcd(6010080)      #최대공약수 구하기
math.lcm(15, 25#최소공배수 구하기
① 3.0
② 20
③ 75
random 난수 생성
(규칙이 없는 임의의 수)
import random
random.random()

② random.randint(1,10)
① 0.5368308438737109
1~10 사이의 난수 중 임의의 수
itertools 반복(iteration)
유틸리티
import itertools
① list(itertools.permutations([1,2,3]))
from itertools import zip_longest

    a = [1, 2, 3]
    b = ['A', 'B']   # 문자열 따옴표 필수

    for x, y in zip_longest(a, b, fillvalue='-'):
          print(x, y)

 len(list(itertools.combinations(range(1, 46), 6)))
① [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

1 A
   2 B
   3 -

  8145060

functools 반복(iteration)
유틸리티
import functools
data = [1, 2, 3, 4, 5]
result = functools.reduce(
lambda x, y: x + y, data)
print(result) #왼쪽에서 오른쪽으로 누적하여 하나의 값으로 줄이는 함수

15
operator sorted와 같은 함수의 key 매개변수에 적용하여 다양한 기준으로 정렬할 수 있도록 도와주는 모듈 from operator import itemgetter
students = [('홍', 9),('김', 5),('영', 7)]
result = sorted(students, key=itemgetter(1))
print(result)   
# 두 번째 항목(점수) 기준으로 정렬
[('김', 5), ('영', 7), ('홍', 9)]
shutil 고급 파일 작업
(복사, 이동 등)
import shutil
① shutil.copy('a.txt','b.txt')   #원본 유지
 shutil.copy2(src, dst)      #원본 유지
shutil.move("c:/doit/a.txt", "c:/temp/a.txt")     
                                               #원본 삭제

① a.txt를 b.txt로 복사해라
 파일 내용 + 메타데이터(수정일 등) 복사
c:/doit/a.txt 파일을 c:/temp/ 폴더로 잘라내서 옮겨라
glob 특정 패턴의
파일 목록 가져오기
import glob
glob.glob('*.py')      # .py 파일 목록 반환
['hello.py', 'mod1.py', 'hello2.py', 'modtest.py']
pickle 파이썬 객체를 파일로
저장하거나 불러오기
( 0과 1(이진 데이터) 로 변환해서 저장)
import pickle
data = {'a':1, 'b':2}
with open('data.pkl','wb') as f:
        pickle.dump(data,f)

# wb: write(쓰기) + binary(바이너리)
= “이 파일을 이진 데이터로 작성하겠다”는 뜻
# rb: read(읽기) + binary(바이너리)
= “이 파일을이진 데이터로 읽겠다”는 뜻
출력 결과 값 없음. 
data.pkl 파일 생성됨
os 운영체제와
상호작용
(파일/디렉터리
관리 등)
import os
 print(os.getcwd())    #현재 경로 출력
 os.system('dir')      #시스템 명령 실행
os.environ      #시스템 환경 변숫값 확인
 /Users/유저네임/doit
  sh: dir: command not found
32512
environ({… 생략 …})
zipfile 여러 개의 파일을 zip 형식으로 합치거나 이를 해제할 때 사용 import zipfile
 with zipfile.ZipFile('files.zip', 'w') as z:
             z.write('a.txt')
             z.write('b.txt')     #압축하기
with zipfile.ZipFile('files.zip', 'r') as z:
             z.extractall('unzipped')    #압축 풀기

출력값 없음. a.txt, b.txt 파일이 압축된 files.zip 이 생성됨

출력값 없음. files.zip' 읽기 모드('r')로 열기 ZIP 안의 모든 파일을 'unzipped' 폴더에 꺼내기
threading 멀티스레딩
(동시 실행) 지원
병렬 실행 가능
import threading
def worker():
      print('작업중')
t = threading.Thread(target=worker)
t.start()
t.join()   # (선택) 완료까지 대기
작업중
tempfile 임시 파일/디렉터리 생성 import tempfile
f = tempfile.TemporaryFile()
f = tempfile.TemporaryFile()
    print(f)    #임시 파일 객체의 정보 출력

 출력값 없음.
자동 삭제 임시 파일 생성
 <_io.BufferedRandom name=5>
traceback 프로그램 실행 중 발생한 오류를 추적하고자 할 때 사용하는 모듈 import traceback

def a():
    return 1/0

def b():
    a()

def main():
    try:
        b()
    except:
        print("오류가 발생했습니다.")
        print(traceback.format_exc())
               # 오류 추적 결과를 문자열로 반환하는 함수
main()

오류가 발생했습니다.
Traceback (most recent call last):
  File "<python-input-29>", line 7, in main
    b()
    ~^^
  File "<python-input-29>", line 4, in b
    a()
    ~^^
  File "<python-input-29>", line 2, in a
    return 1/0
           ~^~
ZeroDivisionError: division by zero
json JSON 데이터 처리  import json
    data = {'a':1}          #딕셔너리자료형을
    json.dumps(data)      JSON 파일로생성할 때


import json
    with open('myinfo.json') as f:
            data = json.load(f)
...        #JSON 파일을 딕셔너리자료형으로 만들때
     type(data)
<class 'dict'>
       data
{'name': '홍길동', 'birth': '0525', 'age': 30}

 '{"a":1}'

② [파일명: myinfo.json]

{
    "name": "홍길동",
    "birth": "0525",
    "age": 30
}

urllib URL을 읽고 분석할 때 from urllib import request
response = request.urlopen("https://wikidocs.net/")
print(response.status)
200
#대부분의 환경에서는 정상 실행되지만, 회사 네트워크나 보안이 엄격한 환경에서는 SSL 인증서 검증 오류(CERTIFICATE_VERIFY_FAILED)가 발생할 수 있음.
이 경우 certifi 모듈을 사용하거나, 시스템 인증서를 갱신하면 해결됨.
webbrowser 기본 웹 브라우저 열기 import webbrowser
 webbrowser.open('https://python.org')
webbrowser.open_new('http://python.org')
기존 브라우저에서 웹페이지 열림
 새창에서 웹페이지 열림
sys 파이썬 인터프리터
관련 기능 제공
import sys
print(sys.argv)
print(sys.exit)
프로그램 인자 및
종료 제어 가능
calendar 달력 출력 및 날짜 관련 기능 import calendar
calendar.prmonth(2025, 10)
copy 얕은복사(내부 변경 시 원본도 바뀜)
깊은 복사(원본과 독립적)
import copy
a = [1, [2, 3]]
    b = copy.copy(a)   #이때 b=[1, [2, 3]]
    b[1][0] = 999         # b 내부 리스트 변경
    print(a)
    print(b)    #a도 같이 바뀜 (내부 리스트를 공유함)

 a=[1,[2,3]]

    b=copy.deepcopy(a)    #이때 b=[1, [2, 3]]
    b[1][0] = 999         # b 내부 리스트 변경
    print(a)
    print(b)  #
a는 그대로, b만 바뀜 (서로 독립된 객체)
[1, [999, 3]]
     [1, [999, 3]]

[1, [2, 3]]
    [1, [999, 3]]

#b[1][0] = [1, [2, 3]]
  b[1] = [2, 3]
  b[0] = [2]
collections 특수한 컨테이너 자료형. 문자 개수 세기 from collections import Counter
Counter('hello')
Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})
re 정규표현식
(문자열 패턴 검색)
import re
 re.findall('[a-z]+','Hello123')
# [a-z]+ = 소문자로 이루어진 연속된 문자열을 모두 찾아라
re.findall('[a-zA-Z]+', 'Hello123')
# [a-zA-Z]+= 대문자도 포함한 연속된 문자열을 모두 찾아라
 ['ello']
['Hello']

※ TIP

잘못된 코드 이유 수정
import time 다음 줄 들여쓰기 import 아래는 블록이 아니므로 들여쓰기 불가능 들여쓰기 ❌
if, for, def, while, def, try, class 뒤 들여쓰기 필수 ex) if True: 다음엔 한 칸 들여쓰기 필요
아무 블록 밖인데 들여쓰기 있음 ❌ 문법 오류 (unexpected indent) 들여쓰기

5-7.  외부 라이브러리

※ pip 이란?

파이썬 모듈이나 패키지를 쉽게 설치할 수 있도록 도와주는 도구

(1) pip (핍) 설치하기

터미널 실행  pip install SomePackage 입력/실행 → 'Collecting SomePackage…생략…Successfully installed SomePackage-1.2.3' 문구 확인 

(2) pip을 활용한 Faker(페이커)  설치

터미널 실행 → python3 -m pip install Faker 입력/실행  'Collecting Faker…생략…Successfully installed Faker-37.11.0 문구 확인

※ Faker 활용 예시표

Faker는 외부 데이터베이스나 인터넷 연결 없이, 자체적으로 내장된 ‘가짜 데이터 사전’을 사용해서 랜덤 데이터를 만들어준다.

기능 예시 결과
언어 설정 (공통코드)
from faker import Faker
fake = Faker('ko_KR')
한국어 로케일  #fake = Faker() ,기본 영어
이름 생성 fake.name() 홍지영
주소 생성 fake.address() '부산광역시 강북구 봉은사5가 552-27 (영숙김진면)'
이메일 생성 fake.email() 'no@example.org'
전화번호 생성 fake.phone_number() '02-6177-6674'
회사명 생성 fake.company() '(주) 겨레'
직업명 생성 fake.job() '환경 미화원 및 재활용품 수거원'
문장 생성 fake.sentence()    #번역 데이터가 없어 영어 데이터 사용 'He enjoys coding every morning.'
문단 생성 fake.paragraph()  #번역 데이터가 없어 영어 데이터 사용 'She looked outside, the rain was falling softly...'
날짜 생성 fake.date() '1978-04-19'
국가 생성 fake.country() '조선민주주의인민공화국'
도시 생성 fake.city() '연천군'
우편번호 생성 fake.postcode() '17596'
랜덤 숫자 fake.random_int(min=0, max=100) 21
사용자 프로필 fake.simple_profile() {'username': 'sanghun81', 'name': '박주원', 'sex': 'M', 'address': '세종특별자치시 은평구 도산대9길 지하642 (유진이읍)', 'mail': 'bagjunyeong@nate.com', 'birthdate': datetime.date(1929, 3, 25)}

 

(2) pip을 활용한 sympy(심파이)  설치

터미널 실행  python3 -m pip install sympy 입력/실행  'Collecting sympy …생략…Successfully installed mpmath-1.3.0 sympy 문구 확인

※ sympy 활용 예시표

sympy:  파이썬에서 수학식을 기호(symbol)로 다루며, 방정식 풀이, 미분·적분, 행렬 계산 등을 할 수 있는 강력한 수학 라이브러리

기능 예시 결과
기호(symbol) 정의 from sympy import symbols
x, y = symbols('x y')      # 기호 변수 x, y 생성
print(x)
print(y)
x
y
방정식 풀기 from sympy import Eq, solve
x = symbols('x')
solve(Eq(2*x + 3, 7))
[2]
미분(Derivative) from sympy import diff
x = symbols('x')
diff(x**3, x)
3*x**2
적분(Integral) from sympy import integrate
x = symbols('x')
integrate(x**2, x)
x**3/3
수식 단순화 from sympy import simplify
simplify((x**2 + 2*x + 1)/(x + 1))
x + 1
전개(expand) from sympy import expand
expand((x + 2)**3)
x**3 + 6*x**2 + 12*x + 8
인수분해(factor) from sympy import factor
factor(x**2 + 2*x + 1)
(x + 1)**2
대입(subs) expr = x**2 + 3*x
expr.subs(x, 2)
10
함수 표현 from sympy import Function
f = Function('f')
f(x)
f(x)
행렬 계산 from sympy import Matrix
Matrix([[1, 2], [3, 4]]).det()
-2
연립방정식 풀이 x, y = symbols('x y')
solve([2*x + y - 5, x - y - 1])
{x: 2, y: 1}
수식 출력(LaTeX) from sympy import latex
latex(x**2 + 2*x + 1)
'x^{2} + 2 x + 1'