2023-07-11/ ~ /0713
2023.07.11 - [LG 헬로비전 DX DATA SCHOOL/Python] - 객체 지향 프로그래밍 (OOP)
객체 지향 프로그래밍 (OOP)
2023-07-11 오늘은 저번 시간에 이어서 파이썬에서의 객체지향 프로그래밍에 대해서 포스팅 해보겠습니다! 객체 지향 프로그래밍은 함수와 제어문과 연관되어 있기에, 이전 내용도 확인하시고 오
dxdata.tistory.com
Data Type
앞서 언급못한 모듈들은 다음과 같습니다!
1. Math 모듈
- 수학과 관련된 모듈
2. decimal.Decimal
- float 보다 정확한 숫자를 표현하기 위한 모듈
- 실수를 배열로 만들어서 관리
#실수 표현의 한계 때문에 2개 연산의 결과가 다르게 나옴.
print((1234.567 + 45.6789) + 0.0004)
print(1234.567 + (45.6789 + 0.0004))
# 계산결과가 다름!
#1280.2462999999998
#1280.2463
from decimal import Decimal
#실수를 문자열로 만들어서 Decimal 모듈을 이용하면 정확한 계산이 가능
print((Decimal('1234.567') + Decimal('45.6789')) + Decimal('0.0004'))
print(Decimal('1234.567') + Decimal('45.6789') + Decimal('0.0004'))
#1280.2463
#1280.2463
#정확한 계산결과!
print(0.2 == (1.0 - 0.8)) #False
print(Decimal('0.2') == (Decimal('1.0')-Decimal('0.8'))) #True
3. random 모듈
- 난수를 추출하기 위한 모듈
- 난수를 추출하기 위한 원리 : 먼저 난수를 추출하기 위한 난수표를 생성하는데 난수표를 프로그래밍에서는 seed 라고 한다. 숫자를 생성하는 함수를 호출하면 난수표에서 순서대로 숫자를 리턴함. seed를 고정하면 난수는 순서대로 일정하게 추출되고, seed를 고정하지 않으면 랜덤한 숫자가 나오게 된다.
- java 는 seed 설정 안할시 고정, c+, python은 랜덤으로 입력
- 함수 :
seed(x) : 시드 설정 - 이 함수를 호출하지 않거나 None을 대입하면 현재 시간이 설정되서 랜덤한 효과(40을 자주 사용)
random() : 0 부터 1사이의 소수가 리턴
randint(최소, 최대) : 숫자 사이의 정수를 리턴
uniform(최소, 최대) : 숫자 사이의 실수를 리턴
randrange(시작, 끝[, 간격])
gauss(m, sb): 가우스 분포의 난수
shuffle(시퀀스) : 시퀀스를 섞음
choice(시퀀스) : 랜덤한 데이터를 리턴 - 복원 추출
sample(시퀀스 , 개수) : 랜덤한 데이터를 개수만큼 리턴 - 비복원 추출
%%로또 구현 %%
# 1부터 45까지의 숫자에서 6개를 랜덤하게 추출해서 입력한 숫자와 입력한 숫자가 일치하는지 확인해서 몇번 추출했는지 확인
ar = range(1, 46)
cnt = 0
while True :
k = random.sample(ar, 6)
k.sort()
cnt = cnt +1
if lotto == k :
print("1등이요!")
break
print(cnt)
0713
Data Type
1. Sequential Type
- 데이터를 순서대로 저장하는 자료구조
- bytes, str, list, tuple, set, dict 등
1.1)공통연산
- 인덱싱 : 데이터 1개를 찾아오는 것
- [인덱스]: __getitem__ 메서드를 호출해서 인덱스번째 데이터를 가져오는 것
- + : 결합을 시켜서 새로운 sequence를 리턴
- * : 정수와 연산해서 반복시킨 sequence를 리턴
- in : 존재 여부를 리턴
- len(데이터) : 데이터 개수를 리턴
- slicing : [start : end : interval] (range랑 똑같음)
파이썬에서는 인덱스에 음수 사용이 가능한데, -1이 가장 오른쪽을 의미
1.2) str
- 파이썬의 문자열 클래스
- 파이썬은 문자와 문자열을 구분하지 않음
- 문자열 리터럴 -> " ", ' ' , """ 여러줄 """
- " 안에 다른 "를 사용할 수는 없지만 ' 는 가능하다. -> 즉 가장 바깥의 따움표와 안의 따움표의 종류를 다르게 해야함.
- 문자열은 내부 데이터를 변경할 수 없고, 작업시 복사를 하여 작업을 수행
- > , >= , <, <=, ==, != 연산자 사용 가능
- 첫번째 글자부터 순서대로 코드 값을 비교하는 방식(소문자 : 97 시작, 대문자 : 65 시작)
- Escape Code(제어문자) : \다음에 영문자 1개를 추가해서 특수한 기능을 수행하도록 해주는 문자(\n, \t, \b, \f, \0, \\, \',\")
- 데이터를 가지고 문자열 생성
%"format.."%(데이터 나열) : format에 데이터가 설정되는데 형식을 지정할 수 있음.
포멧에는 d(정수), f(실수), c(문자 한개), s(문자열)
자리수 설정도 가능!!
1. %10d : 열자리를 확보해서 출력 - 부족하면 늘어남
2. %.3f : 소수를 3자리까지만 출력(4번째에서 반올림)
a = 10
#a = 10 의 형태로 문자열 만들기
s = "a = %d"%(a) #메모리 내에 원본을 남겨놓지 않게 됨.
print(s)
"{데이터 순서: 서식}".format(데이터 나열) 의 형태로도 생성 가능
s = "a = {0:d}".format(a)
f"문자열{변수명:서식}"의 형태로도 가능
s = f"a = {a:d}"
- str은 많은 메서드를 소유하고 있음.
- is로 시작하는 메서드는 리턴값이 bool임. (True or False)
- 코딩 테스트를 준비할 때는 이 클래스의 메서드는 미리 사용을 해보는게 좋습니다!
Upper를 한번 구현해보아라!
- 문자열 인코딩
Encoding : 문자 나 숫자를 컴퓨터의 메모리에 저장히기 위한 코드로 변경하는 것
Decoding : 컴퓨터의 메모리에 저장된 코드를 원래 문자 나 숫자로 변경하는 것
- 대표적인 인코딩 방식
utf-8 : 현재 웹의 표준
cp949(ms949) : ms 사의 한글 인코딩 방식
euc-kr : 예전 웹에서의 한글
latin1(iso8859-1) : 서유럽 문자 인코딩
문자열을 인코딩 된 바이트로 변환할 때는 encode(인코딩방식 = 시스템인코딩)
바이트 코드를 문자열로 변환할 때는 decode(디코딩방식 = 시스템 디코딩)
하나의 문자를 코드로 변환할 때는 ord 함수를 사용하고 코드를 문자로 변환할 때는 chr 함수를 이용
현재 시스템의 인코딩을 확인하고자 할 때는 sys.stdin.encoding 과 sys.stdout.encoding
1.3) 정규 표현식(Rengular Expression - RegExp 나 RegEx)
- 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어
: A-Za-z / 가-힣
- 표현식은 단순한데 문법은 쉽지않다. -> 가독성이 떨어짐
- 파이썬에서는 re 모듈을 이용해서 제공
- 자연어 처리에는 굉장히 중요
- 입력을 받을 때 유효성 검사를 수행하는 경우에도 사용
HTML5에서는 input 객체들에 pattern 이라는 속성을 이용해서 정규 표현식을 설정할 수 있도록 했다.
re 패키지를 이용하여
이메일 오류 여부 검사!
#re 클래스의 메서드
import re
p = re.compile('^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
emails = ['python@mail.example.com', 'python+kr@example.com', # 올바른 형식
'python-dojang@example.co.kr', 'python_10@example.info', # 올바른 형식
'python.dojang@e-xample.com', # 올바른 형식
'@example.com', 'python@example', 'python@example-com']#잘못된형식
for email in emails:
print(p.match(email) != None, end=' ')
#True True True True True False False False
- re는 Python의 표준모듈.
1.4) Bytes
- 바이트의 배열
- 네트워크 전송이나 파일 입출력 또는 이미지 프로세싱에서 사용
자료 구조 : 여러 개의 데이터를 저장하는 방법
배열(Array) : 데이터를 물리적으로 연속배치, 크기변경 불가능,
입이나 삭제를 할 때는 복사 작업 발생
에서 15를 지울려면, 다시 3개의 공간을 재 할당받아서 10, 20, 30을 다시 배치한다. 즉 메모리 복사 후, 새로운 메모리를 찾아 변경 내용 할당
10 15 20 30
ArrayList(vector) : 가변 배열(크기의 변화가 자유로운 배열) but 메모리 여분을 가지고 있음.
메모리 복사 필요 없음.
그러나 새로운 인자를 맨 앞에 넣을려면 모든 인자를 뒤로 밀어야함.
Linked List : 논리적인 순서대로 저장
다음 데이터 포인터를 가지는 구조.
즉, 다음 데이터의 위치를 따로 기억하며 메모리에 값을 저장.
BOF(HEAD) 와 EOF(TAIL) 사이에 데이터가 저장.
다음 데이터 포인터가 존재하기 때문에, 데이터 삽입과 삭제가 매우 간편함.
삭제 시, 기존 포인터를 그 다음 부분을 가리키도록 바꿈.
메모리 할당 방법
1. First Fit : 빈 메모리중 가장 먼저 발견된 큰 메모리에 할당
2. Best Fit : 필요 메모리만큼의 메모리를 찾아 할당
3. Worst Fit : 가장 큰 메모리 찾아 할당
메모리 저장 방식
Stack / Queue / Deque
Stack : Last in, First out -> 함수가 스택을 사용
Queue(파이프) : First in, First out -> 스케쥴링
급한 것은 priority queue라 하여 우선순위 처리도 가능
Deque : (Either in, Either out) -> 양쪽에서 삽입과 삭제가 가능
스크롤 구현!
Tree : 부모 자식 관계 (레벨의 차이가 존재)
proorder, post order, inorder
가중치
tree의 각 노드 순회 알고리즘 등.
Graph : 모든 노드가 동일한 레벨
가중치가 노드별로 설정되어 있음
Set / Dict : 해싱의 기법을 사용함. 중복이 없는 구조.
set :
ex) 20, 18, 7을 저장할때 % 3 == 0/ 1/ 2 인 메모리를 만들어 0에 18 저장, 1에 7 저장, 2에 20 저장. -> 나머지 값을 이용해 저장된 값을 찾아가는 방식 -> 각 데이터를 1번이면 검색 가능 O(1)
dict : 검색 시간 O(n) -> key 값을 하나 씩 늘려가며 값을 찾기 때문
알고리즘은 자료구조를 이기지 못한다. -> 부족한 자리(자료구조)에 아무리 구겨넣어도(알고리즘) 들어가지 않기 때문
% LIFO(Last in, First out)
% FIFO(First in, First out)
% EIEO(Either in, Either out)
% Tree
1.5) List : 코테에서는 가장 중요!
- 데이터를 순서대로 저장하는 객체의 집합
- 내부의 데이터를 변경할 수 있고 크기 변경도 가능하지만 중간의 데이터를 삽입하거나 삭제하는 경우 속도가 근림
- 생성
- [ ]
- [데이터 나열]
- list(__iter__ 구현된 인스턴스)
- 인덱싱과 슬라이싱을 지원
- 내부 데이터 삭제
del 리스트[인덱스]
리스트[시작위치:종료위치] = [ ]
del 리스트[시작위치 : 종료위치]
- 리스트는 데이터의 참조를 저장
- 메서드
리스트.append(데이터)
insert(인덱스, 데이터)
index(데이터)
count(값)
reverse()
remove(데이터) : 데이터와 일치하는 첫번째 데이터를 삭제
pop(인덱스) : 인덱스를 생략하면 마지막 데이터를 삭제하고 인덱스를 설정하면 인덱스 번째 데이터를 삭제
- pop은 stack에서 데이터를 꺼내는 동작
- push가 stack에 데이터를 삽입하는 동작
extend(_iter__ 가 구현된 객체)
# 코드 예시를 봐볼까요!
#list의 메서드 활용
li1 = ["hello", "vision", "dxdata", "school", "1기"]
li2 = list(range(10))
#데이터 추가
li1.append("합격")
#한개 데이터 출력
print(li1[0])
#슬라이싱 (범위로 출력)
print(li1[0:-2])
#리스트 데이터 삭제
del li1[3]
#데이터 순회
for item in li1 :
print(item)
- 데이터 정렬 : list의 sort함수를 이용하면 Timsort(Merge Sort와 Insertion Sort를 합친 파이썬 정렬 알고리즘) 알고리즘을 이용해서 데이터를 내부적으로 정렬
- sorted 함수에 list를 대입하면 정렬한 결과를 리턴
- key 속성에 데이터 변환을 위한 함수를 대입하면 변환 결과를 가지고 정렬
- reverse 속성에 True를 대입하면 내림차순 정렬
# list의 정렬
li = ["Hello", "vision", "dxdata", "school", "1기"]
li.sort() #오름차순 정렬
print(li)
li.sort(reverse = True) #내림차순 정렬
print(li)
result = sorted(li) #sorted()는 return을 해주기 때문에 변수로 받아야함.
print(result)
#영문 대소문자 구분없이 정렬
li.sort(key = str.lower)
print(li)
# ['1기', 'Hello', 'dxdata', 'school', 'vision']
# ['vision', 'school', 'dxdata', 'Hello', '1기']
# ['1기', 'Hello', 'dxdata', 'school', 'vision']
# ['1기', 'dxdata', 'Hello', 'school', 'vision']
- list의 대안
정수 나 실수 여러 개를 가지고 리스트를 만들 때는 array가 훨씬 더 효율적인데, 그 이유는 array는 C언어에서 사용하는 값 타입으로 데이터를 저장하기 때문
- python의 int 나 float 은 클래스!!
양쪽 끝에 데이터를 추가하거나 삭제하는 경우는 collections 모듈의 deque가 효율적임.
numpy나 scipy 가 제공하는 고급 배열이나 행렬 연산을 사용하면 과학 계산이 편리함.
queue 모듈의 Queue, LifoQueue, PriorityQueue를 제공 - 초기 설정보다 많은 양의 데이터를 삽입하면 block되어 데이터를 넣을 수 없다.
multiprocessing 모듈의 JoinableQueue : 프로세스간 통신을 지원하는 Queue
asyncio : 비동기 프로그래밍(thread 프로그래밍)에 사용하는 Queue를 제공
heapq : 가변 시퀀스(linked)를 이용해서 queue를 구현
1.6) tuple - record
- 임의 객체들이 순서를 가지는 데이터의 집합
- 리스트와 유사하고 접근 방법도 동일
- 내부 데이터의 변경이 불가능
- 리스트는 데이터 타입에 상관없이 저장 가능하지만, 실제로는 동일한 데이터 타입만 저장하지만 튜플은 record(행)의 개념이므로 데이터 타입에 상관없이 묶어서 하나를 표현하고자 할 때 사용.(tuple은 sort 안함)
tuple 의 생성
- (데이터 나열) -> 데이터가 여러 개일 경우
- (데이터, ) -> 데이터가 한 개일 경우
- 데이터 나열
list와 tuple은 unpacking 기능을 제공 : 여러 변수와 데이터를 나누어서 저장하는 것
record = ("hello", "dxdata", "school", "vision", 1) #튜플 생성
print(record)
print(record[0])
#record[0] = "Hello" # ERROR, 수정이 불가능 함.
#list와 tuple은 unpacking 이 가능함.
company, edu, job, name, st = record
print(company)
*etc, company = record # *을 이용하면 나머지 모두를 list로 생성
print(etc)
#swap : 2개의 데이터의 값을 치환
a = 10
b = 20
a , b = b , a
print(a, b)
데이터의 모임을 만들고자 할 때 클래스를 이용하지 않고 Tuple을 활용하기도 합니다.
- VO(Variable Object) : 값으로만 구성된 객체이며 데이터를 표현하기 위한 객체
- DTO(Data Transfer Object) : 데이터 전송에 사용하는 객체로 일반적으로 VO에 Serializable을 구현하면 됩니다.
- Domain 객체라고도 하는데, 다른 언어에서는 Structure라고 한다.(구조체)
- 테이블 형태의 데이터 구조를 만들 때 tuple의 list를 이용하는 경우가 있습니다.
- 일반 tuple은 각 컬럼에 이름을 부여할 수 없는데 collections 모듈의 namedtuple을 이용하면 컬럼에 이름을 부여할 수 있습니다.
#테이블 구조의 데이터를 생성
data = [('adam', '010'), ('jessica', '011')]
#이름만 출력
for row in data :
print(row[0]) #이름이 없어 index로 찍어야함.
# 컬럼에 이름을 사용하는 튜플
from collections import namedtuple
#자료구조 생성 - 튜플의 각 컬럼 이름 만들기
Person = namedtuple("Person", "name mobile")
persons = [Person('adam', '010'), Person('jesscia', '011')]
for person in persons :
print(person.name) #이름이 있어서 name으로 값을 얻을 수 있다.
1.7) set
- 데이터의 순서와 상관없이 해싱을 이용해서 데이터를 저장하는 클래스
- 해싱을 이용하기 때문에 중복된 데이터는 저장하지 않음.
실제로는, 아주 미세한 확률로 중복되지 않는 데이터도 저장되지 않을 수 있다.
- set 과 frozenset(객체의 내용을 변경할 수 없는 set) 이 제공
- 생성
{데이터 나열}
set(__iter__ 가 구현된 객체)
비어있는 set을 만들 때는 { }는 안되고 set()으로 만들어야 합니다.
{ } 는 비어있는 dict가 생성됩니다.
- 집합 연산을 위한 메서드가 제공됩니다.
union, intersection, difference, symmetric_difference 과 updata, intersaction_update 등
- 데이터의 존재 여부를 확인하는 경우에는 가장 빠른 방법입니다.
1.8) dict
- key 와 value를 쌍으로 저장하는 자료구조
- key 가 set으로 만들어 짐.
- 생성
{key : value, key1 : value1...}
- key의 자료형은 아무것이나 가능하지만 특별한 경우가 아니면 str
- key의 데이터 가져오기
dict이름[키] : 키가 존재하지 않으면 KeyError
dict이름.get(키, 기본값) : 키가 존재하지 않으면 기본값
- for를 이용해서 순회하면 key 값이 순서대로 대입된다.
- keys(), values(), items()를 이용해서 key, value, (key,value) 목록을 가져올 수 있다.
- del 디셔너리이름[키] 로 키값을 삭제할 수 있고 전체 삭제는 clear() 호출
- dict는 데이터를 삽입하거나 삭제 그리고 조회할 때 시간 복잡도가 O(1) 이다.
- 메모리 낭비가 심함.
#dict 생성
dic = {}
#데이터 추가
dic['name'] = 'adam'
dic['job'] = 'singer'
dic['father'] = 'pms'
dic['father'] = 'pjm'
print(dic)
print(dic["job"])
print(dic.get("job", "nojob"))
# print(dic["score"]) #존재하지 않는 key를 사용하면 keyError 발생
print(dic.get("score", 0)) #존재하지 않는 key를 사용하면 두번째 매개변수가 리턴
#순회
for key in dic :
print(key,":", dic[key])
동작 시 시간 복잡도를 줄이는 방법으로
1. 반복문 제거 2. 정렬 3. 자료구조의 변경 등 3가지가 있다...
#DTO 역할을 수행하는 클래스 생성 - 최근에는 더 권장
class DTO :
def __init__(self, name="noname", tel="전화없음"):
self.name = name
self.tel = tel
#데이터 목록 출력
datas = [DTO("adam", "010"), DTO("jessica", "011")]
#이름과 전화번호 출력
for data in datas :
print(data.name, data.tel)
datas = [{"name":"adam", "tel":"010"}, {"name":"jessica", "tel":"011"}]
for data in datas :
for key in data :
print(key, ":", data[key])
이차원 배열 대신에 dict
kia =["윤영철", "최형우", "이의리"]
lg = ["켈리", '플럿코']
han = ["노시환"]
kbo = [{"team" : "기아", "data" :kia}, {"team" : "엘지", "data" : lg}, {"team" : "한화", "data" : han}]
for dic in kbo :
print(dic.get("team"), end=":")
for player in dic.get("data"):
print(player, end = "\t")
print()
list로 놀아보기!
li = list(range(10))
a = []
#li의 모든 데이터를 제곱한 list 생성
#1번
for i in li :
i = i*i
a.append(i)
result = a
print(result)
#2번
# map 함수 이용
# def mul_one(n):
# return n * n
#함수 정의 혹은
#lambda 사용
result2 = list(map(lambda x : x*x, li)) # map반환을 list 로 변환
print(f'result2 : {result2}')
#3번 list comprehension 이용
#[연산식 순회할문장
result3 = [i*i for i in li]
print(result3)
#for 2개 사용
li1 = [1, 2, 3]
li2 = [4, 5, 6, 7]
result= [x*y for x in li1 for y in li2]
print(result)
#list의 활용
#for 와 if 사용 가능 - filtering
singers = ["태연", "수지", "아이유","유나", "장원영"]
#글자 수가 3이상인 데이터만 추출
result = list(filter(lambda x : len(x)>=3, singers))
print(result)
result = [x for x in singers if len(x) >= 3]
print(result)
맨 마지막 줄을 본다면, 함수가 없이 조건으로 추출하기 때문에, filter, map 을 사용한 기법에 비해 훨씬 빠릅니다.
#if else for 활용
# result = [x if len(x) >= 3 else x + "_" for x in singers]
# print(result)
이와 같은 문법도 가능합니다.
2. Python에서 제공하는 모듈 중 코테를 보는데 필요한 모듈
2.1) queue 모듈
- Queue와 Stack을 제공하는 모듈
- queue.Queue(maxsize): 큐를 생성
- queue.LifoQueue(maxsize) : 스택을 생성
- queue.PriorityQueue(maxsize) : 우선 순위 큐를 생성
- maxsize 이상의 데이터를 추가하면 block이 되서 데이터를 사용할 때 까지 대기
- PriorityQueue는 데이터를 삽입할 때 (순위, 아이템) 형태로 삽입
- 순위가 낮은 것이 우선순위가 높은 것임.
- get 메서드(꺼내기)와 put 메서드(저장하기) 를 이용해서 읽고 쓰기를 수행
2.2) collections 모듈
- deque와 Counter가 유용
- Counter 객체는 dict 형태로 데이터를 저장하고 있어서 개수를 세거나 상위 순위 데이터를 추출하는데 유용
- 개수를 세는 작업(wordcloud 만들기)을 진행할 때 유용함.
#개수 쓸 때 유용한 팁!
from collections import Counter
data = ["한식", "중식", "분식", "한식", "일식", "양식","중식", "분식", "인식", "한식"]
counter = Counter(data)
print(counter)
print(counter.keys())#dict 으로 활용 가능
print(counter["한식"])
#상위 2개만 추출
print(counter.most_common(1))
#튜플의 목록
data = [("APPLE", 3), ("APPLE", 2), ("ORANGE", 3), ("MANGO", 3), ("ORANGE", 5)]
counter = Counter()
#데이터의 합계 구하기
for name, count in data :
counter[name] += counter #개수 , count면
print(counter)
#데이터의 개수 구하기
for name, count in data :
counter[name] += 1
print(counter)
deque, Counter -> collections 패키지
2.3) itertools
- 효율적인 루핑을 위한 iterator를 만드는 함수들의 패키지
3. Exception Handling(예외 처리)
3.1) 오류
#오류의 종류 :
- 컴파일 오류 : 문법적인 오류로 실행이 되지 않는 오류
- 예외(Exception) : 문법적인 오류는 없어서 실행이 되지만 실행 도중 멈추는 현상
- 논리적 오류 : 문법적인 오류나 예외가 없어서 실행은 되지만 결과가 이상한 경우
- 단언(assertion) : 의도적으로 오류를 발생시켜서 프로그램을 강제로 중단시키는 것
#오류 발생 시 조치
- 컴파일 오류는 실행이 안되므로 에러를 직접 찾아서 수정
- 예외는 수정할 수 있으면 수정을 하고, 그렇지 않으면 예외 처리를 수행
- 논리적 오류는 알고리즘 문제이므로 디버깅을 통해서 해결 (IDE는 breakpoint가 존재해서 해당 지점까지의 실행결과를 볼 수 있다.)
3.2) Debugging
예외나 논리적인 오류를 찾아서 해결하기 위해서 수행하는 동작
# 수행 방식
- IDE가 제공해주는 디버깅 Tool을 이용하여 메모리를 확인
- 로그를 출력해서 직접 확인하는 방법
- Test Tool을 이용
3.3) 예외 처리
# 예외 처리의 목적
- 예외가 발생하더라도 프로그램을 정상적으로 동작시키기 위한 것
- 예외 내용을 로깅 - 예외 문제를 확인해 볼 수 있습니다.
# 기본적인 예외 처리 구문
try :
예외가 발생할 가능성이 있는 구문
except :
예외가 발생할 시 수행할 구문
def div(x) :
return 10 / x
try :
print(div(20))
print(div(0)) #프로그램 에러 발생시키는 요소
except :
#try 절에서 문제가 발생하면 수행되는 구문
print("HI")
print("프로그램 종료")
- 크롤링을 할 때 데이터의 링크를 찾아가다 보면 데이터의 링크는 있으나, 데이터는 없는 경우가 발생할 수 있음. 그런 경우 예외처리를 하지 않으면 크롤링 도중에 종료되버릴 수 있으므로, 예외처리 구문을 사용을 하여 링크는 있는데 데이터가 삭제된 경우 다음 데이터를 수집할 수 있도록 만들어주는 것이 좋습니다.
#간단히 코딩 연습을 해봅니다.
gccg라는 문자열의 위치가 어떻게 되는지 전부 찾아보겠습니다. 대신 gccgccg는 앞 gccg를 제외했을 때 ccg이므로 gccg문자열 1개로 앞의 인덱스를 반환해야 합니다.
#gccg 문자열 위치 전부 찾아보기
#이미 찾은건 제외하고 찾아야함.
gc = "gccgccgsgcjcgccgcgdcjha"
ar = gc.replace("gccg", "!!!!")
idx = []
aa = '!!!!'
for i in range(0,len(ar)) :
if ar[i:i+4] == aa :
idx.append(i)
print(idx)
이 알고리즘이 replace와 매우 흡사하다고 판단하여 replace를 이용해서 중복을 처리했습니다!
'LG 헬로비전 DX DATA SCHOOL > Python' 카테고리의 다른 글
Django (0) | 2023.07.26 |
---|---|
Python 예외처리 / File handling (0) | 2023.07.14 |
객체 지향 프로그래밍 (OOP) (0) | 2023.07.11 |
Python - 제어문과 함수 2 (0) | 2023.07.10 |
Python - 제어문과 함수 (0) | 2023.07.07 |