수업 12일차

galoo·2023년 7월 12일
0

HelloVision Dx Data School

목록 보기
12/72
post-thumbnail

✔ Data Type

Sequential Type

  • 객체를 순서대로 저장하는 자료형
  • bytes, str, list, tuple 등

컨테이너 시퀀스

  • 서로 다른 자료형의 항목들을 담을 수 있음
    - tuple, list, collections.deque (list deque은 굳이 안그럼)
  • 객체에 대한 참조를 담고 있으며, 객체는 어떠한 자료형도 될 수 있음

균일 시퀀스

  • 하나의 자료형만을 담을 수 있음
    - str, bytes, bytearray, memoryview, array.array
  • 객체에 대한 참조 대신 자신의 메모리 공간에 각 항목의 값을 직접 담기 때문에, 균일 시퀀스가 메모리를 더 적게 사용하지만, 문자, 바이트, 숫자 등 기본적인 자료형만 저장할 수 있음
  • 메모리 효율로는 컨테이너 시퀀스가 더 좋을 수 있음(균일 시퀀스는 만들면 지워지지 않기 때문)

가변 시퀀스

  • list, bytearray, array.array, collections.deque, memoryview

불변 시퀀스

  • tuple, str, bytes
  • 세부 데이터를 바꿀 수 없다는 것이다.
str="hello"
str="hi" 가능
str[0]='k' 는 불가능

읽기전용, 쓰기 가능을 생각하자
tuple은 못바꾸게 하려고 만든겁니다.

계산의 결과는 못바꾸게 하는 것이 좋습니다.

멀티스레드?

  • thread / coroutine
  • 하나 사용하고 있는 것을 다른애가 수정하는 것이 문제입니다.
  • 읽는 것은 상관이 없지만, 쓰기를 해버리면 문제가 생깁니다.
  • 결과가 오류가 나거나 만든 데이터가 사라지거나 합니다.

공통연산

인덱싱

  • 데이터 1개를 찾아오는 것
  • [인덱스]: __getItem__메서드를 호출해서 인덱스번쨰 데이터를 가져오는 것
  • + : 결합을 시켜서 새로운 sequence를 리턴
  • * : 정수와 연산해서 반복시킨 sequence를 리턴
  • in : 존재 여부를 리턴
  • len(data) : 데이터의 개수를 리턴
  • [start:end:interval] : 슬라이싱
    - start 생략하면 0부터
    - end 생략하면 끝까지
    - interval 생략하면 1
    - python에서는 인덱스 음수 사용이 가능하며, -1이 끝을 의미함
msg="hello World!"
print(msg[::])#전체
print(msg[:-2:])#뒤에서 두번째 앞까지
print(msg[::-1])#반대로 

str

  • python의 문자열 클래스
  • 파이썬은 문자와 문자열을 구분하지 않는다.(문자 자료형이 따로 없음)
  • 문자열 리터럴
    '문자열', "문자열", 
    """
    여러줄 
    문자열
    """
    - ""안에 다른 " 할 수 없지만 '는 가능
  • 문자열은 내부 데이터를 변경할 수 없음
  • 문자열은 작업을 할 때, 복사를 해서 작업을 수행
  • >>,>=,<=,==,!=연산자 사용이 가능합니다.
    - 첫 글자부터 순서대로 코드 값을 비교하는 방식
    - 소문자(97)가 대문자(65)보다 큼
msg="hello"
msg[1]="H"

TypeError: 'str' object does not support item assignment

Escape Code - 제어 문자

  • \다음에 영문자 1개를 추가해서 특수한 기능을 수행하도록 해주는 문자
  • \n, \t, \r, \b, \f, \\, \0, \', \"
  • \r ,\n : 커서를 맨앞으로 가져오고 줄바꿈

