05-4 ~ 05-5 (p.222 ~ p.246)

 

어느덧 10일 차로 절반 이상을 달려왔다.

10일 동안 교재의 3분에 2 이상을 공부하다 보니 앞에서 배웠던 부분들을 들춰가면서 공부를 하게 된다.

이 교재를 다 보더라도 틈틈이 복습을 해야겠다. 그래도 지금까지 배운 것들이 있다 보니 처음보다는 수준이 오른 것이 느껴진다..!

 

미약하지만 이런 느낌

 


 

05-4 예외처리

 

파이썬은 try, except를 사용해서 예외적으로 오류를 처리할 수 있게 해 준다.

 

오류 예외 처리 기법

try, except문

# try, except문의 기본 구조
try:
   ...
except [발생오류[as 오류 메시지 변수]]: # []는 괄호 안의 내용을 생략할 수 있다는 관례 표현 기법
   ...
# 1. try, except만 쓰는 방법
# 오류 종류에 상관없이 오류가 발생하면 except 블록 수행
try:
    4 / 0
except:
    print("오류 발생")
>>> 오류 발생


# 2. 발생 오류만 포함한 except문
# 오류가 발생했을 때 except에 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행
try:
    4 / 0
except ZeroDivisionError: # except 발생 오류:
    print("오류 발생")
>>> 오류 발생


# 3. 발생 오류와 오류 메시지 변수까지 포함한 except문
# 두 번째 경우에서 오류 메시지의 내용까지 알고 싶을 때 사용
try:
    4 / 0
except ZeroDivisionError as e: # except 발생 오류 as 오류 메시지 변수:
    print(e)
>>> division by zero

 

try... finally

finally 절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다. 보통 사용한 리소스를 close 해야 할 때에 많이 사용된다.

f = open('foo.txt', 'w')
try:
    f .write("Hello") # 무언가를 수행한다.
finally:
    f.close()
# foo.txt 파일을 쓰기 모드로 연 후, try문을 수행하고 예외 발생 여부와 상관없이 finally절 수행

 

여러 개의 오류 처리하기

try:
    a = [1, 2]
    print(a[3])
    4 / 0
except ZeroDivisionError:
    print("0으로 나눌 수 없습니다.")
except IndexError:
    print("인덱싱할 수 없습니다.")
>>> 인덱싱할 수 없습니다. # 인덱싱 오류가 먼저 발생했으므로 ZeroDivisionError 오류는 발생하지 않음

# 두 오류를 함께 처리도 가능
try:
    a = [1, 2]
    print(a[3])
    4 / 0
except (ZeroDivisionError, IndexError) as e:
    print(e)

 

 

오류 회피하기

try:
    f = open("나없는파일", 'r')
except FileNotFoundError:
    pass # 파일이 없더라도 오류를 발생시키지 않고 통과한다.

 

오류 일부러 발생시키기

파이썬은 raise 명령어를 사용해 오류를 강제로 발생시킬 수 있다.

class Bird:
    def fly(self):
        raise NotImplementedError # 꼭 작성해야 하는 부분이 구현되지 않았을 경우 일부러 오류를 일으키기 위해 사용하는 내장 오류
         
class Eagle(Bird): # Eagle 클래스는 Bird 클래스를 상속 받음
        pass # Eagle 클래스에서 fly 함수를 구현하지 않았기 때문에 Bird 클래스의 fly 함수 호출
             # Bird 클래스의 fly 함수에 있는 raise문에 의해 NotImplementedError 오류 발생

eagle = Eagle()
eagle.fly()
>>> NotImplementedError 오류 발생

# 오류가 발생되지 않게 하려면 Eagle 클래스에 fly 함수를 반드시 구현해야 함
class Eagle(Bird):
    def fly(self):
        print("vert fast")

eagle = Eagle()
eagle.fly()
>>> very fast

 

예외 만들기

예외는 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.

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) # 오류 메시지를 출력했을 때 오류 메시지가 보이게 하려면 오류 클래스에 __str__ 메서드 구현해야 함

 

05-5 파이썬 내장 함수

 

# 앞에서 살펴본 함수들은 생략
# abs : 어떤 숫자를 입력받았을 때, 절댓값을 돌려줌
abs(3) 
>>> 3

# all : 인수에 반복 가능한 자료형을 받고 모두 참이면 True, 거짓이 하나라도 있으면 Fals 반환
all([1, 2, 3])
>>> True
all([1, 2, 3, 0])
>>> False

# any : 하나라도 참이 있으면 True, 모두 거짓이면 False
any([1, 2, 3, 0])
>>> True
any([0, ""])
>>> False

# chr : 아스키 코드 값을 입력받아 그 코드에 해당하는 문자 출력
chr(97)
>>> 'a'

# dir : 객체기 자체적으로 가지고 변수나 함수를 보여줌
dir([1, 2, 3])
>>> ['append', 'count', ...]

# divmod : 두 숫자를 나눈 몫과 나머지를 튜플 형태로 반환
divmod(7, 3)
>>> (2, 1)

