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(60, 100, 80) #최대공약수 구하기 ③ 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' |
'미래 먹거리를 위하여' 카테고리의 다른 글
| [파이썬 정복하기] 점프 투 파이썬 7장 – 파이썬 날아오르기 (책 없이 시작하기) (0) | 2025.10.30 |
|---|---|
| [파이썬 정복하기] 점프 투 파이썬 6장 – 파이썬 프로그래밍, 어떻게 시작해야 할까? (책 없이 시작하기) (1) | 2025.10.29 |
| [파이썬 정복하기] 점프 투 파이썬 5장 – 파이썬 날개 달기 ① (책 없이 시작하기) (0) | 2025.10.22 |
| [파이썬 정복하기] 점프 투 파이썬 4장 – 파이썬의 입출력 (책 없이 시작하기) (0) | 2025.10.21 |
| [파이썬 정복하기] 점프 투 파이썬 3장 – 프로그램의 구조를 쌓는다! 제어문 (책 없이 시작하기) (0) | 2025.10.20 |
