junh0328/TIL

[20211020] 제로베이스 알고리즘 자료구조 51일 대비반 DAY 08

junh0328 opened this issue · 0 comments

2021.10.20, day 08

모듈, 패키지

  • 패키지 설정
  • 모듈 사용 및 Alias(= as) 설정
  • 패키지 사용 장점
# 파이썬 모듈과 패키지

# 모듈 - 미리 구성해놓은 함수, 프로퍼티들을 재사용하기 위해 모아놓는 파일 단위
# 패키지 - 모듈들의 모음

# 패키지 예제

# 상대 경로
# .. : 부모 디렉토리
# . : 현재 디렉토리

# 사용1, 클래스 형태 내부에 함수가 있을 때


import builtins
import math_pkg.prints as p
from math_pkg.fibonaccit import Fibonacci
from math_pkg.fibonaccit import Fibonacci as fb
import math_pkg.calculations as c
from math_pkg.calculations import div as d

print("ex1 :", end='')
Fibonacci.fibo(300)

print()

print("ex2 :", Fibonacci.fibo2(400))
print("ex2 :", Fibonacci().title)

# 사용2, (클래스), * 로 모듈의 기능 전체를 가져오기, 권장 x, 메모리를 많이 먹는다

# from math_pkg.fibonaccit import *

print()

# 사용3, (클래스) alias 주기 (as = alias)
# 가독성을 위해 as 를 통해 import 하는 클래스의 이름을 줄임말로 사용할 수 있다

# from math_pkg.fibonaccit import Fibonacci as fb (린팅에 의해 위로 올라가기 때문에 주석처리)

print("ex3 :", fb.fibo2(400))
print("ex3 :", fb().title)

print()

# 사용4, (함수)
# 모듈 전체 불러오기 + alias 사용하기

# import math_pkg.calculations as c

print("ex4 :", c.add(10, 20))
print("ex4 :", c.mul(10, 20))
print("ex4 :", c.div(10, 20))

print()

# 사용5, (함수)
# 일부만 불러오기

# from math_pkg.calculations import div as d

print("ex5 :", int(d(100, 10)))

print()

# 사용6

# import math_pkg.prints as p

p.print1()
p.print2()

# 빌트인 내장 모듈 보기
print(dir(builtins))

파일 Read, Write

  • Open 함수
  • 파일 모드의 이해
  • 파일 읽기 실습
  • 파일 쓰기 실습
# 파일 읽기, 쓰기

# 읽기 모드 : r(read)
# 쓰기 모드(기존 파일 삭제 후 덮어 쓰기) : w(write)
# 추가 모드(파일 생성 또는 추가) : a(append)

# .. : 상대경로,
# . : 절대 경로
# 기타 : https://docs.python.org/3.7/library/functions.html#open

# 파일 읽기
# 예제 1

from random import randint

f = open('./resource/review.txt', 'r')
content = f.read()
print(content)

print()
# f 변수에 할당된 인스턴스를 볼 수 있다
print(dir(f))

print()
# 반드시 close로 리소스를 반환해야 한다
f.close()

# 예제 2 (with 문 사용)
# with 문 사용 시, close()를 사용하지 않아도 요청이 종료된다

with open('./resource/review.txt', 'r') as f:
    c = f.read()
    print(c)
    print(list(c))
    # print(iter(c))

print()

# 예제 3
with open('./resource/review.txt', 'r') as f:
    for c in f:
        print(c.strip())

print()
print()

# 예제 4
with open('./resource/review.txt', 'r') as f:
    content = f.read()
    print('>>> ', content)

    # 문서를 읽는 커서가 제일 밑으로 온 경우 더 이상 가져오지 않는다 (빈 내용을 가져온다)
    # 따라서 내용이 없다
    content = f.read()
    print('>>> ', content)

print()
print()

# 예제 5 (한 문장 단위로 읽어 올 때)
with open('./resource/review.txt', 'r') as f:
    line = f.readline()
    while line:
        print(line, end=' #### ')
        line = f.readline()

print()
print()

# 예제 6
with open('./resource/review.txt', 'r') as f:
    contents = f.readlines()
    print(contents)
    for c in contents:
        print(c, end=' ****** ')

print()
print()

# 예제 7
score = []
with open('./resource/score.txt', 'r') as f:
    for line in f:
        score.append(int(line))
    print(score)

