본문 바로가기

Diary/TIL

2024-05-31) 인공지능 기초 다지기 2-4,5강

본격적으로 강의를 듣기 시작했다.

2-4강

객체 지향 프로그래밍

줄여서 OOP, 객체 지향 프로그래밍은 객체와 클래스 중심의 설계를 한다.

대표적인 언어는 java, c++, c#, 그리고 python이 이에 해당된다.

중요한 것은 만들어 놓은 코드를 재사용하는 것!

 

class

__init__ 객체 초기화 예약 함수

__는 특수한 예약 함수나 변수, 그리고 함수명 변경으로 사용

예) __main__, __add__, __str__, __eq__

 

class의 매서드의 경우 반드시 self를 추가해야 class의 함수로 인정된다.

 

OOP의 속성들

상속, 다형성, 가시성?

상속: 부모클래스부터 속성과 method를 물려받은 자식 클래스를 생성하는 것

다형성: 메서드 이름이 똑같아도, 입력 변수의 자료형이 다르면 다른 메서드로 사용된다.

가시성: 객체의 정보를 제한하는 것(원하는 것만 보이게 하는 것, 주민번호와 같은 데이터들을 은닉)

class Product(object):
	pass
class Inventory(object):
	def __init__(self):
    	self.__items = []

__으로 private 변수 선언하면 타 객체가 접근할 수 없다. (직접 값 삽입 불가능)

 

@property

함수긴 한데, 함수명을 변수명처럼 사용 가능

copy를 시켜주어 원본값이 변경되지 않도록 반환

 

decorate java의 annotation과 비슷하다.

 

모듈과 패키지

import 모듈을 호출할 수 있다.

from 모듈 import 특정메서드

 

Built-in Modules

파이썬이 기본으로 제공하는 라이브러리

별다른 조치 없이 import문으로 사용 가능 (ex) random, time, urllib.request)

 

패키지

하나의 대형 프로젝트를 만드는 코드의 묶음

기능들을 세부적으로 나눠서 폴더로 만든다.

폴더별로 필요한 모듈 구현

폴더별로 __init__. py 구성하기

__main__. py 파일 생성

 

파이썬 가상환경

virtualenv와 conda

virtualenv + pip

가장 대표적인 가상환경 관리 도구

레퍼런스 + 패키지 개수

conda

상용 가상환경 도구

miniconda 기본 도구

설치의 용이성, windows에서 장점 가진다.

 

권장하는 패키지

windows에서는 conda,

linux or mac에서는 conda or pip

 

왜냐하면 conda는 컴파일된 c 라이브러리를 같이 설치해 주기 때문

tqdm 라이브러리 : 코드 진행상황 확인에 용이한 툴. 반드시 기억해 두자.(iteration 별 실행시간)

 

2-5강 Exception/File/Log Handling

프로그램을 사용할 때 일어나는 오류들

- 주소를 입력하지 않고 배송 요청

- 저장을 안 했는데 컴퓨터 전원이 나감

- 게임 아이템 샀는데 게임에서 튕김

=> 예상치 못한 예외들이 많이 생기게 된다.

 

Exception

1) 예상 가능한 예외

2) 예상이 불가능한 예외

 

예상 가능한 예외

- 발생 여부를 사전에 인지할 수 있는 예외

- 사용자의 잘못된 입력, 파일 호출 시 파일 없음

- 개발자가 반드시 명시적으로 정의해야 함

 

예상 불가능한 예외

- 인터프리터 과정에서 발생하는 예외, 개발자 실수

- 리스트의 범위를 넘어가는 값 호출, 정수 0으로 나눔

- 수행 불가시 인터프리터가 자동 호출

 

-예외가 발생할 경우 후속 조치 등 대처 필요

1) 없는 파일 호출 -> 파일 없음을 알림

2) 게임 이상 종료 -> 게임 정보 저장

프로그램 = 제품, 모든 잘못된 상황에 대처가 필요하다.

이 개념을 Exception Handling이라고 한다.

 

파이썬의 예외 처리

- try ~ except 문법

try:
	예외 발생 가능 코드
except <Exception Type>:
	예외 발생 시 대응하는 코드

 

exception 종류

IndexError: List의 Index 범위를 넘어갈 때

NameError: 존재하지 않은 변수를 호출할 때

ZeroDivisionError: 0으로 숫자를 나눌 때

ValueError : 변환할 수 없는 문자/숫자를 변환할 때

FileNotFoundError : 존재하지 않는 파일 호출

 

