본문 바로가기
🐍Python

[20210730] Python 기본 문법 5 - 예외, 내장 함수, 라이브러리

by 캔 2021. 7. 30.

예외

예외는 발생 전 예상 가능한 오류를 가리키며, 예외 처리는 예외가 발생하였을 때 수행할 작업을 설정하는 것이다. "try: 예외가 발생할 수 있는 구문 except: 예외가 발생했을 때 수행할 구문"과 같은 형태로 예외를 처리할 수 있다.

# 예외 처리: FileNotFoundError (파일이 없을 때), ZeroDivisionError(0으로 나눌 때),
# IndexError(없는 또는 초과한 인덱스), IndentationError(들여쓰기 에러) 등
# f = open("없는 파일", 'r')
# 4 / 0
# a = [1,2,3]
# a[4]

# 예외, 에러 처리 기법 (자바에서는 try~catch) try, except 문
"""
try:
    ...
except [발생 오류[as 오류 메시지 변수]]:
    ...
"""

# 1. 오류 종류에 상관없이 오류가 발생하면 except 블록을 수행한다. (catch(exception e))
"""
try:
    ...
except:
    ...
"""

# 2. 오류가 발생했을 때 except문에 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행
"""
try:
    ...
except 발생 오류:
    ...
"""

# 3. 발생 오류와 오류 메시지 변수까지 포함함
"""
try:
    ...
except 발생 오류 as 오류 메시지 변수:
    ...
try:
    4 / 0
except ZeroDivisionError as e:
    print(e)
"""

# try .. finally
# finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다.
# 보통 사용한 리소스를 close해야 할 때 많이 사용된다.
f = open('test.txt','w')
try:
    ...
finally:
    f.close()

# 여러 개의 오류 처리하기
try:
    ...
except 발생 오류1;
    ...
except 발생 오류2;

try:
    a = [1,2]
    print(a[3])
    4 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except IndexError:
    print("인덱싱할 수 없습니다.")

try:
    a=[1, 2]
    print(a[3])
    4 / 8
except (ZeroDivisionError, IndexError) as e:
    print(e)

# try문에 else절 사용하기
# try:
#    ...
# except[발생오류[as 오류 메시지 변수]]:
#    ...
# else: # 오류가 없을 때만 실행
#   ...
try:
    age=int(input('나이를 입력하세요'))
except:
    print('입력이 정확하지 않습니다.')
else:
    if age <= 18:
        print('미성년자 출입금지')
    else:
        print('환영합니다.')

# 오류 회피하기: 만약 특정 오류가 발생할 경우 통과시켜야 할 때가 있다.
try:
    f = open("없는 파일",'r')
except FileNotFoundError:
    pass

# 오류 일부러 발생시키기
class Bird:
    def fly(self):
        raise NotImplementedError
        # raise: 오류를 강제로 발생시킨다.
        # Not Implemented Error : 구현하지 않으면 에러 발생 시켜라.
class Eagle(Bird):
    def fly(self): # 오버라이딩
        print("Very fast")

eagle = Eagle()
eagle.fly()

# 직접 예외 만들기: 파이썬 내장 클래스 Exception을 상속해서 만든다.
class MyError(Exception):
    pass

def say_nick(nick):
    if nick == '바보':
        raise MyError()
    print(nick)

say_nick('천사')
say_nick('바보')

# try~except 사용
class MyError(Exception):
    pass


def say_nick(nick):
    if nick == '바보':
        raise MyError()
    print(nick)


try:
    say_nick("천사")
    say_nick('바보')
except MyError:
    print("금지어입니다.")


# MyError 클래스에서 에러 메시지를 출력하도록 처리
class MyError(Exception):
    def __str__(self):
        return "금지어입니다."


def say_nick(nick):
    if nick == '바보':
        raise MyError()
    print(nick)


try:
    say_nick("천사")
    say_nick('바보')
except MyError as e:
    print(e)

 

내장 함수(built-in function)

파이썬을 내장 함수들을 정리해 놓은 것이다.

# abs(x): 어떤 숫자를 입력받아서 그 숫자의 절댓값을 리턴하는 함수
abs(3)
abs(-3)

# all(x): 반복 가능한 자료형 x를 인수로 받으며, x의 요소가 모두 참이면 True,
# 거짓이 하나라도 있으면 False 리턴, 반복 가능한 자료형: list, tuple, dictionary, set..
all([1, 2, 3])
all([0, 1, 2, 3])
all([])  # all의 입력 인수가 빈 값인 경우에는 True를 리턴한다.