print('avg :{:6.3}'.format(sum(score)/len(score)))


print()
print()

# 파일 쓰기

# 예제 1 'w'
with open('./resource/test1.txt', 'w') as f:
    f.write('Nice man!\n')

# 예제 2 'a'
with open('./resource/test1.txt', 'a') as f:
    f.write('good man!\n')

# 예제 3

# from random import randint 랜덤 인트 만들기

with open('./resource/test2.txt', 'w') as f:
    for cnt in range(7):
        f.write(str(randint(1, 50)))
        f.write('\n')

# 예제 4

# readlines : 리스트형태로 파일을 읽어오는 형태
# writelines : 리스트 -> 파일로 저장하는 형태
with open('./resource/test3.txt', 'w') as f:
    list = ['kim\n', 'park\n', 'lee\n']
    f.writelines(list)

# 예제 5

# 프린트 문으로 파일에 직접 문자열 적어주기
with open('./resource/test4.txt', 'w') as f:
    print('test Contents1!', file=f)
    print('test Contents2!', file=f)

다양한 Exceptions

  • 파이썬 예외 종류
  • 문법적 에러 발생 실습
  • 런타임 에러 발생 실습
  • Try-except-else-finally
# Section10
# 파이썬 예외처리의 이해

# 예외 종류
# 문법적으로 에러가 없지만, 코드 실행(런타임) 프로세스에서 발생하는 예외 처리도 중요하다
# linter : 코드 스타일, 문법 체크

# ① SyntaxError (문법 에러) : 잘못된 문법

# print('Test)
# SyntaxError: unterminated string literal (detected at line 10)

# if True >>> SyntaxError: expected ':'
#  pass
# x => y

# ② NameError : 참조 변수가 없을 때 생기는 에러

import time

a = 10
b = 15

# print(c)
# NameError: name 'c' is not defined

# ③ ZeroDivisionError : 0 나누기 에러

# print(10 / 0)
# ZeroDivisionError: division by zero

# ④ IndexError : 인덱스 범위가 오버(넘쳤을)됐을 때

x = [10, 20, 30]
print(x[0])
# print(x[3]) >>> IndexError: list index out of range

# ⑤ KeyError (Dictionaries에 Key가 없을 때)

dic = {'name': 'Kim', 'Age': 33, 'city': 'Seoul'}
# print(dic['hobby']) >>> KeyError: 'hobby'

print(dic.get('hobby'))  # >>> None

# ⑥ AttributeError : 모듈, 클래스에 있는 잘못된 속성 사용시에 예외

# import time

print(time.time())
# print(time.month()) >>> AttributeError: module 'time' has no attribute 'month'

# ⑦ valueError : 참조 값이 없을 때 발생

x = [1, 5, 9]

# x.remove(10)  >>> ValueError: list.remove(x): x not in list
# x.index(10)

# ⓼ FileNotFoundError 경로를 찾을 수 없을 때

# f = open('test.txt', 'r') >>> FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

# ⑨ TypeError

x = [1, 2]
y = (3, 4, 5)
z = 'test'

# print(x + y) >>> TypeError: can only concatenate list (not "tuple") to list
# print(x + z)

# 따라서 형 변환이 필요하다
print(x + list(y))

# 항상 예외가 발새앟지 않을 것으로 가정하고 먼저 코딩을 해야 한다!
# 그 후 런타임 예외 발생시 예외 처리 코딩하는 단계를 권장한다(EAFP 코딩 스타일)

# 예외 처리 기본
# try : 에러가 발생할 가능성이 있는 코드 실행
# except : 에러명 1
# except : 에러명 2
# else : 에러가 발생하지 않았을 경우 실행
# finally : 항상 실행

# 예제 1

# name = ['kim', 'lee', 'park']

# try:
#     z = 'kim'
#     # z = 'shin'
#     x = name.index(z)
#     print('{} Found it! in name'.format(z, x+1))
# except ValueError:
#     print('Not Found it! - Occured valueError! ')
# else:
#     print('Ok! else!')

print()

# 예제 2

name = ['kim', 'lee', 'park']

try:
    z = 'kim'
    # z = 'shin'
    x = name.index(z)
    print('{} Found it! in name'.format(z, x+1))
except:  # Error 의 종류를 적지 않으면 모든 Error가 해당 except로 들어온다
    print('Not Found it! - Occured valueError! ')
else:
    print('Ok! else!')