데이터를 가지고 문자열 생성하기

  • "%format.."%(데이터 나열) : 포맷에 대이터가 설정되는데 형식을 지정할 수 있음
  • d(정수), c(문자 1개), f(실수), s(문자열)
  • 자릿수 설정도 가능함
    - %10d : 10자리를 확보해서 출력함
    - %.3f : 소수 3자리까지(반올림)
a=10
s="a="+str(a) 
# 문자열에서 + 는 금기시 되는 작업입니다.
# 공간의 낭비가 될 수 있는 작업(두 번 이상의 작업이 필요)
s="a = %d"%a 
#이러면 데이터가 들어가는 구조로 메모리 낭비를 줄일 수 있다.

크롤링 할 때, 메모리 낭비가 매우 심할 수 있다. 이를 막아야 한다.

  • "{데이터 순서: 서식}".format(데이터나열) 의 형태로도 가능
    - %는 연속된 나열하기 너무 어려움
s="a={0:d}".format(a)
  • f"문자열{변수명:서식}"의 형태로도 가능함
s=f"a={a:d}"
  • str은 많은 메서드를 소유하고 있습니다.
  • is로 시작하는 method는 return값이 bool

코딩 테스를 준비할 때는 이 클래스의 메서드는 미리 사용을 해 보는 것이 좋습니다.
코딩 테스트 -> list, str 클래스 메서드 공부를 해야 한다.
해당 메서드를 구현하는 것도 해보면 좋다.
우선 dir과 help를 통해 공부를 하자.

문자열 인코딩

  • Encoding
    - 문자, 숫자를 컴퓨터의 메모리에 저장하기 위한 코드로 변경하는 것
    - UTF-8(웹 표준), CP949(ms949), EUC-KR, latin1(iso8859-1)
  • Decoding
    - 컴퓨터의 메모리에 저장된 코드를 원래 문자, 숫자로 변경하는 것

문자열을 인코딩 된 바이트로 변환

  • encode(인코딩방식=기본은 시스템인코딩)

바이트 코드를 문자열로 변환

  • decode(인코딩박식=시스템인코딩)

하나의 문자를 코드로 변환

  • ord함수를 사용

코드를 문자로 변환

  • chr함수를 사용

현재 시스템의 인코딩을 확인

  • sys.stdin.encodingsys.stdout.encoding입니다.

실습

import sys
#현재 시스템의 인코딩 확인
print(sys.stdin.encoding)
print(sys.stdout.encoding)
#문자열을 바이트코드로 변환
print("한글".encode())
print("한글".encode().decode())
#문자 자체의 코드값
print(ord("a"), ord("한"))

이에 대한 결과

cp949
UTF-8
b'\xed\x95\x9c\xea\xb8\x80'
한글
97 54620

Regular Expression - 정규 표현식

  • 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어
  • RegExp 혹은 RegEx로 표현하기도 합니다.
  • 표현식은 단순하지만 문법은 쉽지 않음
    - 가독성이 떨어짐
  • python에서는 re 모듈을 이용해서 제공
  • 자연어 처리에는 굉장히 중요
  • 입력을 받을 때, 유효성 검사를 수행하는 경우에도 사용
  • HTML5에서는 input 객체들에 pattern이라는 속성을 이용해서 정규 표현식을 설정할 수 있도록 했습니다.

. : 줄 바꿈 문자를 제외한 문자 1개
^ : 문자열의 시작과 매칭, []안에서는 반대 분자열을 의미 되지 않음
$ : 끝나는 문자열, []안에서는 그냥 $
[] : 문자 집합을 의미
| : 또는
() : 정규식을 그룹으로 묶기

메타 문자

* : 0회 이상의 반복
+ : 1회 이상의 반복
? : 0이나 1회 반복
{ㅡ} : M회 반복을 허용
{m,n} : m회부터 n회까지
{m,} : m회 이상

re 객체

  • re 모듈의 match 매서드는 문자열의 시작부터 정규식에 매칭된 경우, match 인스턴스를 반환
  • search 메서드는 부분적으로 일치하는 문자열로 검사
  • 매칭이 되지 않은 경우에는 아무것도 리턴하지 않음

