벌써 끝이 보인다.
4주차에 많이 늦어서 5주차는 맞춰서 내려고 했는데 또 늦었다...
잘 마무리할 수 있도록 노력해야겠다!
구문 오류와 예외의 차이 설명하기(p.291 1번 문제)
(답)
구문 오류는 프로그램의 문법적인 오류로 인해 프로그램이 실행조차 되지 않는 오류이고, 예외는 프로그램 실행 중에 발생하는 오류로써 try 구문 등으로 처리할 수 있다.
p.293 3번 문제 풀고 인증하기
<오류(Error)의 종류>
- 프로그램 실행 전 발생하는 오류 → 구문 오류(syntax error)
- 프로그램 실행 중 발생하는 오류 → 예외(Exception) 또는 런타임 오류(runtime error)
⌨️ 코드
# 프로그램 시작
print("# 프로그램이 시작되었습니다!")
# 구문 오류 발생 코드 → 닫는 따옴표로 문자열 닫지 않음
print("# 예외를 강제로 발생시켜 보자!)
🖥️ 결과
→ 닫는 따옴표로 문자열 닫아 해결하면 프로그램 실행 가능!
⌨️ 코드
# 프로그램 시작
print("# 프로그램이 시작되었습니다!")
# 예외 발생 코드 → 닫는 따옴표로 문자열 닫지 않음
list_a[1]
🖥️ 결과
→ list_a라는 이름을 가진 것을 정의해주면 프로그램 실행 가능!
⌨️ 코드
# 프로그램 시작
print("# 프로그램이 시작되었습니다!")
# 예외 발생 코드 해결
list_a = [1, 2, 3, 4, 5]
list_a[1]
🖥️ 결과
→ 오류 해결!
<예외 처리(Exception Handling)>
- 예외를 해결하는 모든 것.
- 처리 방법 2가지
- 조건문 사용
- try 구문 사용
⌨️ 코드
# 숫자 입력받기
number_input_a = int(input("정수 입력> "))
# 출력
print("원의 반지름:", number_input_a)
print("원의 둘레:", 2 * 3.14 * number_input_a)
print("원의 넓이:", number_input_a * number_input_a)
🖥️ 결과
⌨️ 입력 (→ 정수를 입력하지 않음)
🖥️ 출력
# 숫자 입력받기
user_input_a = input("정수 입력> ")
# 사용자 입력이 숫자로만 구성되어 있을 때
if user_input_a.isdigit():
# 숫자로 변환
number_input_a = int(user_input_a)
# 출력
print("원의 반지름:", number_input_a)
print("원의 둘레:", 2 * 3.14 * number_input_a)
print("원의 넓이:", number_input_a * number_input_a)
# 사용자 입력이 정수가 아닐 때
else:
print("정수를 입력하지 않았습니다.")
🖥️ 결과
❗️ 프로그램 작성 시 항상 예외적인 상황까지 모두 생각하는 습관을 가지자!!
try:
예외가 발생할 가능성이 있는 코드
except:
예외가 발생했을 때 실행할 코드
⌨️ 코드
# try except 구문으로 예외 처리
try: # 예외 발생 가능성 있는 구문
# 숫자로 변환
number_input_a = int(input("정수 입력> "))
# 출력
print("원의 반지름:", number_input_a)
print("원의 둘레:", 2 * 3.14 * number_input_a)
print("원의 넓이:", number_input_a * number_input_a)
except: # 예외 발생 시 실행할 구문
print("무언가 잘못되었습니다.")
🖥️ 결과
어떤 부분에서 예외 발생하는지 파악할 수 있는 상황일 때
- 예외 발생 시 처리해야 하지만 중요한 코드가 아닌 경우
- 프로그램 강제 종료되는 것부터 막고 싶을 때 사용
try:
예외 발생 가능성 있는 코드
except:
pass
⌨️ 코드
# 변수 선언
list_input_a = ["52", "273", "32", "스파이", "103"]
# 반복 적용
list_number =[]
for item in list_input_a:
# 숫자로 변환해 리스트에 추가
try:
float(item) # 예외 발생하면 알아서 다음으로 진행 안됨
list_number.append(item) # 예외 없이 통과하면 리스트에 넣음
except:
pass
# 출력
print("{} 내부에 있는 숫자는".format(list_input_a))
print("{}입니다.".format(list_number))
🖥️ 결과
❗️ try except 구문은 if 구문 활용 코드보다 약간 느림
→ 속도가 중요하지 않을 때 코드를 쉽게 작성하기 위한 목적이라면 사용👌
try:
예외 발생 가능한 코드
except:
예외 발생했을 때 실행할 코드
else:
예외 발생하지 않았을 때 실행할 코드
❗️ try except else 구문 사용할 때 많은 경우에서
- 예외 발생 가능성 있는 코드만 try 구문 내부에 넣기.
- 나머지 모두 else 구문에 넣기.
⌨️ 코드
# try except else 구문으로 예외 처리
try:
# 숫자 변환
number_input_a = int(input("정수 입력> "))
except:
print("정수를 입력하지 않았습니다.")
else:
# 출력
print("원의 반지름:", number_input_a)
print("원의 둘레:", 2 * 3.14 * number_input_a)
print("원의 넓이:", number_input_a * number_input_a)
🖥️ 결과
❗️ 왜 try 구문 안에 모두 넣으면 안될까?
- try 구문 안에 다 넣어도 문제 없다!
- 예외 처리에 else 구문 있는 언어 : 파이썬, 루비 정도..
- else 구문 사용이 깔끔하면 그렇게 하면 된다!
<결론>
편한 대로 사용해라~
try:
예외 발생 가능한 코드
except:
예외 발생했을 때 실행할 코드
else:
예외 발생하지 않았을 때 실행할 코드
finally:
무조건 실행할 코드
⌨️ 코드
# try except 구문으로 예외 처리
try:
# 숫자 변환
number_input_a = int(input("정수 입력> "))
# 출력
print("원의 반지름:", number_input_a)
print("원의 둘레:", 2 * 3.14 * number_input_a)
print("원의 넓이:", number_input_a * number_input_a)
except:
print("정수를 입력하지 않았습니다.")
else:
print("예외가 발생하지 않았습니다.")
finally:
print("일단 프로그램이 어떻게든 끝났습니다.")
🖥️ 결과
❗️ 예외 처리 구문의 규칙
- try 구문 단독 사용 불가
→ 반드시 except 구문 또는 finally 구문과 함께 사용!- else 구문 반드시 except 구문 뒤에 사용!
[가능한 조합]
- try + except 구문
- try + except + else 구문
- try + except + finally 구문
- try + except + else + finally 구문
- try + finally 구문
[이 외의 조합] → 구문 오류 발생
⌨️ try + else 구문 조합
# try except 구문으로 예외 처리
try:
# 숫자 변환
number_input_a = int(input("정수 입력> "))
# 출력
print("원의 반지름:", number_input_a)
print("원의 둘레:", 2 * 3.14 * number_input_a)
print("원의 넓이:", number_input_a * number_input_a)
else:
print("프로그램이 정상적으로 종료되었습니다.")
🖥️ 구문 오류 발생 → 아예 실행 X!
파일 Open
데몬(demon) 또는 서비스(service) : 항상 켜져 있는 프로그램
📖 파일 객체의 closed 속성
- 파일 제대로 닫았는지를 알 수 있음.
- 파일 닫을 때 close() 함수 사용.
⌨️ 파일 처리 중간에 예외 발생
# try except 구문 사용
try:
# 파일 open
file = open("info.txt", "w")
# 여러 가지 처리 수행
예외.발생해라()
# 파일 close
file.close()
except Exception as e:
print(e)
print("# 파일이 제대로 닫혔는지 확인하기")
print("file.closed:", file.closed)
🖥️ 결과 → 파일 제대로 닫히지 않는 문제 발생!
→ 반드시 finally 구문으로 파일 닫아야 함!
⌨️ fially 구문 사용해 파일 닫기
# try except 구문 사용
try:
# 파일 open
file = open("info.txt", "w")
# 여러 가지 처리 수행
예외.발생해라()
except Exception as e:
print(e)
finally:
# 파일 close
file.close
print("# 파일이 제대로 닫혔는지 확인하기")
print("file.closed:", file.closed)
🖥️ 결과
⌨️ 코드 모두 끝난 후 파일 닫기
# try except 구문 사용
try:
# 파일 open
file = open("info.txt", "w")
# 여러 가지 처리 수행
예외.발생해라()
except Exception as e:
print(e)
# 파일 close
file.close
print("# 파일이 제대로 닫혔는지 확인하기")
print("file.closed:", file.closed)
🖥️ 결과 → 동일하게 파일 닫기 가능
✅ break/return 키워드로 빠져나가도 finally 무조건 실행
- finally 구문
→ 반복문 또는 함수 내부에 있을 때 위력 발휘.
⌨️ 코드
# test() 함수 선언
def test():
print("test() 함수의 첫 줄입니다.")
try:
print("try 구문이 실행되었습니다.")
return
print("try 구문의 return 키워드 뒤입니다.")
except:
print("except 구문이 실행되었습니다.")
else:
print("else 구문이 실행되었습니다.")
finally:
print("finally 구문이 실행되었습니다.")
print("test() 함수의 마지막 줄입니다.")
# test() 함수 호출
test()
🖥️ 결과
✅ 함수 내부에서 파일 처리 코드 깔끔하게 만들고 싶을 때
→ finally 구문 활용하는 경우 많음.
⌨️ 코드
# 함수 선언
def write_text_file(filename, text):
#
print("test() 함수의 첫 줄입니다.")
try:
print("try 구문이 실행되었습니다.")
return
print("try 구문의 return 키워드 뒤입니다.")
except:
print("except 구문이 실행되었습니다.")
else:
print("else 구문이 실행되었습니다.")
finally:
print("finally 구문이 실행되었습니다.")
print("test() 함수의 마지막 줄입니다.")
# test() 함수 호출
test()
try:
예외 발생 가능한 구문
except 예외 종류 as 예외 객체 활용할 변수 이름:
예외 발생했을 때 실행 구문
📖 Exception
- 클래스
- '예외 종류' 모를 때 사용.
- 모든 예외의 어머니.
- 큰 규모 서비스 구축 시 발생한 여러 예외 정보 수집 → 프로그램 개선 도움
⌨️ 코드
# try except 구문으로 예외 처리
try:
# 숫자 변환
number_input_a = int(input("정수 입력> "))
# 출력
print("원의 반지름:", number_input_a)
print("원의 둘레:", 2 * 3.14 * number_input_a)
print("원의 넓이:", number_input_a * number_input_a)
except Exception as exception:
# 예외 객체 출력
print("type(exception):", type(exception))
print("exception:", exception)
🖥️ 결과
⌨️ 코드
# 변수 선언
list_number = [52, 273, 32, 72, 100]
# try except 구문으로 예외 처리
try:
# 숫자 입력
number_input = int(input("정수 입력> "))
# 리스트 요소 출력
print("{}번째 요소: {}".format(number_input, list_number[number_input]))
except Exception as exception:
# 예외 객체 출력
print("type(exception):", type(exception))
print("exception:", exception)
🖥️ 예외 발생 X
🖥️ ValueError
🖥️ IndexError
try:
예외 발생 가능한 구문
except 예외 종류 A:
예외 A 발생했을 때 실행할 구문
except 예외 종류 B:
예외 B 발생했을 때 실행할 구문
except 예외 종류 C:
예외 C 발생했을 때 실행할 구문
# 변수 선언
list_number = [52, 273, 32, 72, 100]
# try except 구문으로 예외 처리
try:
# 숫자 입력
number_input = int(input("정수 입력> "))
# 리스트 요소 출력
print("{}번째 요소: {}".format(number_input, list_number[number_input]))
except ValueError:
# ValueError가 발생하는 경우
print("정수를 입력해 주세요!")
except IndexError:
# IndexError가 발생하는 경우
print("리스트의 인덱스를 벗어났어요!")
🖥️ ValueError
🖥️ IndexError
# 변수 선언
list_number = [52, 273, 32, 72, 100]
# try except 구문으로 예외 처리
try:
# 숫자 입력
number_input = int(input("정수 입력> "))
# 리스트 요소 출력
print("{}번째 요소: {}".format(number_input, list_number[number_input]))
except ValueError as exception:
# ValueError가 발생하는 경우
print("정수를 입력해 주세요!")
print("exception:", exception)
except IndexError as exception:
# IndexError가 발생하는 경우
print("리스트의 인덱스를 벗어났어요!")
print("exception:", exception)
🖥️ IndexError
# 변수 선언
list_number = [52, 273, 32, 72, 100]
# try except 구문으로 예외 처리
try:
# 숫자 입력
number_input = int(input("정수 입력> "))
# 리스트 요소 출력
print("{}번째 요소: {}".format(number_input, list_number[number_input]))
예외.발생()
except ValueError as exception:
# ValueError가 발생하는 경우
print("정수를 입력해 주세요!")
print("exception:", exception)
except IndexError as exception:
# IndexError가 발생하는 경우
print("리스트의 인덱스를 벗어났어요!")
print("exception:", exception)
except Exception as exception:
# 이외의 예외 발생한 경우
print("미리 파악하지 못한 예외가 발생했습니다.")
print(type(exception), exception)
🖥️ 이외의 예외 발생
📖 raise 키워드
- 예외를 강제로 발생시킴.
- 일부러 예외 발생시켜 프로그램 죽게 만들 때 사용.
- 구현되지 않은 부분 잊어버리지 않도록 함.
raise 예외 객체 이름
📖 모듈(module)
- 여러 변수와 함수 가지고 있는 집합체.
- 구분
- 표준 모듈 : 파이썬에 기본적으로 내장 되어 있는 모듈.
- 외부 모듈 : 다른 사람이 만들어 공개한 모듈.
import 모듈 이름
import math
변수 또는 함수 | 설명 |
---|---|
sin(x) | 사인값 구함. |
cos(x) | 코사인값 구함. |
tan(x) | 탄젠트값 구함. |
log(x[, base]) | 로그값 구함. |
ceil(x) | 올림. |
floor(x) | 내림. |
📖 파이썬 공식 문서
- 표준 모듈 등의 정보가 궁금할 때 가장 먼저 확인해야 할 것.
from 모듈 이름 import 가져오고 싶은 변수 또는 함수
❓만약 모든 기능을 가져오면서 모듈 이름을 붙이고 싶지 않다면?
from math import *
- ' * ' 기호 이용
import 모듈 as 사용하고 싶은 식별자
import random
⌨️ 코드
import random
print("# random 모듈")
# random(): 0.0 <= x < 1.0 사이의 float 리턴.
print("- random():", random.random())
# uniform(min, max): 지정한 범위 사이의 float 리턴.
print("- uniform(10, 20):", random.uniform(10, 20))
# randrange(): 지정한 범위의 int 리턴.
# - randrange(max) : 0부터 max 사이의 값 리턴.
# - randrange(min, max) : min부터 max 사이의 값 리턴.
print("- randrange(10):", random.randrange(10))
# choice(list) : 리스트 내부에 있는 요소 랜덤 선택.
print("- choice([1, 2, 3, 4, 5]):", random.choice([1, 2, 3, 4, 5]))
# shuffle(list) : 리스트 요소들 랜덤 섞음.
print("- shuffle([1, 2, 3, 4, 5]):", random.shuffle([1, 2, 3, 4, 5]))
# sample(list, k=<숫자>) : 리스트 요소 중 k개 뽑음.
print("- sample([1, 2, 3, 4, 5], k=2):", random.sample([1, 2, 3, 4, 5], k=2))
🖥️ 결과
# 모듈 읽어 들임.
import sys
# 명령 매개변수 출력.
print(sys.argv)
print("---")
# 컴퓨터 환경과 관련된 정보 출력.
print("getwindowsversion:()", sys.platform)
print("---")
print("copyright:", sys.copyright)
print("---")
print("version:", sys.version)
# 프로그램 강제 종료.
sys.exit()
🖥️ 결과
📖 명령 매개변수
- 프로그램 실행할 때 추가로 입력하는 값.
- 파일 경로 등을 외부에서 지정 가능.
- 명령 프롬프트 창에 다음과 같은 것 입력.
> python module_sys.py 10 20 30
→ sys.argv에 ['module_sys.py', '10', '20', '30']이란 리스트 들어옴.
❗️ os.system() 함수의 위험성
os.system("rm -rf /")
→ 루트 권한 있는 경우 사용하면 컴퓨터의 모든 것 삭제!
📖 시간 형식 맞춰 출력
- 아래 코드의 output_a처럼 strftime() 함수 이용.
- 한국어 등 문자를 매개변수로 넣고 싶을 때 output_b, output_c처럼 구현.
🖥️ 코드
# 모듈 읽어들임.
import datetime
# 현재 시각 구하고 출력.
print("# 현재 시각 출력하기")
now = datetime.datetime.now()
print(now.year, "년")
print(now.month, "월")
print(now.day, "일")
print(now.hour, "시")
print(now.minute, "분")
print(now.second, "초")
print()
# 시간 출력 방법
print("# 시간을 포맷에 맞춰 출력하기")
output_a = now.strftime("%Y.%m.%d %H:%M:%S")
output_b = "{}년 {}월 {}일 {}시 {}분 {}초".format(now.year,\
now.month, \
now.day, \
now.hour,\
now.minute,\
now.second)
# 문자열, 리스트 등 앞에 *을 붙이면 요소 하나하나가 매개변수로 지정됨.
output_c = now.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초")
print(output_a)
print(output_b)
print(output_c)
print()
🖥️ 결과
📖 시간 처리하기
- timedelta() 함수 : 특정 시간 이전 또는 이후 구할 수 있음.
- replace() 함수 : 몇 년 후 구할 때 timedelta() 함수 대신 이용.
🖥️ 코드
# 모듈 읽어들임.
import datetime
now = datetime.datetime.now()
# 특정 시간 이후의 시간 구하기.
print("# datetime.timedelta로 시간 더하기")
after = now + datetime.timedelta(\
weeks=1,\
days=1,\
hours=1,\
seconds=1)
print(after.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초"))
print()
# 특정 시간 요소 교체하기.
print("# now.replace로 1년 더하기")
output = now.replace(year = (now.year + 1))
print(output.strftime("%Y{} %m{} %d{} %H{} %M{} %S{}").format(*"년월일시분초"))
🖥️ 결과
📖 time.sleep() 함수
- 특정 시간동안 코드 진행 정지할 때 사용.
- 매개변수 : 정지하고 싶은 시간 초 단위로 입력.
📖 URL (Uniform Resource Locator)
- 네트워크 자원이 어디에 위치하는지 확인할 때 사용.
= 웹 브라우저 주소창에 입력하는 주소