# any(x): 반복 가능한 자료형 x를 인수로 받으며, x의 요소 중 하나라도 참이면 True,
# 모두 거짓을때만 False를 리턴. all <-> any
any([1, 2, 3, 4])
any([0, ""])
any([])  # any의 입력 인수가 빈 값인 경우에는 False를 리턴한다.

# chr(i): 유니코드 값을 입력받아 그 코드에 해당하는 문자를 출력
chr(97)
chr(44032)

# dir(x): 객체가 자체적으로 가지고 있는 변수나 함수를 보여준다.
dir([1, 2, 3])  # 리스트 객체의 변수나 함수
dir({'1': 'a'})  # 딕셔너리 객체의 변수나 함수

# divmod(a, b) 2개의 숫자를 입력받아, a를 b로 나눈 몫과 나머지를 튜플 형태로 리턴
divmod(7, 3)

# enumerate(x): "열거하다"라는 뜻이다. 순서가 있는 자료형(list, tuple, str)을 입력받아
# 인덱스 값을 포함하는 enumerate객체를 리턴, 보통 for문과 함께 사용한다.
# 인덱스 값과 함께 body, foo, bar가 순서대로 출력됨. for문과 같이 사용하면 자료형의
# 인덱스와 값을 알 수 있다.
for i, name in enumerate(['body', 'foo', 'bar']):
    print(i, name)

# eval(expression): 실행 가능한 문자열 (1 + 2, 'hi' + 'a')같은 것을 입력받아
# 문자열을 실행한 결과값을 리턴해준다. 입력받은 문자열로 파이썬 함수나 클래스를
# 동적으로 실행하고 싶을 때 사용.
eval('1 + 2')
eval("'hi ' + 'good morning'")
eval('divmod(4, 3)')


# filter(function, list): filter는 무엇인가를 걸러낸다는 의미, filter 함수도 마찬가지.
# 첫 번째 인수로 함수 이름, 두번째 인수로 그 함수에 차례로 들어갈 반복 가능한 자료형을 받는다.
# 두 번째 인수인 반복 가능한 자료형 요소가 첫 번째 인수인 함수에 입력됬을 때 반환 값이
# 참인 것만 리턴

def positive(x):
    return x > 0


print(list(filter(positive, [1, -3, 2, 0, -5, 6])))

# hex(x): 정수 값을 입력받아 16진수로 변환하여 리턴
hex(234)
hex(3)

# id(object): 객체를 입력받아 객체의 고유 주소 값(레퍼런스)을 리턴
# 3, a, b 는 같은 객체를 가리키고 있다.
a = 3
id(3)
id(a)
b = a
id(b)

# input([prompt]): 사용자 입력을 받는 함수
'''
>>> a = input()
hi
>>> a
'hi'
>>> b = input("Enter: ")
Enter: hi
>>> b
'hi'
'''

# int(x): 문자열 형태의 숫자나 소수점이 있는 숫자 등을 정수 형태로 리턴, 정수를 입력하면 그대로 리턴
'''
>>> int('3') 문자열 '3'을 정수로 리턴
3
>>> int(3) 정수를 그대로 정수로 리턴
3
>>> int('11', 2) 2진수 '11'을 10진수 정수로 리턴
3
>>> int('1A', 16) 15진수 '1A'를 10진수 정수로 리턴
26
'''


# isinstance(object, class): 첫 번째 인수로 인스턴스, 두 번째 인수로 클래스를 받는다.
# 입력받은 인스턴스가 그 클래스의 객체인지 참이면 True, 거짓이면 False 리턴
class Person: pass


a = Person()
isinstance(a, Person)  # True
b = 3
isinstance(b, Person)  # False

# len(s): 입력값 s의 길이 (요소의 전체 개수)를 리턴
len("python")  # 6
len([1, 2, 3, 4])  # 4
len((1, 'a'))  # 2

# list(s): 반복 가능한 자료형 s를 입력받아 리스트로 만들어 리턴
list("python")  # ['p', 'y', 't', 'h', 'o', 'n']
list([1, 2, 3])  # [1, 2, 3]
a = [1, 2, 3]  # list 함수에 리스트를 입려주면 똑같은 리스트를 복사하여 리턴
b = list(a)  # [1, 2, 3]

# map(f, iterable): 함수(f)와 반복 가능한(iterable)자료형을 입력으로 받는다.
# map은 입력받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 리턴해준다.
'''
def two_times(numberList):
    result = [ ]
    for number in numberList:
        result.append(number * 2)
    return result

result = two_times([1, 2, 3, 4])
print(result)

# map으로 바꾼다
def two_times(x):
    return x * 2
list(map(two_times,[1, 2, 3, 4]))

# lambda
list(map(lambda a: a * 2, [1, 2, 3, 4]))
'''