Match 클래스의 메서드

  • group(): 매칭된 문자열 반환
  • groups(): 매칭된 전체 그룹 문자열을 튜플 형식으로 반환
  • start(): 매칭된 문자열의 시작 위치 리턴
  • end(): 매칭된 문자열의 마지막 위치 리턴
  • span: 매칭된 문자열의 (시작, 끝) 위치를 리턴

re 정규식 표현

\\ 백 슬래시 문자
\d 모든 숫자
\D 숫자가 아닌 문자
\s 화이트 스페이스와 매칭
\S 화이트 스페이스가 아닌 문자와 매칭
\w 숫자 또는 문자
\W 숫자 또는 문자가 아닌 것
\b 단어의 경계
\B 단어의 경계가 아님

re 클래스의 메서드

complie(pattern[.flags]): 정규식 인스턴스를 생성
search(pattern, string[. flags])
match(pattern, string[. flags])
split(pattern, string[. maxsplit=0]): pattern을 기준으로 분리
findall(pattern, string): pattern을 만족하는 모든 문자열을 추출
sub(pattern, repl, string[, count=0]): pattern을 찾아서
repl로 치환하는데 count는 치환횟수를 제한

실습

import re
#: 이나 |를 , 로 지환
test="lg:cns | samsung:sds"
result=re.sub("[:,|]",",",test)
print(result)
#유효한이메일인지 검사
p=re.compile('^[a-zA-Z0-9+-\_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
emails=["mhlee5894@gmail.com", "mhle29@jfc.com", "com.@mhlee", "mhlee.com@gmail"]
for email in emails:
    print(p.match(email)!=None)

bytes

  • 바이트의 배열
  • 네트워크 전송이나 파일 입출력 또는 이미지 프로세싱에서 사용
  • 바이트 / 문자 / 인스턴스
  • 송수신 시스템이 같다면 위의 3개 가능, 다르면 바이트?
  • 인코딩을 해주며 바이트 단위로 해준다.
  • b'코드나 문자열' 하면 bytes 입니다.

자료구조

  • 여러 개의 데이터를 저장하는 방법
  • 어떻게 저장할 것인가?

배열(Array) : 데이터를 물리적으로 연속해서 배치합니다.

  • 크기 변경이 불가능 합니다.
  • 그렇기에 삽입, 삭제를 할 때는 복사 작업을 수행합니다.
  • ndarray가 그거야
  • 동적으로 데이터를 변경하고 싶은데? \rarr arraylist, vector

ArrayList(vector,list) : 가변 개별입니다.

  • 동적으로 데이터를 추가할 수 있어요. 반드시 복사하는건 아님
  • list는 맨뒤는 그냥 넣으면 상관이 없지만, 앞에 추가하면 밀어내기를 한 뒤, 집어넣어야 합니다.

LinkedList(연결 리스트) : 논리적인 순서대로 저장합니다.

  • 다음 데이터의 포인터를 가지는 구조입니다.
  • 앞부분 head(bof)가 있으며, 다음데이터의 위치를 기억하는 부분이 존재합니다.
  • 맨 마지막은 tail(eof)이 있습니다.
  • 다음 데이터의 위치까지 기억하기 때문에 메모리 낭비가 생깁니다.
    - 하지만 삽입과 삭제에 매우 유용합니다.

Stack, Queue, Deque

Stack : LIFO(Last in - First out)

  • A(A(A())), 차곡차곡 돌아가도록 합니다.
  • 함수가 stack를 사용합니다.
  • 미로찾기

Queue : FIFO(First in - First out)

  • 재고관리 같은 것을 할 때 사용
  • 스케줄링에 사용합니다.

Deque : 양쪽에서 삽입/삭제 가능

  • 스크롤 하는게 deque입니다.
  • python에는 collections.deque에 있습니다.

list, deque, set, dict 이걸 좀 기억해야해 코테에선

Tree : 부모 자식 관계

  • 실제 트리는 linked list로 표현합니다.
  • 실제 구현은 double linked list 입니다.
  • 부모는 왼쪽 자식에 대한 포인터를, 왼쪽 자식은 형제를 가리키는 포인터를 가집니다.
  • tree에서 할 것 : 순회
    - pre-order
    - post-order
    - in-order
    - 여기에 가중치도 더해진
  • 연산식

Graph : 모든 노드가 동일한 레벨입니다.

  • Tree와 동일하게 순회를 생각해야 합니다.
  • 이때는 최소 비용 신장 트리를 보는 것이 문제였습니다.

코테를 연습한다? : 문제를 보고 어떻게 해결해야 하는지 알아야 한다.

  • 코테를 할 때 set, dict도 잘 알아야 합니다.
  • 해싱을 사용합니다.(위치를 구하는 기법)
  • set, dict는 순서가 없으며 중복이 없습니다.
  • 검색에 있어서는 이 둘을 이길 수 없습니다.
  • 하지만 공간낭비가 많이 심합니다.
  • set은 데이터만 저장하고, dict는 key와 value가 있으며 key가 set으로 되어있음
  • 결국 잘 설치해야 합니다.

코테준비는 자료구조 준비를 먼저 해야합니다.
문자열 set, deque, dict, count, list, ..

이걸 하고 코테 들어가자

list - 코테에서 가장 중요

  • 데이터를 순서대로 저장하는 객체의 집합
  • 내부의 데이터를 변경할 수 있고, 크기 변경도 가능하지만, 중간의 데이터를 삽입하거나 삭제하는 경우에는 속도가 느림

생성

[]
[데이터나열]
list(__iter__ 구현된 인스턴스)

  • 인덱싱과 슬라이싱을 지원함

내부 데이터 삭제

del list[index]
list[시작위치:종료위치]=[]
del list[시작위치:종료위치:간격]

  • list는 데이터의 참조를 저장함

method

append(데이터)
insert(인덱스, 데이터)
index(데이터)
count(값)
reverse()
remove(데이터) : 데이터와 일치하는 첫 번째 데이터를 삭제
pop(인덱스) : 인덱스를 생략하면 마지막 데이터를 삭제하고, 인덱스 설정을 하면 인덱스 번째 데이터를 삭제, stack에서 데이터를 꺼내는 동작이며 push는 stack에 데이터를 삽입하는 동작임
extend(__iter__ 가 구현된 객체)

데이터 정렬

  • list의 sort 함수를 이용하면 Timsort(Merge Sort와 Insertion Sort를 합친 Python 내부 정렬 알고리즘) 알고리즘을 이용해서 데이터를 내부적으로 정렬

  • sorted 함수에 list를 대입하면 정렬한 결과를 리턴

  • key 속성에 데이터 변환을 위한 함수를 대입하면 변환 결과를 가지고 정렬

  • reverse 속성에 True를 대입하면 내림차순 정렬

#list의 메서드 활용
li1=[]
li2=list(range(10))
li3=["hello","world!"]
#data 추가
li1.append("append data")
li3.append("python")
#한 개 데이터 출력
print(li3[2])
#슬라이싱 - 범위를 가지고 추출
print(li3[0:1])
#data 삭제
del li1[0]
print(li1)
#data 순회
for i in li3:
    print(i)
#list 정렬
li=["Hello", "ai", "bravo","zulu", "charli"]
li.sort()#오름차순 정렬
print(li)
li.sort(reverse=True)#내림차순 정렬
print(li)
result=sorted(li)
print(result)
#영문 대소문자 구분없지 정렬
li.sort(key=str.lower)
print(li)

list의 대안

  • 정수나 실수 여러 개를 가지고 리스트를 만들 때는 array가 훨씬 더 효율적입니다.
  • array는 C 언어에서 사용하는 값 타입으로 데이터를 저장하기 때문입니다.
  • python의 int나 float은 "class"입니다.
  • array에 집어넣으면 으로 넣기 때문에 편합니다.
  • 양쪽 끝에 데이터 추가/삭제라면 collections.deque가 효율적
  • numpy나 scipy가 제공하는 고급 배열이나 행렬 연산을 사용하면 과학 계산이 편리해진다.
  • queue 모듈의 Queue, LifoQueue, PriorityQueue를 제공
    - 초기 설정보다 많은 양의 데이터를 삽입하면 block 당함
  • multiprocessing 모듈의 JoinalbeQueue : 프로세스간 통신을 지원하는 큐
  • asyncio : 비동기 프로그래밍(스레드)에 사용하는 큐를 제공
  • heapq : 가변 시퀀스(linked list)를 이용해서 큐를 구현
    queue ~ heapq까진 응용프로그램 제작 시 사용합니다.

Tuple - record

  • 임의 객체들이 순서를 가지는 데이터의 집합
  • 리스트와 유사하고 접근 방법도 동일
  • 내부 데이터의 변경이 불가능
  • 리스트는 데이터 타입에 상관없이 저장이 가능하지만, 실제로는 동일한 데이터 타입만 저장합니다.
  • 튜플은 record(하나의 행)의 개념이므로 데이터 타입에 상관없이 묶어서 하나를 표현하고자 할 때 사용합니다.
  • list는 sort를 하지만 tuple은 sort를 하지 않습니다.
record =("mino", "student", 26) # 튜플 생성
print(record)
print(record[1]) # 인덱싱 가능
#record[0]="mino2" # 수정 불가능
#list와 tuple은 unpacking 가능
name, job, age=record
print(job)
*etc, age=record # *을 이용하면 나머지 모두를 리스트로 생성
# 1개짜리도 *을 받으면 리스트로 만든다.
#swap : 2개의 데이터의 값을 치환하는 것
#python은 정말 쉽다
a=10
b=20
a,b=b,a
print(a,b)

생성

  • (데이터 나열)
  • (하나만,) : 하나만 만들때, 뒤에 콤마를 붙어야함
  • 데이터 나열

list와 tuple은 unpacking 기능을 제공

  • 여러 변수에 데이터를 나누어 저장할 수 있다
  • 데이터의 모임을 만들고자 할 때, 클래스를 이용하지 않고 Tuple을 활용하기도 합니다.
  • VO(Variable Object) : 값으로만 구성된 객체, 데이터를 표현하기 위한 객체
  • DTO(Data Transfer Object) : 데이터 전송에 사용하는 객체로 일반적으로 VO에 Serializable을 구현하면 됩니다.
  • 이를 도메인 객체라고도 합니다.
    - 다른 언어에서는 Structure(구조체)라고도 합니다.
  • 테이블 형태의 데이터 구조를 만들 때, tuple의 list를 이용하는 경우가 있다.
  • 일반 tuple은 각 컬럼에 이름 부여를 할 수 없지aks, collecitons 모듈의 nametuple을 이용하면 컬럼에 이름을 붙일 수 있다.
#테이블 구조의 데이터를 생성
data=[("mino", '010'),("mino2","016")]
#이름만 출력
for row in data:
    print(row[0])
#컬럼에 이름을 사용하는 튜플
from collections import namedtuple
#자료구조 생성 - 튜플의 각 컬럼 이름 만들기
Person=namedtuple("Person",["person_name", "mobile"])
#그냥 "person", "a b" 이렇게 넣어도 상관은 없다.
Persons=[Person("mino","010"),Person("mino2","016")]
for person in Persons :
    print(person.person_name)

Set

  • 데이터의 순서와 상관없이 해싱을 이용해서 데이터를 저장하는 클래스
  • 해싱을 이용하기 떄문에 중복된 데이터는 저장하지 않습니다.
  • 실제로 아주 미세한 확률로 중복되지 않는 데이터도 저장되지 않을 수 있습니다.

생성

  • {데이터 나열}
  • set(__iter__ 가 구현된 객체)
  • 비어있는 set을 만들 때는 {}는 안되고 set()으로 만들어야 합니다.
    - {}는 비어있는 dict가 생성됩니다.

집합 연산을 위한 메서드가 제공됩니다.

  • union, intersection, difference, symmetric_difference와 update, intersaction_update등

  • 데이터의 존재 여부를 확인하는 경우에는 가장 빠른 자료구조입니다.
s={"mino", "mino2","mino2","mino3"}
print(s) #순서가 조금 다른데? 순서는 알 수 가 없다.
#순서와는 큰 상관이 없다.
s.add("mino4")
print(s)
for d in s: 
    print(d)#얘도 어떤 순서로 나올지 모른다.

dict

  • key와 value를 쌍으로 저장하는 자료구조
  • 이 때, key가 set으로 만들어집니다.

생성

  • {key:value, key:value...}
  • key의 자료형은 아무것이나 가능하지만, 특별한 경우가 아니면 str

데이터 가져오기

  • dict이름[key] : 키가 존재하지 않으면 KeyError
  • dict이름.get(key,default) : 키가 존재하지 않으면 기본값, get으로 끄집어내자. 중요하다
  • for을 이용해서 순회하면 key값이 순서대로 대입됩니다.
  • keys(), values(), items()를 이용해서 key, value, (key, value) 목록을 가져올 수 있습니다.
  • del 딕셔너리이름[key]로 키 값을 삭제할 수 있습니다.
  • clear()를 하면 전체 삭제입니다.
  • dict는 데이터를 삽입하거나 삭제, 조회할 때 시간복잡도가 O(1)*입니다. (엄청 빠르네)
  • 메모리 낭비가 심합니다.
#dict 생성
dic={}
#dict 데이터 추가(upsert)
dic["name"]="mino"
dic["job"]="student"
dic["age"]=26
dic["age"]=24 #이걸로 다시 덮어씌움
print(dic)
print(dic["score"])#없는 키가 들어오면 KeyError
print(dic.get("score",0))#KeyError가 아닌 기본값 리턴
#순회하기
for key in dic:
    print(key, dic[key])
#dict를 이용한 MVC
#DTO 역할을 수행하는 클래스 생성 - 최근에는 더 권장
#map을 이용하는게 더 좋을 때도 있기는 함
class DTO:
    def __init__(self, name="noname", tel="전화없음"):
        self.name=name
        self.tel=tel
#데이터 목록 생성
data=[DTO("mino","010"), DTO("mino2","016")]
#이름과 전화번호 출력
for d in data:
    print(d.name, d.tel) 
    #이렇게 한다면 위에 def 부분에서 달라지면 여기도 바꿔야해
    #아니면 에러가 나는걸
#dict 목록 생성
data=[{"name":"mino", "tel":"010"},
{"name":"mino2","tel":"016"}]
for d in data:
    for key in d:
        print(key,":" ,d[key])
#dict로 했다면 키값을 바꿔도 에러가 안나지 왜냐?
#키 이름을 쓰진 않았기 때문이다.
#근데 dict하면 코드셋 안보여서 프로그래밍하기 어려워짐
  • 이차원 배열 대신에 dict를 사용합시다.
#이차원 배열 대신에 dict 사용
babamba=["ba","bamba"]
banana=["ba","nana"]
apple=["ap","ple"]
#mine=[babamba,banana,apple]#list의 list
#이거 매우 별로다.
#list는 인덱스를 통해 접근하고, dict는 key를 통해 접근한다.
#for my in mine:
    #이렇게 쓰면 바밤바랑 바나나는 못쓴다.
for idx, my in enumerate(mine):
# enumerate는 인덱스와 데이터를 튜플로 리턴합니다.
    if idx==0:
        print("바밤바", end='\t')
    else:
        print("바나나", end='\t')
    for word in my:
        print(word, end='\t')
#여기서 my가 늘어나면 문제가 발생함
#인덱스가 변화하게 된다면 어려워진다.
mine=[{"name":"바밤바","data":babamba},
{"name":"바나나","data":banana},{"name":"사과","data":apple}]
for dic in mine:
    print(dic.get("name"),end=":")
    for word in dic.get("data"):
        print(word,end='\t')
    print()

list comprehension

  • 반복 가능한 객체를 이용해서 새로운 반복 가능한
  • map, filter, reduce
li=list(range(10))
#li의 모든 데이터를 제곱한 list를 생성
result=[]
#일반 반복문
# for i in li:
#     result.append(i*i)
#map 함수를 이용해보자
result=list(map(lambda i : i*i,li))
print(result)
#list comprehension
#[연산식 순회할문장]
result=[i*i for i in li]
print(result)
#for 2r개 사용하기
li1=[1,2,3]
li2=[4,5,6]
result1=[x*y for x in li1 for y in li2]
print(result1)
#for 와 if 사용 가능 - filtering
singers=["윤하","아이유","태연","다린"]
#글자 수가 2인 데이터만 추출
result=list(filter(lambda x:len(x)==2, singers))
#위에 필터가 더 느리다.
#함수는 항상 별도의 메모리 공간을 받아서 작업을 수행하고
#돌아와야 한다.
print(result)
result1=[x for x in singers if len(x)==2]
print(result1)
#윤하만 골라내보자.
result_Y=[x for x in singers if len(x)==2 and x>"아" and x<"타"]
#조건을 길게   있다.
print(result_Y)
#if-else for 활용
#3글자 이상은 그대로, 나머지는 _를 추가
result_T=[x if len(x)>=3 else x+"_" for x in singers]
print(result_T)

함수를 안만든 list comprehension으로 한 것이 더 빠르다.
이거 진짜진짜진짜진짜 연습 많이 해야합니다.

✔ Python에서 제공하는 모듈 중 코테 보는데 필요한 모듈

queue

  • queue와 stack을 제공하는 모듈
  • queue.Queue(maxsize) : 큐를 생성
  • queue.LifoQueue(maxsize) : 스택을 생성
  • queue.PriorityQueue(maxsize) : 우선 순위 큐를 생성
  • maxsize 이상의 데이터를 넣으면 blocking이 됩니다.
    - 데이터를 사용할 때 까지 대기합니다.
  • priorityqueue는 데이터를 삽입할 때, (순위,아이템) 형태로 삽입되어야 합니다.
    - 순위가 낮은 것이 우선 순위가 높은 것입니다.
  • get, put method를 이용해서 읽고 쓰기를 수행할 수 있습니다.

collections

  • dequeue와 counter가 유용합니다.
  • Counter 객체는 dict형태로 데이터를 저장하고 있어서, 개수를 세거나 상위 순위의 데이터를 추출하는데 유용합니다.
  • dict형태로 저장하는 것을 생각해두자
    - 개수를 세는 작업 : wordcloud
from collections import Counter
data=["한식","한식","중식","양식","일식","양식","한식"]
counter=Counter(data)
print(dict(counter))
#한가지 데이터 파악
print(counter["한식"])
#상위 2개만 추출해보자.
print(counter.most_common(2))

{'한식': 3, '중식': 1, '양식': 2, '일식': 1}
3
[('한식', 3), ('양식', 2)]

#튜플의 목록
data=[("Apple",3),("Apple",2),("Apple",1),("Orange",1),
("Banana",6),("Orange",3)]
counter=Counter()
#구조를 분해해야겠는걸?
#데이터가 등장한 합계 구하기
for name, count in data:
    counter[name]+=count
print(counter)
#데이터가 등장한 횟수를 구해보기
counter=Counter()
for name, count in data:
    counter[name]+=1
print(counter)

Counter({'Apple': 6, 'Banana': 6, 'Orange': 4})
Counter({'Apple': 3, 'Orange': 2, 'Banana': 1})

itertools

  • 효율적인 looping을 위한 이터레이터를 만드는 함수들의 패키지
  • 조합형 이터레이터 함수가 코테에 좋습니다.

조합형 이터레이터 함수

  • combinations(iterable, r) :
    - iterable에서 원소 개수가 r개인 조합 뽑기
  • combinations_with_replacement(iterable,r):
    - iterable에서 원소 개수가 r개인 중복 조합뽑기
  • product(*iterables, repeat=1):
    - 여러 iterable의 데카르트곱 리턴
  • permutations(iterable,r=None):
    - iterable에서 원소 개수가 r개인 순열 뽑기

https://docs.python.org/ko/3/library/itertools.html
이거 보고 좀 공부를 하자.

✔ Exception Handling - 예외처리

오류

오류의 종류

  • 컴파일 오류
    - 문법적인 오류로 실행이 되지 않는 오류
  • 예외(Exception)
    - 문법적 오류는 없어서 실행이 되지만, 실행 도중 멈추는 현상
  • 논리적 오류
    - 문법적 오류나 예외가 없어 실행이 잘 되지만, 결과가 이상한 경우
  • 단언(assertion)
    - 의도적으로 오류를 발생시켜서 프로그램을 중단시키는 것

오류 발생 시 조치

  • 컴파일 오류는 실행이 안되므로 에러를 직접 찾아서 수정해야 함
    - 대부분의 IDE는 컴파일 오류일 시, 알려줍니다.
  • 예외는 수정할 수 있으면 수정을 하고 그렇지 않으면 예외 처리를 수행
  • 논리적 오류는 알고리즘 문제이므로 디버깅을 통해서 설정
  • Assertion은 실제 오류는 아닙니다.

Debugging

  • 예외나 논리적인 오류를 찾아서 해결하기 위해서 수행하는 동작
  • 수행 방식
    - IDE가 제공해주는 디버깅 툴을 이용해서 메모리를 확인
    - 로그를 출력해서 직접 확인하는 방법
    - Test Tool을 이용

예외 처리

예외 처리의 목적

  • 예외가 발생하더라도 프로그램을 정상적으로 동작시키기 위한 것
  • 예외 내용을 로깅 - 예외 문제를 확인해 볼 수 있습니다.
    - 학습용으로 특히 좋다네요

기본적인 예외 처리 구문

def div(x):
    return 10/x
print(div(20))
print(div(0))
print("프로그램 종료")

이러면 예외가 발생해서 중간에 프로그램이 중단됨

try: 
	예외가 발생할 가능성이 있는 구문
except : 
	예외가 발생했을 때 수행할 구문
def div(x):
    return 10/x
try: 
	print(div(20))
	print(div(0))
except : 
	print("예외 발생!")
print("프로그램 종료")

이렇게 한다면 예외가 발생해도 프로그램이 멈추지 않습니다.

  • 크롤링을 할 때, 데이터의 링크를 찾아가다 보면 데이터의 링크는 있지만, 데이터가 없는 경우가 발생할 수 있는데, 그런 경우에는 예외처리를 하지 않으면 크롤링 도주에 종료되어버릴 수 있기 때문에 예외 처리 구문을 사용해서 링크는 있는데 데이터가 삭제된 경우에는 다음 데이터를 수집할 수 있도록 만들어 주는 것이 좋습니다.

  • python에서는 while for 다음에 else를 적을 수 있음, 이는 반복문이 정삭적으로 수행되었을 때 적을 수 있다는 것임 이것으로 예외발생을 확인할 수 있음

  • 반드시 try-except를 할 때가 있어요.
    - 내가 만들지 않은 자원을 사용할 때
    - 내가 만들지 않았기에 있는지 없는지 보장을 못함
    - file-handling : 생성, 읽기 권한 os가 가짐
    - network : 다른 컴퓨터가 켜져있는지 모름
    - db : db 서버는 별도로 둡니다. (결국 이것도 네트워크)

profile
밀가루 귀여워요

0개의 댓글