본 내용의 출처는 파이썬 코딩도장 및 파이썬 300제에 있으며, 추가한 내용이 있을 수 있습니다.
파이썬 코딩 도장
Unit 38. 예외 처리 사용하기
try except로 사용하기 & else와 finally 사용하기
🔎 예외 처리
- try의 코드가 에러 없이 잘 실행 -> except 코드는 실행 x
- try의 코드에서 에러가 발생했을 때만 -> except의 코드가 실행됨.
ry:
실행할 코드
except:
예외가 발생했을 때 처리하는 코드
else:
예외가 발생하지 않았을 때 실행할 코드
finally:
예외 발생 여부와 상관없이 항상 실행할 코드
- except에 예외 이름 지정 -> 특정 예외 발생 시에만 처리 코드 실행 가능
- except에서 as 뒤에 변수 지정 -> 발생한 예외의 에러 메시지 받아옴.
try:
실행할 코드
except 예외이름:
예외가 발생했을 때 처리하는 코드
try:
실행할 코드
except 예외이름 as 변수:
예외가 발생했을 때 처리하는 코드
🔎 파이썬 예외 계층도
예외 발생시키기
🔎 예외 발생시키기
- raise에 Exception을 지정하고 에러 메시지를 넣기
try:
raise Exception(에러메시지)
except Exception as e:
print(e)
- except 안에서 raise만 사용하면 현재 예외를 다시 상위 코드 블록으로 넘김.
def 함수A():
try:
raise Exception(에러메시지)
except Exception as e:
raise
try:
함수A()
except Exception as e:
print(e)
예외 만들기
🔎 예외 만들기
class 예외이름(Exception):
def __init__(self):
super().__init__('에러메시지')
raise 예외
퀴즈
연습문제: 파일 예외 처리하기
1) try:
2) except FileNotFoundError:
3) else:
심사문제: 회문이 아니면 예외 발생시키기
반복 가능한 객체 알아보기
🔎 반복 가능한 객체와 이터레이터
- 반복 가능한 객체 : 문자열, 리스트, 튜플, range, 딕셔너리, 세트 등
- 반복 가능한 객체에서
__iter__
메서드 또는 iter
함수를 호출 -> 이터레이터가 나옴.
- 이터레이터에서
__next__
메서드 또는 next
함수를 호출 -> 반복 가능한 객체의 요소를 차례대로 꺼낼 수 있음.
이터레이터 = 반복가능한객체.__iter__()
이터레이터.__next__()
이터레이터 = iter(반복가능한객체)
next(이터레이터)
이터레이터 만들기
🔎 이터레이터 만들기
- 이터레이터는 값을 미리 만들어 놓지 않고, 값이 필요한 시점이 되었을 때 값을 만드는 방식
- 클래스에서
__iter__
, __next__
메서드를 구현하면 이터레이터
- 이렇게 만든 이터레이터는 반복 가능한 객체이면서 이터레이터
class 이터레이터이름:
def __iter__(self):
return self
def __next__(self):
값 생성 코드, 반복을 끝내려면 StopIteration 예외를 발생시킴
이터레이터객체 = 이터레이터()
이터레이터.__next__()
next(이터레이터)
for i in 이터레이터():
pass
인덱스로 접근할 수 있는 이터레이터 만들기
🔎 인덱스 접근 이터레이터 구성
- 클래스에 getitem 메서드를 구현하면 인덱스로 접근할 수 있는 이터레이터가 됨.
->__iter__
와 __next__
메서드 생략 가능
class 이터레이터이름:
def __getitem__(self, index):
인덱스에 해당하는 값을 반환하는 코드, 지정된 범위를 벗어났다면 IndexError 예외를 발생시킴
이터레이터객체 = 이터레이터()
이터레이터객체[인덱스]
🔎 iter
>>> import random
>>> it = iter(lambda : random.randint(0, 5), 2)
>>> next(it)
0
>>> next(it)
3
>>> next(it)
1
>>> next(it)
Traceback (most recent call last):
File "<pyshell#37>", line 1, in <module>
next(it)
StopIteration
🔎 next
>>> it = iter(range(3))
>>> next(it, 10)
0
>>> next(it, 10)
1
>>> next(it, 10)
2
>>> next(it, 10)
10
>>> next(it, 10)
10
퀴즈
연습문제: 배수 이터레이터 만들기
1) self.stop = stop
self.multiple = multiple
self.current = 0
2) self.current += 1
if self.current * self.multiple < self.stop:
return self.current * self.multiple
else:
raise StopIteration
심사문제: 시간 이터레이터 만들기
Unit 40. 제너레이터 사용하기
제너레이터와 yield 알아보기 & 제너레이터 만들기
🔎 제너레이터
- 이터레이터를 생성해주는 함수
- 함수 안에서
yield
키워드만 사용하면 됨.
- 제너레이터 함수를 호출하면 제너레이터 객체가 반환
- 제너레이터 객체에서
__next__
메서드 또는 next
함수를 호출 -> yield까지 실행한 뒤 yield에 지정한 값이 반환값으로 나옴.
def 제너레이터이름():
yield 값
제너레이터객체 = 제너레이터()
제너레이터객체.__next__()
next(제너레이터)
for i in 제너레이터():
pass
yield from으로 값을 여러 번 바깥으로 전달하기
- yield from을 사용하면 값을 여러 번 바깥으로 전달
yield from 반복가능한객체
yield from 이터레이터
yield from 제너레이터객체
🔎 제너레이터 표현식
- 리스트 표현식을 대신 ( )(괄호)로 묶으면 됨.
(식 for 변수 in 반복가능한객체)
(i for i in range(100))
퀴즈
연습문제: 파일 읽기 제너레이터 만들기
while True:
line = file.readline()
if line == '':
break
yield line.strip('\n')
심사문제: 소수 제너레이터 만들기
Unit 41. 코루틴 사용하기
코루틴에 값 보내기
🔎 메인 루틴과 서브 루틴의 동작 과정
🔎 코루틴
- 두 루틴이 대등한 관계인 상태에서 특정 시점에 상대방의 코드를 실행하는 방식
- 코루틴은 제너레이터의 특별한 형태이며 yield로 값을 받아올 수 있음.
- 코루틴에 값을 보내면서 코드를 실행할 때 :
send
메서드 사용
send
메서드가 보낸 값을 받아오려면 : (yield)와 같이 yield를 괄호로 묶어준 뒤 변수에 저장
def 코루틴이름():
while True:
변수 = (yield)
코루틴객체 = 코루틴()
next(코루틴객체)
코루틴객체.send(값)
코루틴 바깥으로 값 전달하기
🔎 코루틴 바깥으로 값 전달 시
- yield 뒤에 값(변수)을 지정한 뒤 괄호로 묶어줌.
- yield를 사용하여 바깥으로 전달한 값 -> next 함수(
__next__
메서드)와 send 메서드의 반환값으로 나옴.
def 코루틴이름():
while True:
변수 = (yield 변수)
코루틴객체 = 코루틴()
변수 = next(코루틴객체)
변수 = 코루틴객체.send(값)
코루틴을 종료하고 예외 처리하기
🔎 코루틴 종료와 예외 처리
- 코루틴을 강제로 종료할 때는 코루틴 객체에서 close 메서드 사용
close
메서드를 사용하면 코루틴이 종료 될 때 GeneratorExit
예외 발생
def 코루틴이름():
try:
실행할 코드
except GeneratorExit:
예외가 발생했을 때 처리하는 코드
코루틴객체 = 코루틴()
next(코루틴객체)
코루틴객체.close()
- 코루틴 안에 예외를 발생시킬 때는
throw
메서드 사용
- 코루틴 안의 except에서 yield를 사용하여 바깥으로 전달한 값은 throw 메서드의 반환값으로 나옴.
def 코루틴이름():
try:
실행할 코드
except 예외이름 as e:
yield 값
코루틴객체 = 코루틴()
next(코루틴객체)
코루틴객체.throw(예외이름, 에러메지시)
하위 코루틴의 반환값 가져오기
🔎 하위 코루틴의 반환값 가져오기
- yield from에 코루틴을 지정 -> 해당 코루틴에서 return으로 반환한 값 가져옴.
- 코루틴 안에서 return 값 == raise StopIteration(값)과 동작 동일
def 코루틴A():
변수 = (yield)
return 값
def 코루틴B():
변수 = yield from 코루틴A()
퀴즈
연습문제: 문자열 검색 코루틴 만들기
def find(word):
result = False
while True:
line = (yield result)
result = word in line
심사문제: 사칙연산 코루틴 만들기