# max(iterable): 인수로 반복 가능한 자료형을 입력받아 최대값을 리턴.
max([1, 2, 3])  # 3
max("python")  # A~z ,가장 작은수  가장 큰수가 z: y

# min(iterable): 인수로 반복가능한 자료형을 입력받아 최소값을 리턴.
min([1, 2, 3, 4])  # 1
min("python")  # h

# oct: oct(x) 정수 형태의 숫자를 8진수 바꾸어 리턴.
oct(34)  # '0o42'
oct(12345)  # '0o30071'

# open(filename, [mode]): "파일명"과 "읽기 방법"을 입력받아 파일 객체로 리턴
# mode: w, r, a, b -> 쓰기, 읽기, 추가, 바이너리 모드로 열기

f = open("binary_file", 'rb')  # 바이너리 모드로 읽기

fread = open("read_mode.txt", 'r')
fread2 = open("read_mode.txt")  # 모드 생략하면, 기본적으로 읽기 모드
fappend = open("append_mode.txt", 'a')  # 'a'는 추가 모드

# ord(c): 문자를 유니코드 값으로 리턴
ord('a')  # 97
ord('가')  # 44032

# pow(x, y): x의 y 제곱한 값을 리턴
pow(2, 4)  # 16
pow(3, 3)  # 27

# range([start, ]stop[, step])는 for문과 함께 자주 사용, 입력받은 숫자에
# 해당하는 범위값을 반복 가능한 객체로 만들어 리턴
# 인수가 하나일 경우: 시작 숫자를 지정해 주지 않으면 range 함수는 0부터 시작한다.
list(range(5))  # [0, 1, 2, 3, 4]
# 인수가 두개일 경우: 시작 숫자와 끝 숫자를 나타낸다. 끝수자는 n-1 이다.
list(range(5, 10))  # [5, 6, 7, 8, 9]
# 인수가 세개일 경우: 세번째 인수는 숫자 사이의 거리를 나타낸다.
list(range(1, 10, 2))  # [1, 3, 5, 7, 9]
list(range(0, -10, -1))  # [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

# round(number[, ndigits]): 숫자를 입력받아 반올림 해준다.
round(4.6)  # 5
round(4, 2)  # 4
round(5.678, 2)  # 5.68, 소수점 2자리만 표시, ndigits는 소수점 자리수

# sorted(iterable): 입력값을 정렬하여 리턴
sorted([4, 3, 1, 2])  # 리스트 숫자 정렬: [1, 2, 3, 4]
sorted(['a', 'd', 'b', 'c'])  # 리스트 문자 정렬: ['a', 'b', 'c', 'd']
sorted("zero")  # 문자열 정렬: ['e', 'o', 'r', 'z']
sorted((3, 2, 1))  # 튜플 정렬: [1, 2, 3]

# str(object): 문자열 형태로 객체를 리턴
str(3)  # '3'
str('hi')  # 'hi'
str('hi'.upper())  # 'HI"

# sum(iterable): 입력받은 리스트나 튜플의 모든 요소의 값을 합하여 리턴
sum([1, 2, 3])  # 6
sum((4, 5, 6))  # 15

# tuple(interable): 반복 가능한 자료형을 입력받아 튜플 형태로 리턴, 튜플이 입력으로 들어오면
# 그대로 리턴
tuple("abcd")  # ('a', 'b', 'c', 'd')
tuple([1, 2, 3])  # (1, 2, 3)
tuple((1, 2, 3))  # (1, 2, 3)

# type(object): 입력값의 자료형을 리턴
type("abc")  # <class 'str'>
type([])  # <class 'list'>
type(open("test", 'w'))  # <class '_io.TextIOWrapper'>

# zip(*iterable): 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수
# iterable은 반복 가능한 자료형 여러 개를 입력할 수 있다는 의미.
list(zip([1, 2, 3], [4, 5, 6]))  # [(1, 4), (2, 5), (3, 6)]
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))  # [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
list(zip("abc", "def"))  # [('a', 'd'), ('b', 'e'), ('c', 'f')]

 

라이브러리(library)

라이브러리는 유용한 프로그램을 모아 놓은 것이다. 수많은 라이브러리가 존재하며, 여기서는 일부만을 기술한다.