파이썬의 예외처리 예시

예외 정보 표시 방법

for i in range(10)
	try:
    	print(10/i)
    except ZeroDivisionError as e:
    	print(e)
        print("Not divided by 0")

-try ~except ~else

try:
	예외 발생 가능 코드
except <Exception Type>:
	예외 발생시 동작하는 코드
else:
	예외가 발생하지 않을 때 동작하는 코드

else 구문 예시

for i in range(10):
	try:
    	result = 10/i
    except ZeroDivisionError as e:
    	print(e)
        print("Cannot be devided by 0")
    else:
    	print(10/i)

-try ~except~finally

try:
	예외 발생 가능 코드
except <Exception Type>:
	예외 발생시 동작하는 코드
finally:
	예외 발생 여부와 상관없이 실행됨

구문 예시

for i in range(10):
	try:
    	print(10/i)
    except ZeroDivisionError as e:
    	print(e)
    finally:
    	print("루프가 종료되었습니다.)

raise : 강제로 exception을 발생 사전에 에러가 발생하는 것을 방지하기 위해서 사용

while True:
    value = input()
    for digit in value:
    	if digit not in "0123456789":
        	raise ValueError("숫자값을 입력하지 않았습니다.")

assert: 특정 조건에 만족하지 않을 경우 예외 발생

def get_binary_number(decimal_number : int):
    assert isinstance(decimal_number, int)
    return bin(decimal_numbe)

뒤에 오는 값이 False 면 AssertionError 발생

 

File Handling

OS에서 파일을 저장하는 트리구조 저장 체계

가장 기본적인 정보단위를 가지고 있다.

기본적인 파일 종류로는 txt파일과 binary 파일 존재

text 파일이라는 것은 기본적으로 인간도 이해가능한 문자열 형식으로 저장된 파일(메모장으로 열리면 text 파일)

binary파일은 컴퓨터만 이해할 수 있는 이진형식으로 저장된 파일, 메모장으로 열면 깨져 보인다.(엑셀, 워드 파일 등)

일반적으로 컴퓨터는 text 파일을 binary 파일로 변환하여 저장, ASCII나 UNICODE와 같은 표준에 맞춰서 저장을 하게 됨

 

파이썬은 파일 처리를 위해 "open" 키워드를 사용함

f = open("<파일 이름>", "접근 모드")
f.close()

 

접근 모드 r, w, a

r은 읽기, w는 쓰기, a는 추가 모드

 

f 대신에 with 구문이랑 같이 사용 가능

with open("i_have_a_dream.txt", "r") as my_file:
	contents = my_file.read()
    print (type(contents), contents))

 

각각의 선호에 따라 다르게 사용

with open("", "r") as my_file:
	content_list = my_file.readlines()
    # my_file의 모든 줄을 리스트로 변환
    
with open("", "r") as my_file:
	while True:
		line = myfile.readline()
		if not line:
        	break

readlines()는 모든 줄을 한 번에 list로 변환

readline()은 한 줄씩 읽어오기

split(" ")은 띄어쓰기 기준으로 단어를 분리한 리스트로 반환

split("\n")은 줄 바꿈 기준으로 줄을 분리한 리스트로 반환

 

파이썬의 File write의 경우

mode: 'w', 'a'

encoding = "utf8"

다시 한번 f.open("", 'w' or 'a', encoding = "utf8") 하면 f.close()도 해야 됨

with open("", 'w' or 'a', encoding = "utf8")하면 인덴테이션 없을 시 자동으로 종료됨

 

파이썬에서의 디렉터리

import os

os.mkdir("log")

if not os.path.isdir("log")

os.mkdir("log")

pathlib으로 path를 객체로 다룬다.

import pathlib

cwd = pathlib.Path.cwd()

cwd.parent, cwd.glob

pickle으로 파이썬의 객체를 영속화한다. 데이터 object 등 실행 중 정보를 저장 후 불러와서 사용

 

로깅

import loggin으로 사용가능

DEBUG> INFO> WARINING> ERROR> Critical

 

컴파일 시에 기본 설정이 필요한 경우 존재

configparser - 파일에서 불러오기

argparser - 실행할 때 직접 설정해 주기 ex) python3 example.py --v

 

로깅 포맷 지정

formatter = logging.Formatter('%(asctime)s %(levelname)s %(process)d %(message)s')

 

로깅 파일 설정에 대한 내용도 있었다. 하지만 일단 배제했다. 나중에 직접 코드를 작성하면서 확인 가능하다고 생각했기 때문이다.