# enumerate : 순서가 있는 자료형을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체 반환
for i, name in enumerate(['body', 'foo', 'bar']):
    print(i, name)
    
>>> 0 body
    1 foo
    2 bar

# eval : 실행 가능한 문자열을 입력으로 받아 문자열을 실행한 결괏값 반환
eval('1+2')
>>> 3
eval("'hi' + 'a'")
>>> 'hia'

# filter : 첫 번째 인수로 함수 이름, 두 번째 인수로 그 함수에 차례로 들어갈 반복 가능한 자료형을 받는다.
#          그리고 두 번째 인수인 반복 가능한 자료형 요소가 첫 번째 인수인 함수에 입력되었을 때 반환 값이
#          참인 것만 묶어서(걸러서) 반환
def positive(x):
    return x > 0

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

# hex : 정수 값을 입력받아 16진수로 변환
hex(234)
>>> '0xea'

# id : 객체를 입력받아 객체의 고유 주소 값 반환
a = 3
id(3)
>>> 135072304

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

# int : 문자열 형태의 숫자나 소수점이 있는 숫자 등을 정수 형태로 반환
int('3') # 문자열 형태 3
>>> 3
int(3.4)
>>> 3

# isinstance : 첫 번째 인수로 인스턴스, 두 번째 인수로 클래스 이름
#              입력으로 받은 인스턴스가 그 클래스의 인스턴스인지를 판단
#              참이면 True, 거짓이면 False
class Person: pass # 아무 기능이 없는 Person 클래스 생성
...
a = Person() # Person 클래스의 인스턴스 a 생성
isinstance(a, Person) # a가 Person 클래스의 인스턴스인지 확인
>>> True

# len : 입력값의 길이 반환
len("python")
>>> 6
len([1, 2, 3])
>>> 3

# list : 반복 가능한 자료형을 입력받아 리스트로 반환
list("python")
>>> ['p', 'y', 't', 'h', 'o', 'n']
list((1, 2, 3)) # 튜플 자료형
>>> [1, 2, 3]

# map : 함수와 반복 가능한 자료형을 입력으로 받음
#       입력 받은 자료형의 각 요소를 함수 f가 수행한 결과를 묶어서 돌려주는 함수
def two_times(x): return x*2
...
list(map(two_times, [1, 2, 3, 4]))
>>> [2, 4, 6, 8]

# max : 인수로 반복 가능한 자료형을 입력받아 그 최댓값 반환
max([1, 2, 3])
>>> 3
max("python")
>>> 'y'

# min : 인수로 반복 가능한 자료형을 입력받아 그 최솟값 반환
min([1, 2, 3])
>>> 1
min("python")
>>> 'h'

# oct : 정수 형태의 숫자를 8진수 문자열로 반환
oct(34)
>>> '0o42'

# open : '파일 이름'과 '읽기 방법'을 입력받아 파일 객체를 반환
#         읽기 방법을 생략하면 기본값인 읽기 전용 모드(r)
# w : 쓰기 모드, r : 읽기 모드, a : 추가 모드, b : 바이너리 모드(b는 w, r, a와 함께 사용)
f = open("binary_file", "rb") # b를 추가하면 바이너리 모드 추가(바이너리 읽기 모드)

# ord : 문자의 아스키 코드 값 반환
ord('a')
>>> 97

# pow : x의 y 제곱한 결괏값 반환
pow(2, 4)
>>> 16

# range : 입력받은 숫자에 해당하는 범위 값을 반복 가능한 객체로 만들어 반환
list(range(5))
>>> [0, 1, 2, 3, 4]
list(range(5, 10))
>>> [5, 6, 7, 8, 9]
list(range(1, 10, 2)) # 세 번째 인수는 숫자 사이의 거리
>>> [1, 3, 5, 7, 9]

# round : 숫자를 입력받아 반올림
round(4.6)
>>>5

# sorted : 입력값을 정렬한 후 결과를 리스트로 반환
sorted([3, 1, 2])
>>> [1, 2, 3]
sorted("zero")
>>> ['e', 'o', 'r', 'z']

# str : 문자열 형태로 객체를 변환
str(3)
>>> '3'
str('hi'.upper())
>>> 'HI'

# sum : 입력받은 리스트나 튜플의 모든 요소의 합을 반환
sum([1, 2, 3])
>>> 6

# tuple : 반복 가능한 자료형을 입력받아 튜플 형태로 바꾸어 반환
tuple("abc")
>>> ('a', 'b', 'c')
tuple([1, 2, 3])
>>> (1, 2, 3)
tuple((1, 2, 3))
>>> (1, 2, 3)

# type : 입력값의 자료형이 무엇인지 알려줌
type("abc")
>>> <class 'str'> # "abc"는 문자열 자료형

# zip : 동일한 개수로 이루어진 자료형을 묶어 주는 역할
list(zip([1, 2, 3], [4, 5, 6]))
>>> [(1, 4), (2, 5), (3, 6)]
list(zip("abc", "de"))
>>> [('a', 'd'), ('b', 'e')]

 

+ Recent posts