# 라이브러리: 전세계 파이썬 사용자들이 만든 유용한 프로그램을 모아 놓은 것이 파이썬 라이브러리.
# 모든 라이브러리를 다 알 필요는 없고 어떤 일을 할 때 어떤 라이브러리를 사용해야 한다는 정도만 파악.
# 주로 사용되고, 꼭 알아 두면 좋은 라이브러리를 살펴보자. 파이썬을 설치할때 자동으로 컴퓨터에 설치된다.

# sys: sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈
'''
C:\pyworks>python argv_test.py you need python
['argv_test.py', 'you', 'need', 'python']

python 명령어 뒤의 모든 것들이 공백을 기준으로 나뉘어서 sys.argv 리스트의 요소가 된다.

sys.exit(): Ctrl+Z 나 Ctrl+d를 눌러서 대화형 인터프리터를 종료하는 것과 같은 기능을 한다.
             프로그램 파일 안에서 사용하면 프로그램을 중단시킨다.

sys.path: 파이썬 모듈들이 저장되어 있는 위치를 나타낸다. 이 위치에 있는 파이썬 모듈은 경로에 상관없이
            어디서나 불러 올 수 있다.
import sys
sys.path
['', 'C:\\Users\\B\\AppData\\Local\\Programs\\Python\\Python38\\python38.zip', 'C:\\Users\\B\\AppD
ata\\Local\\Programs\\Python\\Python38\\DLLs', 'C:\\Users\\B\\AppData\\Local\\Programs\\Python\\Py
thon38\\lib', 'C:\\Users\\B\\AppData\\Local\\Programs\\Python\\Python38', 'C:\\pyworks\\venv', 'C:
\\pyworks\\venv\\lib\\site-packages']

sys.path.append("C:/pyworks") -> 경로 이름을 추가할 때 사용, 해당 디렉터리에 있는 파이썬 모듈을 불러와 사용가능
'''

# pickle: 객체의 형태를 그대로 유지하면서 파일을 저장하고 불러 올 수 있게 하는 모듈
# pickle.dump를 이용하여 data를 파일에 저장
import os
import pickle

f = open("test.txt", 'wb')
data = {1: 'python', 2: 'you need'}
pickle.dump(data, f)
f.close()
# pickle.dump로 저장한 파일을 pickle.load를 사용하여 읽어온다. 어떤 자료형도 저장하고 읽어 올수 있다.
f = open('test.txt', 'rb')
data = pickle.load(f)
print(data)

# os: 환경변수나 디렉터리, 파일 등의 OS 자원을 제어할 수 있게 해주는 모듈이다.
# 내 시스템의 환경변수값을 알고 싶을때 os.environ
import os

os.environ
"""
environ({'__INTELLIJ_COMMAND_HISTFILE__': 'C:\\Users\\B\\AppData\\Local\\JetBrains\\PyCharmCE2021.
1\\terminal\\history\\pyworks-history', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', '
FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'VIRTUAL_ENV': 'C:\\pyworks\\venv', 'PROGRAMDATA': 'C
:\\ProgramData', ...생략...})
"""
os.environ['PATH']
"""
'C:\\pyworks\\venv\\Scripts;C:\\oraclexe\\app\\oracle\\product\\11.2.0\\server\\bin;;C:\\WINDOWS\\
system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;
C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files\\Java\\jdk1.8.0_291\\bin;C:\\Users\\B\\AppData\
\Local\\Microsoft\\WindowsApps;'
"""
os.chdir("C:/windows")  # 디렉터리 위치 변경하기
os.getcwd()  # 디렉터리 위치 리턴 'C:\\windows'
os.system('dir')  # 시스템 자체의 프로그램이나 명령어를 파이썬에 호출, 윈도우에 dir 명령어 실행.
os.popen()  # 실행한 시스템 명령어의 결과값 리턴 , 파일 객체로 돌려준다.
f = os.popen("dir")  # 파일 객체로 저장됨
print(f.read())  # 파일 객체 내용 보기
os.mkdir("디렉터리")  # 디렉터리 생성
os.rmdir("디렉터리")  # 디렉터리 삭제 -> 디렉터리가 비어있어야 삭제 된다.
os.unlink("파일")  # 파일을 지운다.
os.rename("src", "dst")  # src라는 이름의 파일을 dst라는 이름으로 바꾼다.

# shutil: 파일을 복사해 주는 파이썬 모듈
import shutil

shutil.copy("src.txt", "dst.txt")  # src.txt를 dst.txt로 복사

# glob: 디렉터리에 있는 파일들을 리스트로 만들기
import glob

glob.glob("c:/pyworks*")  # ['c:/pyworks']