[혼공학습단 7기] 혼공파 5주차

·2022년 2월 20일
0

파이썬

목록 보기
4/7

06 예외 처리

06-1 구문 오류와 예외

오류의 종류

기본 미션

오류는 컴파일 오류, 런타임 오류, 논리적 오류로 총 세가지 종류가 있다고 배웠었는데 파이썬에서는
컴파일 오류를 구문 오류, 런타임 오류를 예외로 보고 있다

-구문 오류
구문 오류는 구문(문법)이 잘못돼서 생기는 오류이다
처음부터 실행이 안 되는 거!
강사님께서는

print("문자)

이 코드를 구문 오류의 예시로 들어주셨음!
저렇게 구문 오류가 있는 코드를 실행시키면
Syntax Error가 뜨고 실행이 안 된다

-예외(런타임 오류)
런타임 오류는 실행하다가 중간에서 에러가 나는 겅미
코드 자체에 문법이 잘못된 건 없어서 컴파일 에러가 안 나고 일단 실행은 됨! 근데 이제 중간에서 문제가 생기는..응응
예전에 배열 배울때 런타임 에러를...참 많이 만났었는데...........
추억이 새록새록

print("실행되었습니다")
list_a = [1,2,3]
print(list_a[100])

#결과
실행되었습니다
Traceback (most recent call last):
  File "d:\python\혼공파\06-1_ex.py", line 3, in <module>
    print(list_a[100])IndexError: list index out of range

강사님이 들어주신 예시 코드도 리스트네😍

흔히 사람이 많이 몰려서 서버가 터지거나 다운되는게 런타임 오류의 예라고 볼 수 있음!

기본 예외 처리

number_input_a = int(input("정수 입력> "))

print("원의 반지름: ", number_input_a)
print("원의 둘레: ", 2 * 3.14 * number_input_a)
print("원의 넓이: ", 3.14 * number_input_a * number_input_a)

이 코드에서 정수가 아닌 다른 자료형의 값을 넣으면 에러가 뜨고 중간에 프로그램이 죽어버림 ㅠ 그래서 이걸 방지하는게 기본 예외 처리!

강사님께서는 정수를 입력 받을 때까지 입력받게하면 된다고...>.<!!
작년에 프로그래밍 배우면서 정수 입력 받을때까지 while문 돌리거나 if문 쓰는게 솔직히... 좀 이해 안 갔는데 나중에 더 큰 프로젝트를 하게 됐을때 꼭 필요한 습관이었다니 ㅠ 이제부터 기본 예외 처리를 습관화들여야겠음

그럼 이제 저 코드를 기본 예외 처리해봅시다

string_input = input("정수입력> ")
if string_input.isdigit():
    number_input_a = int(string_input)
    print("원의 반지름: ", number_input_a)
    print("원의 둘레: ", 2 * 3.14 * number_input_a)
    print("원의 넓이: ", 3.14 * number_input_a * number_input_a)
else
	print("정수를 입력해주세요!")

이렇게 .isdigit()함수를 써버리면 정수가 아닐땐 정수를 입력해달라는 말을 출력하고 프로그램을 끝낸다요

여기서 더 업그레이드시키면

while True:
    string_input = input("정수입력> ")
    if string_input.isdigit():
        number_input_a = int(string_input)
        print("원의 반지름: ", number_input_a)
        print("원의 둘레: ", 2 * 3.14 * number_input_a)
        print("원의 넓이: ", 3.14 * number_input_a * number_input_a)
        break
    else:
        print("정수를 입력해주세요!")

이렇게 while문 안에 가둬버리는 것이다~
정수를 입력 받을때까지 무 한 루 프

헉ㅋ 근데 기본 예외 처리로는 큰 프로젝트에서 대비하기가.. 어렵다고 함 또 조건문만으로 대비하기가 어려운 상황이 있다고!!!!!(예를 들어 메모리 관련)
try 구문으로 대비한다고 하는데! 봐보자구요

try except 구문

어떻게 생겼는지부터 보면

try:
	예외가 발생할 수 있는 가능성이 있는 코드
except:
	예외가 발생했을 때 실행할 코드

완전... 런타임 오류 대비를 위한 구문이시다

사용자로부터 입력 받은 문자열을 숫자로 변환하고 제곱해서 출력하는 코드로 연습을 해보자잣~~

print(float(input("숫자 입력>>")) ** 2)

이 코드에서 예외가 발생할 수 있는 부분은 float(input()) 여기!임
저 코드를 try문 안에 넣어버리면

try:
	print(float(input("숫자 입력>>")) ** 2)
except:
	print("숫자를 입력해주세요")

숫자를 입력하지 않았을때 숫자를 입력해달라는 메시지가 나오고 프로그램이 끝난다

만약에 예외가 생겼지만 따로 대처할 코드는 필요없고 프로그램이 죽지만 않아도 되는 상황이 올 수 있다는! 그때는 except: 뒤를 비어놓지 말고 pass 키워드로 채워주면 된당

try except else 구문

try:
	예외가 발생할 가능성이 있는 코드
except:
	예외가 발생했을 때 실행할 코드
else:
	예외가 발생하지 않았을 때 실행할 코드

책에 있는 내용을 내가 이해한대로 다시 써보자면
우선 예외 처리 구문에 else가 있는 언어는 파이썬이랑 루비 정도밖에 없다 else를 쓰지 않아도 코드 짜는데에는 큰 어려움이 없다는 것! else가 있는게 보기 더 깔끔하고 편한 사람이 있고 아닌 사람이 있으니 각자가 편한 방식으로 하면 되는데, 다른 사람의 코드 이해를 위해 알고 있어야하는! 것

try 코드를 실행하고 예외가 발생하면 except로 내려오고 아니면 else로 가서 코드를 수행하는 방식이다

선택 미션


ㅎㅎ 놀랍게도 3번 빼고 다 에러명은 쓸 수가 없었음

확인문제 2번

#①조건문을 사용한 코드
numbers = [52, 273, 32, 103, 90, 10, 275]

print("# (1) 요소 내부에 있는 값 찾기")
print("- {}는 {}위치에 있습니다.".format(52, numbers.index(52)))
print()

print("# (2) 요소 내부에 없는 값 찾기")
number = 10000
if number in numbers:
    print("- {}는 {} 위치에 있습니다.".format(number, numbers.index(number)))
else:
    print("- 리스트 내부에 없는 값입니다.")
print()

print("--- 정상적으로 종료되었습니다. ---")
#②try except 구문을 사용한 코드
numbers = [52, 273, 32, 103, 90, 10, 275]

print("# (1) 요소 내부에 있는 값 찾기")
print("- {}는 {}위치에 있습니다.".format(52, numbers.index(52)))
print()

print("# (2) 요소 내부에 없는 값 찾기")
number = 10000
try:
    print("- {}는 {} 위치에 있습니다.".format(number, numbers.index(number)))
except:
    print("- 리스트 내부에 없는 값입니다.")
print()

print("--- 정상적으로 종료되었습니다. ---")

finally 구문

finally는 try except 구문의 옵션 같은 존재!

try:
	예외가 발생할 가능성이 있는 코드
except:
	예외가 발생했을 때 실행할 코드
finally:
	무조건 실행할 코드

finally 뒤에 있는 코드는 맨마지막에 무조건 실행되고 끝남!
try except 구문 끝난 뒤에 쓸때나 finally 구문에 쓸때나 무조건 실행이 되는데 finally 구문을 쓰는 이유는
>> 함수 내부 return, 반복문 내부 break를 만난 뒤에도 finally 구문이 실행되고 함수나 반복문이 끝나기 때문임

교재에 있는 예시 코드

def test():
    print("test() 함수의 첫 줄입니다.")
    try:
        print("try 구문이 실행되었습니다.")
        return
        print("try 구문의 return 키워드 뒤입니다.")
    except:
        print("except 구문이 실행되었습니다.")
    finally:
        print("finally 구문이 실행되었습니다.")
    print("finally문은 아님")
    print("test() 함수의 마지막 줄입니다.")

test()

#결과
test() 함수의 첫 줄입니다.
try 구문이 실행되었습니다.
finally 구문이 실행되었습니다.

finally문이 없었으면 그냥 return 됐을때 함수 실행은 끝났을 거임
근데 finally문이 있어서 finally 구문 실행하고 함수 끗!
finally문 밖에 넣은 출력문은 출력이 되지 않앗다리...ㅠㅠ
이럴때 finally 구문이 필요한겅미...

반복문에 break도 똑같은 원리! try나 except문에서 break를 만나도 반복문을 나가기 직전에 finally문을 실행시키고 반복문을 나옴

그리고 open()을 쓸때도 finally문에 close()를 넣어주면 아주 굿굿임

06-2 예외 고급

예외 객체

try:
    명령문
except Exception as 변수로사용할이름:
    명령문

요런 형태로 쓰이밍
Mysql이 생각나요미...
예외에 이름을 붙여주는 거라고 생각하면 될듯?

값에 문제가 있다고 알려주는 코드를 예시로 보면

try:
    number = int(input("정수 입력> "))
    print("원의 반지름:", number)
    print("원의 둘레:", 2 * 3.14 * number)
    print("원의 넓이:", 3.14 * number * number)
except Exception as exception:
    if type(exception) == ValueError:
        print("값에 문제가 있습니다.")

네넹...이렇게 되어있음ㅋ

위에랑 비슷한 코드!

try:
    a = [273, 103, 52, 57, 100]
    numbe33r = int(input("정수 입력(0~4까지 입력해주세요)> "))
    print(a[number])
except Exception as exception:
    if type(exception) == ValueError:
        print("값에 문제가 있습니다.")
    elif type(exception) == IndexError:
        print("0~4까지를 입력해주세요")

여기서 업그레이드를 시킬겅미 ㅋ
저기서 예외를 구분할때 if, elif를 썼잖음 저때 들여쓰기를 줄이기 위해! except를 여러 번 씁니당..'~'

except 구문으로 예외 구분하기

try:
    a = [273, 103, 52, 57, 100]
    numbe33r = int(input("정수 입력(0~4까지 입력해주세요)> "))
    print(a[number])
except ValueError as exception:
    print("값에 문제가 있습니다.")
except IndexError as exception:
    print("0~4까지 입력해주세요.")
except Exception as exception: #필수
    print("알 수 없는 예외가 발생했습니다.")

첫번째, 두번째, 세번째 except가 if, elif 역할을 함!
맨 마지막에 Exception은 모든 오류를 뜻하기 때문에 필수적으로 넣어줘야된다고 보면 됨

raise 구문

네에.."강제로" 에외를 발생시키는 구문이라고 함!
이놈 꽤나 웃김

raise Exception("안녕하세요")

#결과
Traceback (most recent call last):
  File "d:\python\혼공파\06-1_ex.py", line 60, in <module>
    raise Exception("안녕하세요")
Exception: 안녕하세요

ㅋㅋㅋㅋㅋㅋ미뗫다.. 내 취향이야
근데 일반적인 개발을 할땐 거의 쓸 일이 없..다고...하시넹...
강제로 프로그램을 종료하기 위해 만들어진 구문임!

07 모듈

모듈은 크게 두 종류로 나뉜다
-파이썬에 기본적으로 내장되어 있는 표준(내장) 모듈,
-내장되어 있지 않아서, 별도로 다운 받아서 사용하는 외부(외장) 모듈
살짝 java 클래스 import가 생각나는..! 과연 비슷한 개념일지!!

모듈 사용 방법부터 차근차근 봅시당

모듈 읽어 들이기(1) : import() 함수

__import__("모듈의 이름")

이렇게 매개변수에 모듈의 이름을 넣어주면 불러들일 수 있음!
예를 들어 math 모듈을 읽어 들이고 싶다하면

__import__("math")

이런 식으로 해주면 됨! 그리고 불러들인 모듈은 원하는 변수에도 넣을 수 있웅

math = __import__("math")

사실 변수에 넣어야 __import__()함수로 모듈을 부르고 쓸 수 있는 거 같음

이건 모듈을 쓴 간단한 코드!

math = __import__("math")

print(math.pi)
print(math.sin(10))

짜잔
java class랑 비슷한 개념 같음!! 뭔가 반갑고 재밌다

모듈 읽어 들이기(2) : import 구문

사실 위에서 __import__() 함수 쓰면서 뒤에 뭐 나오는게 없어서

좀 답답쓰.했는데 import로 모듈을 불러오면 사진처럼 친절해짐😍😍

#math = __import__("math")
import math

print(math.pi)
print(math.sin(10))

모듈 읽어 들이기(3) : import as 구문

이름이 똑같은 모듈이 생길 수도 있어서 import as 구문이 있는 거!
as 보자마자 모듈도 별칭 만들어줄 수 있다는 촉이 옴ㅋ

import math as 수학

print(수학.pi)
print(수학.sin(10))

이건 머~~ 바로 외워짐

모듈 읽어 들이기(4) : from import 구문

와...이건 ㄹㅇ 신기함

from math import sin, pi

print(pi)
print(sin(10))

아하아하 첨에 볼땐 살짝 ㅇㅁㅇ!했는데 다시 보니까 완전 이해됨
math에서 sin, pi를 import해와서 math.pi math.sin(10)이럴 필요 없이 그냥 바로 pi, sin() 쓸 수 있웅 넘 간편하다ㅠ 갓파이썬

모듈 읽어 들이기(5) : from import * 구문

* ..뭔가 어디서 많이 봤고ㅠㅠㅠ 내 사랑 Mysqlㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

select * from ~~ #mysql 헤헤헷

마냥 파이썬에서도 *은 all! 아 뭐라하짘ㅋ 눈물나는 나애 어휘력..
할튼 모든 것을 뜻함ㅎㅎ

from math import *

print(pi)
print(sin(10))

이렇게 해주면 math가 가지고 있는 모든 함수를 math. 없이 그냥 쓸 수 있게됭미

그리고 강사님이 중요한 말 해주셨는데 무조건 import 뒤에 오는 걸 가져온다고 생각하면 된다며!!!!!

07-1 표준 모듈

구글에 python documentation이라고 치면 파이썬에 어떤 모듈이 있는지 볼 수 있음요맨

sys모듈의 argv 속성

진짜 꼭꼭 기억하고 있어야되는건

import sys

# 명령 매개변수
print(sys.argv)

바로 이 argv이시다
명령을 할때 지정하는 매개변수의 값이 들어온다고 해서 명령 매개변수임!

PS D:\python\혼공파> python 07-1_ex.py 0 2 3
['07-1_ex.py', '0', '2', '3']

갱장히 많이 활용한다며..~!!

datetime 모듈

datetime은 시간이랑 관련된 모듈! 걍 이름만 봐도 알 수 있지.ㅋ

import datetime
now = datetime.datetime.now()

datetime.datetime.now()는 현재 시각을 알 수 있음!
그리고 datetime.이 반복되는게 짱나니까

from datetime import datetime
now = datetime.now()

이렇게 해쥽시다

from datetime import datetime
now = datetime.now()

print(now.now)
print(now.date)
print(now.year)
print(now.month)
print(now.day)
print(now.hour)
print(now.minute)
print(now.second)

이렇게 뭐 이것저것ㅋ 출력해봤웅
(사실 now랑 date는.. 어케 쓰는 건지 모르겠음 출력된게 좀 이상해)

ㅠㅠ그리고 파이썬의 감동 포인트..
다른 언어에서는 month 그냥 0~11로 알려주는데 갓파이썬은 1~12로 출력해준 거라고 함 ㅠㅠㅠㅠㅠㅠ 친절해애

from datetime import datetime
now = datetime(2000, 1, 1, 1, 1, 1)
print(now)

#결과
2000-01-01 01:01:01

이것두 꽤나 신기하군..

time 모듈

import time

print("A")
time.sleep(2)
print("B")

일반적인 날짜, 시간 계산은 datetime 모듈에서 하고
time 모듈로는 보통 sleep 속성을 많이 씀!
저 코드를 실행하면 A가 출력되고 2초 뒤에 B가 출력됨
sleep..정말 말 그대로 sleep..

프로그램 작성을 sleep 없이 하게 되면 특정 사이트에 1초에 만번 이상의 요청이 걸리게 돼서 상대방 사이트에 큰 부담이 되기 때문에 잠시동안 대기해주는 역할로 많이 쓰인다고 함!

urllib 모듈

from urllib import request

target = request.urlopen("http://naver.com")
content = target.read()

print(content)

특정 사이트를 긁어올 수 있는?! 기능이라고 하심
이 코드를 실행시키면 홈페이지 코드가..쨔라란~
내가 싫어하는 html을 볼 수 있음

random 모듈

난 개인적으로 random이 항상 젤 재밌는데ㅠ 이 부분은 강의에 안 나오다닛..~~ 혼자 열심히 해볼게욧

from random import *

print(random())
print(int(uniform(10, 20))+1)
print(choice([1,2,3,4,5]))
print(shuffle([1,2,3,4,5]))
print(sample([1,2,3,4,5], k=2))

와....진짜 어떡해 너무 재밌어
첫줄부터 차근차근 설명드리겠습니다!

#1
print(random())

일단 모든 언어의 random() 값은 0.~임! 파이썬도 예외는 아니였네요요요미

#2
print(int(uniform(10, 20))+1)

uniform의 매개변수는 범위를 뜻함! 리스트 슬라이싱이랑 또 비슷한데
'10<= 값 <20' 요래요래합니당
형변환 안 하고 그냥 실행시키면

10.645268336709323
19.843888315745346

이런 느낌으로 나옴! 딱 정수로 떨어지게 만들고 싶어서 int로 형변환도 해줬습니다요밍

#3
print(choice([1,2,3,4,5]))

여기부터 진짜ㅠㅠㅠㅠ 너무 재밌어서 죽는줄 알았음
choice의 매개변수는 리스트고 요소들을 랜덤하게 하나씩 보내줌!

print(choice(["이것도","되려낭","궁금","요요","맨맨"]))

궁금해서 문자열도 넣어봤는데

#결과
요요

뜨앜ㅋㅋㅋㅋㅋ 하...진짜 파이썬하다가 다른 언어 못쓰게 되면 오또카지 진짜.. 너무 재밌움

#4
print(shuffle([1,2,3,4,5]))

이거는 실행시키면 none이 나옴..ㅠ
구글링해보니까 저렇게 쓰는게 아니더랏ㅎ

hi = [1, 2, 3, 4, 5]
shuffle(hi)
print(hi)

#결과
[1, 5, 4, 3, 2]

이런 식으로 리스트 요소 순서를 랜덤하게 바꿔주는 속성임!!
이것도 넘 재밋다 진짜...

#5
print(sample([1,2,3,4,5], k=2))

이 친구는 랜덤하게 2개를 뽑아주는 녀석입니다

#결과
[3,5]

요런 식으로 나옴

랜덤 모듈을 배웠으니..ㅋ 로또 ㄱ ㄱ

from random import *

lotto = []
for i in range(0,7):
    lotto.append(choice(range(1, 45+1)))

score = 0
numbers = []
for i in range(0,7):
    a = int(input("숫자를 입력해주세요 >> "))
    numbers.append(a)
    if lotto[i]==numbers[i] :
        score += 1

if score == 7 :
    print("당첨을 축하합니다.")
else :
    print("꽝!", score, "개 맞추셨습니다.")

엄청난 개허주접 코드지만... 미래의 내가 발전시켜나가겠습니당
그리고 로또는 정말 안 되는 거구나 싶음ㅎㅎ

공부 끗!

profile
기록하고 싶은 내용들을 주로 올리고 있습니다

0개의 댓글